diff --git a/Procfile b/Procfile index 17919615..412a5d7e 100644 --- a/Procfile +++ b/Procfile @@ -3,3 +3,4 @@ faye: thin start -R faye/config.ru -p 9296 #faye: rackup faye.ru -s thin -E production counters: bin/drb_counter.rb run database: echo "BuenosAires" | sudo -S couchdb start | ~/bin/couch_output +server: rails s diff --git a/app/assets/images/scan-logo.png b/app/assets/images/scan-logo.png index e0ea91c1..9df27448 100644 Binary files a/app/assets/images/scan-logo.png and b/app/assets/images/scan-logo.png differ diff --git a/app/assets/javascripts/shared-ember-helpers/time.js.coffee b/app/assets/javascripts/shared-ember-helpers/time.js.coffee index c5bdd8ed..aa9b988e 100644 --- a/app/assets/javascripts/shared-ember-helpers/time.js.coffee +++ b/app/assets/javascripts/shared-ember-helpers/time.js.coffee @@ -2,5 +2,5 @@ Ember.Handlebars.helper 'time', (time, params..., options = {})-> return '' unless time time = new Date(time) if typeof(time) is "string" iso = time.toISOString() - tag = if options.bare then iso else $("").text(moment(iso).format(options.format || 'dd D MMM HH:MM')).get(0).outerHTML + tag = if options.bare then iso else $("").text(moment(iso).format(options.format || 'dd D MMM HH:mm')).get(0).outerHTML new Handlebars.SafeString tag diff --git a/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee index cebe4f59..b2f73845 100644 --- a/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee @@ -1,11 +1,14 @@ Qsupplier.App.IndexController = Ember.ObjectController.extend needs: ['application'] + lists: (-> @store.all('list')).property() + orders: (-> @store.all('order')).property() + sections: (-> @store.all('section')).property() active_lists: (-> - if @get('active_section.id') - @get('lists').filter (l)=>( l.get('section.id') == @get('active_section.id') && l.get('state') == 'active' ) + if @get('controllers.application.active_section.id') + @get('lists').filter (l)=>( l.get('section.id') == @get('controllers.application.active_section.id') && l.get('state') == 'active' ) else @get('lists').filterProperty('state', 'active') - ).property('lists.@each.state', 'active_section.id') + ).property('lists.@each.state', 'controllers.application.active_section.id') active_section: (-> @get('controllers.application.active_section')).property('controllers.application.active_section') active_orders: (-> diff --git a/app/assets/javascripts/supplier/app/controllers/lists_index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/lists_index_controller.js.coffee index 55ffee61..cd3c5ed7 100644 --- a/app/assets/javascripts/supplier/app/controllers/lists_index_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/lists_index_controller.js.coffee @@ -6,4 +6,15 @@ Qsupplier.App.ListsIndexController = Ember.ArrayController.extend lists.then => @set('loading', false) @set 'model', lists ).observes('date') - lists: (-> @get('model')).property('model') + lists: (-> + return @store.all('list') unless date = @get('date') + @store.filter('list', (l)-> + return false unless list_date = l.get('created_at') + list_date = list_date.toISOString().substring(0,10) if typeof(list_date) is 'object' + list_date == date + ) + ).property('date') + + sorted_lists: (-> + @get('lists').sortBy('created_at').reverseObjects() + ).property('lists.@each') diff --git a/app/assets/javascripts/supplier/app/controllers/modal_close_list_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/modal_close_list_controller.js.coffee index 41c48164..fc86457e 100644 --- a/app/assets/javascripts/supplier/app/controllers/modal_close_list_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/modal_close_list_controller.js.coffee @@ -3,5 +3,5 @@ Qsupplier.App.ModalCloseListController = Ember.ObjectController.extend close: -> @send 'closeModal' confirm: -> - @get('model').close() + @get('model').then (l)->l.close() @send 'closeModal' diff --git a/app/assets/javascripts/supplier/app/controllers/sections_index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/sections_index_controller.js.coffee index 33c3a1bd..86641e64 100644 --- a/app/assets/javascripts/supplier/app/controllers/sections_index_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/sections_index_controller.js.coffee @@ -10,8 +10,8 @@ Qsupplier.App.SectionsIndexController = Ember.ArrayController.extend Routes.qr_codes_suppliers_tables_path section_id: section_id actions: showDashboardOrders: (section)-> - @transitionToRoute('index').then => - @get('controllers.index').set 'active_section', section + @set 'controllers.application.active_section', section + @transitionToRoute('index') addSection: -> @send 'openModal', 'modal_add_section', @get('model') goToSection: (section)-> @set 'controllers.application.active_section', section diff --git a/app/assets/javascripts/supplier/app/models/list.js.coffee b/app/assets/javascripts/supplier/app/models/list.js.coffee index 50782143..dad72152 100644 --- a/app/assets/javascripts/supplier/app/models/list.js.coffee +++ b/app/assets/javascripts/supplier/app/models/list.js.coffee @@ -11,7 +11,7 @@ Qsupplier.App.List = DS.Model.extend price: attr 'number' closed_at: DS.attr('date') #table_number: attr 'number' - table: DS.belongsTo('table', inverse: 'active_list') + table: DS.belongsTo('table', inverse: 'active_list', async: true) #users: DS.hasMany('user', inverse: 'active_list') orders: DS.hasMany('order') section: DS.belongsTo('section') diff --git a/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee b/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee index 3bff9128..8d429a73 100644 --- a/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee +++ b/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee @@ -4,6 +4,7 @@ DS.Model.reopen eraseRecord: -> @clearRelationships() @transitionTo('deleted.saved') + then: (callback) -> callback.call(@, @) DS.Model.reopenClass findCached: (id)-> return null unless id @@ -61,6 +62,6 @@ DS.Model.reopenClass #for record, i in records ##console.log "Setting relation #{relation.name} to #{record.get('id')}" #new_record.set association_names[i], record - #attributes[relation.name] = + #attributes[relation.name] = #delete attributes["#{relation.name}_id"] #@createRecord attributes diff --git a/app/assets/javascripts/supplier/app/router.js.coffee b/app/assets/javascripts/supplier/app/router.js.coffee index fbf0fe9b..34183c0e 100644 --- a/app/assets/javascripts/supplier/app/router.js.coffee +++ b/app/assets/javascripts/supplier/app/router.js.coffee @@ -13,4 +13,5 @@ Qsupplier.App.Router.map -> @resource 'lists', -> @resource 'list', path: ':list_id' @route 'settings' + @route 'empty' #@resource 'lists', queryParams: ['state'] diff --git a/app/assets/javascripts/supplier/app/routes/application_route.js.coffee b/app/assets/javascripts/supplier/app/routes/application_route.js.coffee index 0280b5d7..93bf3020 100644 --- a/app/assets/javascripts/supplier/app/routes/application_route.js.coffee +++ b/app/assets/javascripts/supplier/app/routes/application_route.js.coffee @@ -1,17 +1,20 @@ Qsupplier.App.ApplicationRoute = Ember.Route.extend beforeModel: -> # Preload only active lists and orders - @store.find 'product_category' + @supplier = @store.push 'supplier', supplier_object + @product_categories = @store.find 'product_category' + @sections = @store.find 'section' + Ember.RSVP.all([@product_categories, @sections]).then (results)=> + @store.find('list', state: 'active').then (lists) -> lists.invoke('get', 'table') + @lists = @store.all 'list' + # product_categories = controller.set 'product_categories', @store.all('product_category') #@store.find 'order', state: 'active' included in list setupController: (controller)-> + controller.set 'supplier', @supplier # @set 'supplier', @store.find('supplier', supplier_id) - supplier = @store.push 'supplier', supplier_object - controller.set 'supplier', supplier + controller.set 'sections', @sections + controller.set 'product_categories', @product_categories - @store.find 'list', state: 'active' - @store.find 'section' - - controller.set 'product_categories', @store.all('product_category') actions: openModal: (modalName, model, options={})-> controller_name = options.controller || modalName diff --git a/app/assets/javascripts/supplier/app/routes/index_route.js.coffee b/app/assets/javascripts/supplier/app/routes/index_route.js.coffee index 6c56f5ed..7f9da9fb 100644 --- a/app/assets/javascripts/supplier/app/routes/index_route.js.coffee +++ b/app/assets/javascripts/supplier/app/routes/index_route.js.coffee @@ -1,22 +1,22 @@ -Qsupplier.App.IndexRoute = Ember.Route.extend - model: (params, queryParams)-> - Ember.Object.create - # Find with condition does not work since the resulting array promise is not updated for newly created records - #lists: Qsupplier.App.List.find({state: 'active'}) - #orders: Qsupplier.App.Order.find({state: 'active'}) - #lists: @store.filter 'list', (l)-> l.get('state') == 'active' # DOES NOT WORK!!!! (yet) - # use filter to create a scope on all the records - #lists: @store.filter 'list', -> true - lists: @store.all 'list' - # mayby @store.all 'list' will work better!!!! (2014-04-24 a more experienced benjamin :) - #orders: @store.filter 'order', -> true - orders: @store.all 'order' - sections: @store.all 'section' - setupController: (controller, model)-> - controller.set('model', model) - #$('#section_selector').on 'change', (-> controller.set('sectionId', $(this).val())) - #controller.set 'lists', @store.all('list') - #controller.set 'lists', Qsupplier.App.List.all() #.filterProperty('state', 'active') - #controller.set 'orders', Qsupplier.App.Order.all() - #controller.set 'lists', model.get('lists') - #controller.set 'orders', model.get('orders') +# Qsupplier.App.IndexRoute = Ember.Route.extend + # model: (params, queryParams)-> + # Ember.Object.create + # # Find with condition does not work since the resulting array promise is not updated for newly created records + # #lists: Qsupplier.App.List.find({state: 'active'}) + # #orders: Qsupplier.App.Order.find({state: 'active'}) + # #lists: @store.filter 'list', (l)-> l.get('state') == 'active' # DOES NOT WORK!!!! (yet) + # # use filter to create a scope on all the records + # #lists: @store.filter 'list', -> true + # lists: @store.all 'list' + # # mayby @store.all 'list' will work better!!!! (2014-04-24 a more experienced benjamin :) + # #orders: @store.filter 'order', -> true + # orders: @store.all 'order' + # sections: @store.all 'section' + # setupController: (controller, model)-> + # controller.set('model', model) + # #$('#section_selector').on 'change', (-> controller.set('sectionId', $(this).val())) + # #controller.set 'lists', @store.all('list') + # #controller.set 'lists', Qsupplier.App.List.all() #.filterProperty('state', 'active') + # #controller.set 'orders', Qsupplier.App.Order.all() + # #controller.set 'lists', model.get('lists') + # #controller.set 'orders', model.get('orders') diff --git a/app/assets/javascripts/supplier/app/routes/section_route.js.coffee b/app/assets/javascripts/supplier/app/routes/section_route.js.coffee index 3a9b3da1..8ce28504 100644 --- a/app/assets/javascripts/supplier/app/routes/section_route.js.coffee +++ b/app/assets/javascripts/supplier/app/routes/section_route.js.coffee @@ -1,3 +1,4 @@ Qsupplier.App.SectionRoute = Ember.Route.extend + model: (params) -> @store.findById 'section', params.section_id renderTemplate: -> @render 'section' diff --git a/app/assets/javascripts/supplier/app/templates/lists/index.emblem b/app/assets/javascripts/supplier/app/templates/lists/index.emblem index e1805e72..32f3b8e2 100644 --- a/app/assets/javascripts/supplier/app/templates/lists/index.emblem +++ b/app/assets/javascripts/supplier/app/templates/lists/index.emblem @@ -1,6 +1,6 @@ h1=t 'models.plural.list' Qsupplier.App.ListDisplayDateSelector valueBinding="date" -if lists +if sorted_lists table.table thead tr @@ -12,7 +12,7 @@ if lists th.currentcy=t 'attributes.list.price' th.timestamp=t 'attributes.list.created_at' tbody - each list in lists + each list in sorted_lists tr td.state link-to 'list' list.id @@ -20,7 +20,7 @@ if lists td.boolean.needs_help=boolean list.needs_help td.boolean.needs_payment=boolean list.needs_payment td.timestamp=time list.closed_at - td.table_number 7 + td.table_number= list.table.number td.currency=currency list.price td.timestamp=time list.created_at else diff --git a/app/assets/javascripts/supplier/app/templates/section.emblem b/app/assets/javascripts/supplier/app/templates/section.emblem index fa9278e4..38c0c62d 100644 --- a/app/assets/javascripts/supplier/app/templates/section.emblem +++ b/app/assets/javascripts/supplier/app/templates/section.emblem @@ -20,27 +20,18 @@ Qsupplier.App.DropdownLink title="Action" ul li - a{action addTables} - span.section-add-tables-icon - =t 'section.add_tables.button_label' + a{action "addTables"}: span.section-add-tables-icon=t 'section.add_tables.button_label' li - a{action arrangeTables} - span.section-arrange-tables-icon - =t 'section.arrange_tables.modal.title' + a{action "arrangeTables"}: span.section-arrange-tables-icon=t 'section.arrange_tables.modal.title' li - a href="{{route 'qr_codes_suppliers_tables_path' section_id=id}}" - span.table-qr-codes - =t 'tables.qr_codes.link' + a href="{{route 'qr_codes_suppliers_tables_path' section_id=id}}": span.table-qr-codes=t 'tables.qr_codes.link' li - /a.section-destroy href="{{route 'suppliers_section_path' id}}" data-method="delete" data-confirm="{{t 'helpers.links.are_you_sure' bare=true}}" - a.section-destroy{action destroySection} - span.section-remove-icon - =t 'helpers.links.destroy' + a.section-destroy{action "destroySection"}: span.section-remove-icon=t 'helpers.links.destroy' Ember.TextField valueBinding="title" class="section-edit-title-field" Qsupplier.App.NumberField valueBinding="width" class="dimension section-edit-width-field" span.fa.fa-lg.fa-times Qsupplier.App.NumberField valueBinding="height" class="dimension section-edit-height-field" - a.section-normal-mode-button{ action finishEditable }: span + a.section-normal-mode-button{ action "finishEditable" }: span else - a.section-edit-mode-button{ action makeEditable }: span + a.section-edit-mode-button{ action "makeEditable" }: span Qsupplier.App.SectionTablesView contentBinding="tables" diff --git a/app/assets/javascripts/supplier/app/templates/section_table.emblem b/app/assets/javascripts/supplier/app/templates/section_table.emblem index a9bbea1e..df0027f7 100644 --- a/app/assets/javascripts/supplier/app/templates/section_table.emblem +++ b/app/assets/javascripts/supplier/app/templates/section_table.emblem @@ -7,8 +7,8 @@ if table.active_list div.table-actions .title= table.number .table-action-row - Qsupplier.App.MarkListHelpedButtonView content=table.active_list - Qsupplier.App.CloseListButtonView content=table.active_list + Qsupplier.App.MarkListHelpedButtonView contentBinding="table.active_list" + Qsupplier.App.CloseListButtonView contentBinding="table.active_list" .table-action-row=currency table.active_list.total /.table-action-row a{action "editTable" table}: span.fa.fa-lg.fa-wrench diff --git a/app/assets/javascripts/supplier/app/templates/section_tables.emblem b/app/assets/javascripts/supplier/app/templates/section_tables.emblem index 0b10c79e..78a12bf3 100644 --- a/app/assets/javascripts/supplier/app/templates/section_tables.emblem +++ b/app/assets/javascripts/supplier/app/templates/section_tables.emblem @@ -1,2 +1,2 @@ each table in tables - Qsupplier.App.SectionTableView contentBinding="table" + Qsupplier.App.SectionTableView content=table diff --git a/app/assets/javascripts/supplier/app/views/mark_list_helped_button_view.js.coffee b/app/assets/javascripts/supplier/app/views/mark_list_helped_button_view.js.coffee index 3044fa4e..a8fbd9d0 100644 --- a/app/assets/javascripts/supplier/app/views/mark_list_helped_button_view.js.coffee +++ b/app/assets/javascripts/supplier/app/views/mark_list_helped_button_view.js.coffee @@ -4,4 +4,4 @@ Qsupplier.App.MarkListHelpedButtonView = Ember.View.extend classNameBindings: ['content.needs_help:show:hide'] tagName: 'button' click: (e)-> - @get('content').is_helped() + @get('content').then (l)->l.is_helped() diff --git a/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee b/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee index 45d57e65..b4db24de 100644 --- a/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee +++ b/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee @@ -15,8 +15,9 @@ root.Qsupplier= list = order.get('list') list.get('orders').addRecord order if table = list.get('table') - if table.get('active_list') isnt list - table.set 'active_list', list + if table.get('active_list') + table.get('active_list').then (table_list)-> + table.set 'active_list', list if table_list isnt list , 200 else if(e.event == 'list_needs_help') if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id) diff --git a/app/assets/javascripts/translations-not-coffee.js.erb b/app/assets/javascripts/translations-not-coffee.js.erb index 9ea5e28e..480362c1 100644 --- a/app/assets/javascripts/translations-not-coffee.js.erb +++ b/app/assets/javascripts/translations-not-coffee.js.erb @@ -23,13 +23,13 @@ function t(path, vars){ var result, m, translatable, isafety,replacable; var parts = path.split('.'); var accessor = '$translations.'+$locale+'["' + parts.join('"]["')+ '"]'; - try{ + try{ result = eval(accessor); - } catch(err){ + } catch(err){ result = parts[parts.length - 1].capitalize(); } if(result == '') return ''; - if(!result) return parts[parts.length - 1].capitalize(); + if(!result) return parts[parts.length - 1].capitalize(); $.each(vars, function(v, value){ result = result.replace('%{'+v+'}', value)}); isafety = 0; while(result.indexOf('${') > -1){ @@ -62,12 +62,12 @@ function setTranslations(selector){ if(selector){ $(selector).find('[data-t]').each(function(){$(this).html(t($(this).data('t'), $(this).data('tAttributes')))}) $(selector).find('*[data-time]').each(function(){ - $(this).text(moment($(this).data('time')).format($(this).data('timeFormat') || 'dd D MMM HH:MM')) + $(this).text(moment($(this).data('time')).format($(this).data('timeFormat') || 'dd D MMM HH:mm')) }) }else{ $('[data-t]').each(function(){$(this).html(t($(this).data('t'),$(this).data('tAttributes')))}) $('*[data-time]').each(function(){ - $(this).text(moment($(this).data('time')).format($(this).data('timeFormat') || 'dd D MMM HH:MM')) + $(this).text(moment($(this).data('time')).format($(this).data('timeFormat') || 'dd D MMM HH:mm')) }) } $('.datepicker').datepicker("option", $.datepicker.regional[$locale]) diff --git a/app/assets/javascripts/translations.js.coffee.erb b/app/assets/javascripts/translations.js.coffee.erb index c4f453ec..de22fa60 100644 --- a/app/assets/javascripts/translations.js.coffee.erb +++ b/app/assets/javascripts/translations.js.coffee.erb @@ -70,14 +70,14 @@ $(this).html t($(this).data("t"), $(this).data("tAttributes")) selector.find("*[data-time]").each -> - $(this).text moment($(this).data("time")).format($(this).data("timeFormat") or "dd D MMM HH:MM") + $(this).text moment($(this).data("time")).format($(this).data("timeFormat") or "dd D MMM HH:mm") else $("[data-t]").each -> $(this).html t($(this).data("t"), $(this).data("tAttributes")) $("*[data-time]").each -> - $(this).text moment($(this).data("time")).format($(this).data("timeFormat") or "dd D MMM HH:MM") + $(this).text moment($(this).data("time")).format($(this).data("timeFormat") or "dd D MMM HH:mm") # jQuery UI datepicker support $(".datepicker").datepicker "option", $.datepicker.regional[locale] if $.fn.datepicker diff --git a/app/assets/stylesheets/supplier/foundation1/_qlists.css.sass b/app/assets/stylesheets/supplier/foundation1/_qlists.css.sass index 379d0f4c..5f3e98d6 100644 --- a/app/assets/stylesheets/supplier/foundation1/_qlists.css.sass +++ b/app/assets/stylesheets/supplier/foundation1/_qlists.css.sass @@ -3,7 +3,7 @@ td.boolean &.needs_help .boolean-true @extend .fa - @extend .fa-exclamation + @extend .fa-bell &.needs_payment .boolean-true @extend .fa @@ -32,5 +32,3 @@ td.boolean padding: $padding border-top: 2px solid #444 font-weight: bold - - diff --git a/app/controllers/suppliers/lists_controller.rb b/app/controllers/suppliers/lists_controller.rb index f07cf53d..1ffd977e 100644 --- a/app/controllers/suppliers/lists_controller.rb +++ b/app/controllers/suppliers/lists_controller.rb @@ -21,10 +21,7 @@ module Suppliers end @lists.include_relation(:table) - respond_to do |format| - format.html # index.html.erb - format.json { render json: @lists, each_serializer: SupplierListSerializer } - end + render json: @lists, each_serializer: SupplierListSerializer end diff --git a/app/controllers/suppliers/sections_controller.rb b/app/controllers/suppliers/sections_controller.rb index 9e0f6336..7de85e15 100644 --- a/app/controllers/suppliers/sections_controller.rb +++ b/app/controllers/suppliers/sections_controller.rb @@ -4,22 +4,21 @@ module Suppliers # GET /sections # GET /sections.json def index + # render json: {} and return @sections = current_supplier.sections @sections.include_relation(:tables) - @active_lists = List.active_for_supplier(current_supplier.id) - @active_table_ids = @active_lists.map(&:table_id).compact - for section in @sections - for table in section.tables - if active_list = @active_lists.find{|l| l.table_id == table.id} - table.active_list = active_list - end - end - end - respond_to do |format| - format.html # index.html.erb - format.json { render json: @sections, each_serializer: SupplierExtendedSectionSerializer } - end + # @active_lists = List.active_for_supplier(current_supplier.id) + # @active_table_ids = @active_lists.map(&:table_id).compact + # for section in @sections + # for table in section.tables + # if active_list = @active_lists.find{|l| l.table_id == table.id} + # table.active_list = active_list + # end + # end + # end + + render json: @sections, each_serializer: SupplierExtendedSectionSerializer end # GET /sections/1 diff --git a/app/models/list.rb b/app/models/list.rb index 61763bc3..ae6f42f1 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -142,6 +142,7 @@ class List set_price # should not be needed, but extra secure orders.map(&:close!) # close the connected orders self.state = 'closed' + self.is_helped! if needs_help? self.user_requests_closing = false # if a user requested closing, not needed anymore self.closed_at = Time.now if save diff --git a/app/models/order.rb b/app/models/order.rb index 8dd0f487..f06752f0 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -129,7 +129,13 @@ class Order #TODO fix me def close! - self.state = 'closed' if placed? || active? + + if placed? || active? + decrement_counter = placed? ? 'placed' : 'in_process' + self.state = 'closed' + supplier.public_send "decrement_orders_#{decrement_counter}_count!" + end + if save broadcast_user user.id, 'order_closed', id: id if user broadcast_supplier supplier_id, 'order_closed', id: id diff --git a/app/models/supplier/counters.rb b/app/models/supplier/counters.rb index 0b8a9079..9b3b992c 100644 --- a/app/models/supplier/counters.rb +++ b/app/models/supplier/counters.rb @@ -58,6 +58,8 @@ class Supplier # Set all known counters to zero Qwaiter::Couchbase.flush_counters! + Qwaiter::Counter.connection.flush if Qwaiter::Counter.connection.respond_to?(:flush) + spec = Order.by_supplier_id_and_state(reduce: true, group_level: 2) reset_order_counters_with_spec spec end diff --git a/app/serializers/supplier_extended_table_serializer.rb b/app/serializers/supplier_extended_table_serializer.rb index 36e93649..ea79118e 100644 --- a/app/serializers/supplier_extended_table_serializer.rb +++ b/app/serializers/supplier_extended_table_serializer.rb @@ -1,7 +1,7 @@ class SupplierExtendedTableSerializer < Qwaiter::Serializer root 'table' embed :ids, include: true - attributes :number, :width, :height, :position_x, :position_y, :section_id, :active_list_id + attributes :number, :width, :height, :position_x, :position_y, :section_id#, :active_list_id #def list_id #object.active_list_id || object.active_list.try(:id) diff --git a/app/views/layouts/phone.html.slim b/app/views/layouts/phone.html.slim index 83517676..44743a3b 100644 --- a/app/views/layouts/phone.html.slim +++ b/app/views/layouts/phone.html.slim @@ -4,7 +4,7 @@ html lang="en" meta charset="utf-8" meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" meta name="viewport" content="width=device-width, initial-scale=1.0" - title= content_for?(:title) ? yield(:title) : application_title + title= application_title = csrf_meta_tags /! Le HTML5 shim, for IE6-8 support of HTML elements diff --git a/app/views/layouts/user/foundation.html.slim b/app/views/layouts/user/foundation.html.slim index 58f2228e..d14ed326 100644 --- a/app/views/layouts/user/foundation.html.slim +++ b/app/views/layouts/user/foundation.html.slim @@ -4,7 +4,7 @@ html lang="en" meta charset="utf-8" meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" meta name="viewport" content="width=device-width, initial-scale=1.0" - title Qwaiter + title= application_title = stylesheet_link_tag "user/foundation/application" = javascript_include_tag "vendor/modernizr" = javascript_include_tag 'http://connect.facebook.net/en_US/all.js' diff --git a/spec/acceptance/suppliers/section_view.feature b/spec/acceptance/suppliers/section_view.feature index a1bab358..d5c3c8d4 100644 --- a/spec/acceptance/suppliers/section_view.feature +++ b/spec/acceptance/suppliers/section_view.feature @@ -33,6 +33,7 @@ Feature: Supplier section view And I wait 0.5 seconds When I click on the close list button in the section table table popup + And confirm the supplier close list modal And I wait 1 second Then the section table should not have any active list markings anymore And the list should be marked as closed diff --git a/spec/acceptance_steps/global_steps.rb b/spec/acceptance_steps/global_steps.rb index ea311c5e..3a35c3fe 100644 --- a/spec/acceptance_steps/global_steps.rb +++ b/spec/acceptance_steps/global_steps.rb @@ -21,6 +21,12 @@ step "I wait :number second/seconds" do |number| sleep number.to_f end +placeholder :number do + match /[-+]?\d+(\.\d+)?/ do |number_string| + number_string.to_f + end +end + step "I open the debugger" do binding.pry end diff --git a/spec/acceptance_steps/suppliers/navigation_steps.rb b/spec/acceptance_steps/suppliers/navigation_steps.rb index b1ff4002..c9619232 100644 --- a/spec/acceptance_steps/suppliers/navigation_steps.rb +++ b/spec/acceptance_steps/suppliers/navigation_steps.rb @@ -11,7 +11,7 @@ step "I visit the supplier section path" do end step "I visit the supplier last section path" do - visit "/supplier/sections/#{@sections.last.id}" + visit "/supplier#/sections/#{@sections.last.id}" end step "I should be redirected to the supplier settings page" do @@ -20,5 +20,5 @@ step "I should be redirected to the supplier settings page" do end step "I visit the supplier settings path" do - visit supplier_settings_path + visit "/supplier#/settings" end diff --git a/spec/acceptance_steps/suppliers/section_view_steps.rb b/spec/acceptance_steps/suppliers/section_view_steps.rb index a07d9142..dbe88dcd 100644 --- a/spec/acceptance_steps/suppliers/section_view_steps.rb +++ b/spec/acceptance_steps/suppliers/section_view_steps.rb @@ -27,7 +27,6 @@ step "the section table should be marked as in need of help" do end step "the section table should not be marked as in need of help" do - binding.pry table = page.find(".section-table-#{@table.id}") table['class'].should_not include 'needs_help' end diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb index 0d1f3520..47a3007f 100644 --- a/spec/models/list_spec.rb +++ b/spec/models/list_spec.rb @@ -156,4 +156,12 @@ describe List do describe 'product order creation' end + + describe '#close!' do + it 'removes the helped mark' do + list_options[:needs_help] = true + list.close! + expect( list.needs_help? ).not_to be true + end + end end diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index 0996ffc4..0f831f04 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -153,4 +153,26 @@ describe Order do end end end + describe '#close!' do + describe 'counters' do + before do + # hack some initial values + Qwaiter::Counter.set "supplier_counter:#{supplier.id}:orders_placed", 11 + Qwaiter::Counter.set "supplier_counter:#{supplier.id}:orders_in_process", 7 + end + + it "decrements the orders_placed_count for when a placed order is closed" do + order.close! + supplier.orders_placed_count.should == 10 + supplier.orders_in_process_count.should == 7 + end + + it "decrements the orders_in_process_count for when an active order is closed" do + order_options[:state] = 'active' + order.close! + supplier.orders_placed_count.should == 11 + supplier.orders_in_process_count.should == 6 + end + end + end end diff --git a/vendor/assets/ember/development/ember-data.js b/vendor/assets/ember/development/ember-data.js index b0c71a61..d6dab7b6 100644 --- a/vendor/assets/ember/development/ember-data.js +++ b/vendor/assets/ember/development/ember-data.js @@ -1,81 +1,129 @@ // Fetched from channel: canary, with url http://builds.emberjs.com/canary/ember-data.js -// Fetched on: 2014-07-01T13:19:27Z -/*! - * @overview Ember Data - * @copyright Copyright 2011-2014 Tilde Inc. and contributors. - * Portions Copyright 2011 LivingSocial Inc. - * @license Licensed under MIT license (see license.js) - * @version 1.0.0-beta.9+canary.9a5cc255 - */ -(function(global) { +// Fetched on: 2014-08-07T09:19:38Z +(function(global){ var define, requireModule, require, requirejs; (function() { - var registry = {}, seen = {}; + + var _isArray; + if (!Array.isArray) { + _isArray = function (x) { + return Object.prototype.toString.call(x) === "[object Array]"; + }; + } else { + _isArray = Array.isArray; + } + + var registry = {}, seen = {}, state = {}; + var FAILED = false; define = function(name, deps, callback) { - registry[name] = { deps: deps, callback: callback }; + + if (!_isArray(deps)) { + callback = deps; + deps = []; + } + + registry[name] = { + deps: deps, + callback: callback + }; }; - requirejs = require = requireModule = function(name) { - requirejs._eak_seen = registry; + function reify(deps, name, seen) { + var length = deps.length; + var reified = new Array(length); + var dep; + var exports; - if (seen[name]) { return seen[name]; } - seen[name] = {}; + for (var i = 0, l = length; i < l; i++) { + dep = deps[i]; + if (dep === 'exports') { + exports = reified[i] = seen; + } else { + reified[i] = require(resolve(dep, name)); + } + } + + return { + deps: reified, + exports: exports + }; + } + + requirejs = require = requireModule = function(name) { + if (state[name] !== FAILED && + seen.hasOwnProperty(name)) { + return seen[name]; + } if (!registry[name]) { - throw new Error("Could not find module " + name); + throw new Error('Could not find module ' + name); } - var mod = registry[name], - deps = mod.deps, - callback = mod.callback, - reified = [], - exports; + var mod = registry[name]; + var reified; + var module; + var loaded = false; - for (var i=0, l=deps.length; i} The primary array that was returned in response - to the original query. - */ - extractArray: function(store, primaryType, payload) { - var key = primaryType.typeKey; - var root = getKeyForAttribute.call(this, key); - var partials = payload[pluralize(root)]; - - forEach(partials, function(partial) { - updatePayloadWithEmbedded(this, store, primaryType, payload, partial); - }, this); - - return this._super(store, primaryType, payload); - } - }); - - // `keyForAttribute` is optional but may be defined when extending a serializer prototype - var getKeyForAttribute = function(attr) { - return (this.keyForAttribute) ? this.keyForAttribute(attr) : attr; - }; - - // checks config for attrs option to embedded (always) - serialize and deserialize - function hasEmbeddedAlwaysOption(attrs, attr) { - var option = attrsOption(attrs, attr); - return option && option.embedded === 'always'; - } - - // checks config for attrs option to serialize ids - function hasSerializeRecordsOption(attrs, attr) { - var alwaysEmbed = hasEmbeddedAlwaysOption(attrs, attr); - var option = attrsOption(attrs, attr); - return alwaysEmbed || (option && (option.serialize === 'records')); - } - - // checks config for attrs option to serialize records - function hasSerializeIdsOption(attrs, attr) { - var option = attrsOption(attrs, attr); - return option && (option.serialize === 'ids' || option.serialize === 'id'); - } - - // checks config for attrs option to serialize records - function noSerializeOptionSpecified(attrs, attr) { - var option = attrsOption(attrs, attr); - var serializeRecords = hasSerializeRecordsOption(attrs, attr); - var serializeIds = hasSerializeIdsOption(attrs, attr); - return !(option && (option.serialize || option.embedded)); - } - - // checks config for attrs option to deserialize records - // a defined option object for a resource is treated the same as - // `deserialize: 'records'` - function hasDeserializeRecordsOption(attrs, attr) { - var alwaysEmbed = hasEmbeddedAlwaysOption(attrs, attr); - var option = attrsOption(attrs, attr); - var hasSerializingOption = option && (option.deserialize || option.serialize); - return alwaysEmbed || hasSerializingOption /* option.deserialize === 'records' */; - } - - function attrsOption(attrs, attr) { - return attrs && (attrs[Ember.String.camelize(attr)] || attrs[attr]); - } - - // chooses a relationship kind to branch which function is used to update payload - // does not change payload if attr is not embedded - function updatePayloadWithEmbedded(serializer, store, type, payload, partial) { - var attrs = get(serializer, 'attrs'); - - if (!attrs) { - return; - } - type.eachRelationship(function(key, relationship) { - if (hasDeserializeRecordsOption(attrs, key)) { - if (relationship.kind === "hasMany") { - updatePayloadWithEmbeddedHasMany(serializer, store, key, relationship, payload, partial); - } - if (relationship.kind === "belongsTo") { - updatePayloadWithEmbeddedBelongsTo(serializer, store, key, relationship, payload, partial); - } - } - }); - } - - // handles embedding for `hasMany` relationship - function updatePayloadWithEmbeddedHasMany(serializer, store, primaryType, relationship, payload, partial) { - var embeddedSerializer = store.serializerFor(relationship.type.typeKey); - var primaryKey = get(serializer, 'primaryKey'); - var attr = relationship.type.typeKey; - // underscore forces the embedded records to be side loaded. - // it is needed when main type === relationship.type - var embeddedTypeKey = '_' + serializer.typeForRoot(relationship.type.typeKey); - var expandedKey = serializer.keyForRelationship(primaryType, relationship.kind); - var attribute = getKeyForAttribute.call(serializer, primaryType); - var ids = []; - - if (!partial[attribute]) { - return; - } - - payload[embeddedTypeKey] = payload[embeddedTypeKey] || []; - - forEach(partial[attribute], function(data) { - var embeddedType = store.modelFor(attr); - updatePayloadWithEmbedded(embeddedSerializer, store, embeddedType, payload, data); - ids.push(data[primaryKey]); - payload[embeddedTypeKey].push(data); - }); - - partial[expandedKey] = ids; - delete partial[attribute]; - } - - // handles embedding for `belongsTo` relationship - function updatePayloadWithEmbeddedBelongsTo(serializer, store, primaryType, relationship, payload, partial) { - var attrs = serializer.get('attrs'); - - if (!attrs || - !(hasDeserializeRecordsOption(attrs, Ember.String.camelize(primaryType)) || - hasDeserializeRecordsOption(attrs, primaryType))) { - return; - } - var attr = relationship.type.typeKey; - var _serializer = store.serializerFor(relationship.type.typeKey); - var primaryKey = get(_serializer, 'primaryKey'); - var embeddedTypeKey = Ember.String.pluralize(attr); // TODO don't use pluralize - var expandedKey = _serializer.keyForRelationship(primaryType, relationship.kind); - var attribute = getKeyForAttribute.call(_serializer, primaryType); - - if (!partial[attribute]) { - return; - } - payload[embeddedTypeKey] = payload[embeddedTypeKey] || []; - var embeddedType = store.modelFor(relationship.type.typeKey); - // Recursive call for nested record - updatePayloadWithEmbedded(_serializer, store, embeddedType, payload, partial[attribute]); - partial[expandedKey] = partial[attribute].id; - // Need to move an embedded `belongsTo` object into a pluralized collection - payload[embeddedTypeKey].push(partial[attribute]); - // Need a reference to the parent so relationship works between both `belongsTo` records - partial[attribute][relationship.parentType.typeKey + '_id'] = partial.id; - delete partial[attribute]; - } - - __exports__["default"] = EmbeddedRecordsMixin; + __exports__["default"] = DS; }); -define("ember-data/lib/adapters", - ["./adapters/fixture_adapter","./adapters/rest_adapter","exports"], +define("ember-data/adapters", + ["ember-data/adapters/fixture_adapter","ember-data/adapters/rest_adapter","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; /** @@ -1134,8 +743,8 @@ define("ember-data/lib/adapters", __exports__.RESTAdapter = RESTAdapter; __exports__.FixtureAdapter = FixtureAdapter; }); -define("ember-data/lib/adapters/fixture_adapter", - ["../system/adapter","exports"], +define("ember-data/adapters/fixture_adapter", + ["ember-data/system/adapter","exports"], function(__dependency1__, __exports__) { "use strict"; /** @@ -1276,8 +885,8 @@ define("ember-data/lib/adapters/fixture_adapter", @return {Promise} promise */ find: function(store, type, id) { - var fixtures = this.fixturesForType(type), - fixture; + var fixtures = this.fixturesForType(type); + var fixture; Ember.assert("Unable to find fixtures for model type "+type.toString() +". If you're defining your fixtures using `Model.FIXTURES = ...`, please change it to `Model.reopenClass({ FIXTURES: ... })`.", fixtures); @@ -1400,9 +1009,7 @@ define("ember-data/lib/adapters/fixture_adapter", @return {Promise} promise */ deleteRecord: function(store, type, record) { - var fixture = this.mockJSON(store, type, record); - - this.deleteLoadedFixture(type, fixture); + this.deleteLoadedFixture(type, record); return this.simulateRemoteCall(function() { // no payload in a deletion @@ -1419,7 +1026,7 @@ define("ember-data/lib/adapters/fixture_adapter", deleteLoadedFixture: function(type, record) { var existingFixture = this.findExistingFixture(type, record); - if(existingFixture) { + if (existingFixture) { var index = indexOf(type.FIXTURES, existingFixture); type.FIXTURES.splice(index, 1); return true; @@ -1447,7 +1054,7 @@ define("ember-data/lib/adapters/fixture_adapter", */ findFixtureById: function(fixtures, id) { return Ember.A(fixtures).find(function(r) { - if(''+get(r, 'id') === ''+id) { + if (''+get(r, 'id') === ''+id) { return true; } else { return false; @@ -1480,8 +1087,8 @@ define("ember-data/lib/adapters/fixture_adapter", } }); }); -define("ember-data/lib/adapters/rest_adapter", - ["../system/adapter","exports"], +define("ember-data/adapters/rest_adapter", + ["ember-data/system/adapter","exports"], function(__dependency1__, __exports__) { "use strict"; /** @@ -1627,6 +1234,50 @@ define("ember-data/lib/adapters/rest_adapter", */ __exports__["default"] = Adapter.extend({ defaultSerializer: '-rest', + + /** + By default the RESTAdapter will send each find request coming from a `store.find` + or from accessing a relationship separately to the server. If your server supports passing + ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests + within a single runloop. + + For example, if you have an initial payload of + ```javascript + post: { + id:1, + comments: [1,2] + } + ``` + + By default calling `post.get('comments')` will trigger the following requests(assuming the + comments haven't been loaded before): + + ``` + GET /comments/1 + GET /comments/2 + ``` + + If you set coalesceFindRequests to `true` it will instead trigger the following request: + + ``` + GET /comments?ids[]=1&ids[]=2 + ``` + + Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo` + relationships accessed within the same runloop. If you set `coalesceFindRequests: true` + + ```javascript + store.find('comment', 1); + store.find('comment', 2); + ``` + + will also send a request to: `GET /comments?ids[]=1&ids[]=2` + + @property coalesceFindRequests + @type {boolean} + */ + coalesceFindRequests: false, + /** Endpoint paths can be prefixed with a `namespace` by setting the namespace property on the adapter: @@ -1691,10 +1342,11 @@ define("ember-data/lib/adapters/rest_adapter", @param {DS.Store} store @param {subclass of DS.Model} type @param {String} id + @param {DS.Model} record @return {Promise} promise */ - find: function(store, type, id) { - return this.ajax(this.buildURL(type.typeKey, id), 'GET'); + find: function(store, type, id, record) { + return this.ajax(this.buildURL(type.typeKey, id, record), 'GET'); }, /** @@ -1743,9 +1395,7 @@ define("ember-data/lib/adapters/rest_adapter", }, /** - Called by the store in order to fetch a JSON array for - the unloaded records in a has-many relationship that were originally - specified as IDs. + Called by the store in order to fetch several records together if `coalesceFindRequests` is true For example, if the original payload looks like: @@ -1774,10 +1424,11 @@ define("ember-data/lib/adapters/rest_adapter", @param {DS.Store} store @param {subclass of DS.Model} type @param {Array} ids + @param {Array} records @return {Promise} promise */ - findMany: function(store, type, ids) { - return this.ajax(this.buildURL(type.typeKey), 'GET', { data: { ids: ids } }); + findMany: function(store, type, ids, records) { + return this.ajax(this.buildURL(type.typeKey, ids, records), 'GET', { data: { ids: ids } }); }, /** @@ -1810,9 +1461,9 @@ define("ember-data/lib/adapters/rest_adapter", @return {Promise} promise */ findHasMany: function(store, record, url) { - var host = get(this, 'host'), - id = get(record, 'id'), - type = record.constructor.typeKey; + var host = get(this, 'host'); + var id = get(record, 'id'); + var type = record.constructor.typeKey; if (host && url.charAt(0) === '/' && url.charAt(1) !== '/') { url = host + url; @@ -1849,8 +1500,8 @@ define("ember-data/lib/adapters/rest_adapter", @return {Promise} promise */ findBelongsTo: function(store, record, url) { - var id = get(record, 'id'), - type = record.constructor.typeKey; + var id = get(record, 'id'); + var type = record.constructor.typeKey; return this.ajax(this.urlPrefix(url, this.buildURL(type, id)), 'GET'); }, @@ -1877,7 +1528,7 @@ define("ember-data/lib/adapters/rest_adapter", serializer.serializeIntoHash(data, type, record, { includeId: true }); - return this.ajax(this.buildURL(type.typeKey), "POST", { data: data }); + return this.ajax(this.buildURL(type.typeKey, null, record), "POST", { data: data }); }, /** @@ -1904,7 +1555,7 @@ define("ember-data/lib/adapters/rest_adapter", var id = get(record, 'id'); - return this.ajax(this.buildURL(type.typeKey, id), "PUT", { data: data }); + return this.ajax(this.buildURL(type.typeKey, id, record), "PUT", { data: data }); }, /** @@ -1921,7 +1572,7 @@ define("ember-data/lib/adapters/rest_adapter", deleteRecord: function(store, type, record) { var id = get(record, 'id'); - return this.ajax(this.buildURL(type.typeKey, id), "DELETE"); + return this.ajax(this.buildURL(type.typeKey, id, record), "DELETE"); }, /** @@ -1937,15 +1588,20 @@ define("ember-data/lib/adapters/rest_adapter", @method buildURL @param {String} type @param {String} id + @param {DS.Model} record @return {String} url */ - buildURL: function(type, id) { + buildURL: function(type, id, record) { var url = [], host = get(this, 'host'), prefix = this.urlPrefix(); if (type) { url.push(this.pathForType(type)); } - if (id) { url.push(id); } + + //We might get passed in an array of ids from findMany + //in which case we don't want to modify the url, as the + //ids will be passed in through a query param + if (id && !Ember.isArray(id)) { url.push(id); } if (prefix) { url.unshift(prefix); } @@ -1963,9 +1619,9 @@ define("ember-data/lib/adapters/rest_adapter", @return {String} urlPrefix */ urlPrefix: function(path, parentURL) { - var host = get(this, 'host'), - namespace = get(this, 'namespace'), - url = []; + var host = get(this, 'host'); + var namespace = get(this, 'namespace'); + var url = []; if (path) { // Absolute path @@ -1990,6 +1646,60 @@ define("ember-data/lib/adapters/rest_adapter", return url.join('/'); }, + _stripIDFromURL: function(store, record) { + var type = store.modelFor(record); + var url = this.buildURL(type.typeKey, record.get('id'), record); + + var expandedURL = url.split('/'); + //Case when the url is of the format ...something/:id + var lastSegment = expandedURL[ expandedURL.length - 1 ]; + var id = record.get('id'); + if (lastSegment === id) { + expandedURL[expandedURL.length - 1] = ""; + } else if(endsWith(lastSegment, '?id=' + id)) { + //Case when the url is of the format ...something?id=:id + expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1); + } + + return expandedURL.join('/'); + }, + + /** + Organize records into groups, each of which is to be passed to separate + calls to `findMany`. + + This implementation groups together records that have the same base URL but + differing ids. For example `/comments/1` and `/comments/2` will be grouped together + because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2` + + It also supports urls where ids are passed as a query param, such as `/comments?id=1` + but not those where there is more than 1 query param such as `/comments?id=2&name=David` + Currently only the query param of `id` is supported. If you need to support others, please + override this or the `_stripIDFromURL` method. + + It does not group records that have differing base urls, such as for example: `/posts/1/comments/2` + and `/posts/2/comments/3` + + @method groupRecordsForFindMany + @param {Array} records + @return {Array} an array of arrays of records, each of which is to be + loaded separately by `findMany`. + */ + groupRecordsForFindMany: function (store, records) { + var groups = Ember.MapWithDefault.create({defaultValue: function(){return [];}}); + var adapter = this; + forEach.call(records, function(record){ + var baseUrl = adapter._stripIDFromURL(store, record); + groups.get(baseUrl).push(record); + }); + var groupsArray = []; + groups.forEach(function(key, group){ + groupsArray.push(group); + }); + + return groupsArray; + }, + /** Determines the pathname for a given type. @@ -2085,11 +1795,11 @@ define("ember-data/lib/adapters/rest_adapter", @param {Object} hash @return {Promise} promise */ - ajax: function(url, type, hash) { + ajax: function(url, type, options) { var adapter = this; return new Ember.RSVP.Promise(function(resolve, reject) { - hash = adapter.ajaxOptions(url, type, hash); + var hash = adapter.ajaxOptions(url, type, options); hash.success = function(json) { Ember.run(null, resolve, json); @@ -2111,8 +1821,8 @@ define("ember-data/lib/adapters/rest_adapter", @param {Object} hash @return {Object} hash */ - ajaxOptions: function(url, type, hash) { - hash = hash || {}; + ajaxOptions: function(url, type, options) { + var hash = options || {}; hash.url = url; hash.type = type; hash.dataType = 'json'; @@ -2132,13 +1842,20 @@ define("ember-data/lib/adapters/rest_adapter", }; } - return hash; } - }); + + //From http://stackoverflow.com/questions/280634/endswith-in-javascript + function endsWith(string, suffix){ + if (typeof String.prototype.endsWith !== 'function') { + return string.indexOf(suffix, string.length - suffix.length) !== -1; + } else { + return string.endsWith(suffix); + } + } }); -define("ember-data/lib/core", +define("ember-data/core", ["exports"], function(__exports__) { "use strict"; @@ -2157,11 +1874,11 @@ define("ember-data/lib/core", /** @property VERSION @type String - @default '1.0.0-beta.9+canary.9a5cc255' + @default '1.0.0-beta.9+canary.20c9acf5d4' @static */ DS = Ember.Namespace.create({ - VERSION: '1.0.0-beta.9+canary.9a5cc255' + VERSION: '1.0.0-beta.9+canary.20c9acf5d4' }); if (Ember.libraries) { @@ -2171,8 +1888,8 @@ define("ember-data/lib/core", __exports__["default"] = DS; }); -define("ember-data/lib/ember-initializer", - ["./setup-container"], +define("ember-data/ember-initializer", + ["ember-data/setup-container"], function(__dependency1__) { "use strict"; var setupContainer = __dependency1__["default"]; @@ -2183,7 +1900,7 @@ define("ember-data/lib/ember-initializer", @module ember-data */ - /** + /* This code initializes Ember-Data onto an Ember application. @@ -2255,7 +1972,7 @@ define("ember-data/lib/ember-initializer", }); }); }); -define("ember-data/lib/ext/date", +define("ember-data/ext/date", [], function() { "use strict"; @@ -2320,8 +2037,8 @@ define("ember-data/lib/ext/date", Date.parse = Ember.Date.parse; } }); -define("ember-data/lib/initializers/data_adapter", - ["../system/debug/debug_adapter","exports"], +define("ember-data/initializers/data_adapter", + ["ember-data/system/debug/debug_adapter","exports"], function(__dependency1__, __exports__) { "use strict"; var DebugAdapter = __dependency1__["default"]; @@ -2337,8 +2054,8 @@ define("ember-data/lib/initializers/data_adapter", container.register('data-adapter:main', DebugAdapter); }; }); -define("ember-data/lib/initializers/store", - ["../serializers","../adapters","../system/container_proxy","../system/store","exports"], +define("ember-data/initializers/store", + ["ember-data/serializers","ember-data/adapters","ember-data/system/container_proxy","ember-data/system/store","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; var JSONSerializer = __dependency1__.JSONSerializer; @@ -2365,9 +2082,9 @@ define("ember-data/lib/initializers/store", var proxy = new ContainerProxy(container); proxy.registerDeprecations([ - {deprecated: 'serializer:_default', valid: 'serializer:-default'}, - {deprecated: 'serializer:_rest', valid: 'serializer:-rest'}, - {deprecated: 'adapter:_rest', valid: 'adapter:-rest'} + { deprecated: 'serializer:_default', valid: 'serializer:-default' }, + { deprecated: 'serializer:_rest', valid: 'serializer:-rest' }, + { deprecated: 'adapter:_rest', valid: 'adapter:-rest' } ]); // new go forward paths @@ -2380,7 +2097,7 @@ define("ember-data/lib/initializers/store", container.lookup('store:main'); }; }); -define("ember-data/lib/initializers/store_injections", +define("ember-data/initializers/store_injections", ["exports"], function(__exports__) { "use strict"; @@ -2398,8 +2115,8 @@ define("ember-data/lib/initializers/store_injections", container.injection('data-adapter', 'store', 'store:main'); }; }); -define("ember-data/lib/initializers/transforms", - ["../transforms","exports"], +define("ember-data/initializers/transforms", + ["ember-data/transforms","exports"], function(__dependency1__, __exports__) { "use strict"; var BooleanTransform = __dependency1__.BooleanTransform; @@ -2421,123 +2138,8 @@ define("ember-data/lib/initializers/transforms", container.register('transform:string', StringTransform); }; }); -define("ember-data/lib/main", - ["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./ember-initializer","./setup-container","./system/container_proxy","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __exports__) { - "use strict"; - /** - Ember Data - - @module ember-data - @main ember-data - */ - - // support RSVP 2.x via resolve, but prefer RSVP 3.x's Promise.cast - Ember.RSVP.Promise.cast = Ember.RSVP.Promise.cast || Ember.RSVP.resolve; - - var DS = __dependency1__["default"]; - - var Store = __dependency3__.Store; - var PromiseArray = __dependency3__.PromiseArray; - var PromiseObject = __dependency3__.PromiseObject; - var Model = __dependency4__.Model; - var Errors = __dependency4__.Errors; - var RootState = __dependency4__.RootState; - var attr = __dependency4__.attr; - var AttributeChange = __dependency5__.AttributeChange; - var RelationshipChange = __dependency5__.RelationshipChange; - var RelationshipChangeAdd = __dependency5__.RelationshipChangeAdd; - var RelationshipChangeRemove = __dependency5__.RelationshipChangeRemove; - var OneToManyChange = __dependency5__.OneToManyChange; - var ManyToNoneChange = __dependency5__.ManyToNoneChange; - var OneToOneChange = __dependency5__.OneToOneChange; - var ManyToManyChange = __dependency5__.ManyToManyChange; - var InvalidError = __dependency6__.InvalidError; - var Adapter = __dependency6__.Adapter; - var DebugAdapter = __dependency7__["default"]; - var RecordArray = __dependency8__.RecordArray; - var FilteredRecordArray = __dependency8__.FilteredRecordArray; - var AdapterPopulatedRecordArray = __dependency8__.AdapterPopulatedRecordArray; - var ManyArray = __dependency8__.ManyArray; - var RecordArrayManager = __dependency9__["default"]; - var RESTAdapter = __dependency10__.RESTAdapter; - var FixtureAdapter = __dependency10__.FixtureAdapter; - var JSONSerializer = __dependency11__["default"]; - var RESTSerializer = __dependency12__["default"]; - var ActiveModelAdapter = __dependency14__.ActiveModelAdapter; - var ActiveModelSerializer = __dependency14__.ActiveModelSerializer; - var EmbeddedRecordsMixin = __dependency14__.EmbeddedRecordsMixin; - - var Transform = __dependency15__.Transform; - var DateTransform = __dependency15__.DateTransform; - var NumberTransform = __dependency15__.NumberTransform; - var StringTransform = __dependency15__.StringTransform; - var BooleanTransform = __dependency15__.BooleanTransform; - - var hasMany = __dependency16__.hasMany; - var belongsTo = __dependency16__.belongsTo; - var setupContainer = __dependency18__["default"]; - - var ContainerProxy = __dependency19__["default"]; - - DS.Store = Store; - DS.PromiseArray = PromiseArray; - DS.PromiseObject = PromiseObject; - - DS.Model = Model; - DS.RootState = RootState; - DS.attr = attr; - DS.Errors = Errors; - - DS.AttributeChange = AttributeChange; - DS.RelationshipChange = RelationshipChange; - DS.RelationshipChangeAdd = RelationshipChangeAdd; - DS.OneToManyChange = OneToManyChange; - DS.ManyToNoneChange = OneToManyChange; - DS.OneToOneChange = OneToOneChange; - DS.ManyToManyChange = ManyToManyChange; - - DS.Adapter = Adapter; - DS.InvalidError = InvalidError; - - DS.DebugAdapter = DebugAdapter; - - DS.RecordArray = RecordArray; - DS.FilteredRecordArray = FilteredRecordArray; - DS.AdapterPopulatedRecordArray = AdapterPopulatedRecordArray; - DS.ManyArray = ManyArray; - - DS.RecordArrayManager = RecordArrayManager; - - DS.RESTAdapter = RESTAdapter; - DS.FixtureAdapter = FixtureAdapter; - - DS.RESTSerializer = RESTSerializer; - DS.JSONSerializer = JSONSerializer; - - DS.Transform = Transform; - DS.DateTransform = DateTransform; - DS.StringTransform = StringTransform; - DS.NumberTransform = NumberTransform; - DS.BooleanTransform = BooleanTransform; - - DS.ActiveModelAdapter = ActiveModelAdapter; - DS.ActiveModelSerializer = ActiveModelSerializer; - DS.EmbeddedRecordsMixin = EmbeddedRecordsMixin; - - DS.belongsTo = belongsTo; - DS.hasMany = hasMany; - - DS.ContainerProxy = ContainerProxy; - - DS._setupContainer = setupContainer; - - Ember.lookup.DS = DS; - - __exports__["default"] = DS; - }); -define("ember-data/lib/serializers", - ["./serializers/json_serializer","./serializers/rest_serializer","exports"], +define("ember-data/serializers", + ["ember-data/serializers/json_serializer","ember-data/serializers/rest_serializer","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; var JSONSerializer = __dependency1__["default"]; @@ -2546,15 +2148,453 @@ define("ember-data/lib/serializers", __exports__.JSONSerializer = JSONSerializer; __exports__.RESTSerializer = RESTSerializer; }); -define("ember-data/lib/serializers/json_serializer", - ["../system/changes","exports"], +define("ember-data/serializers/embedded_records_mixin", + ["ember-inflector","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var get = Ember.get; + var forEach = Ember.EnumerableUtils.forEach; + var camelize = Ember.String.camelize; + + var pluralize = __dependency1__.pluralize; + + /** + ## Using Embedded Records + + `DS.EmbeddedRecordsMixin` supports serializing embedded records. + + To set up embedded records, include the mixin when extending a serializer + then define and configure embedded (model) relationships. + + Below is an example of a per-type serializer ('post' type). + + ```js + App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { + attrs: { + author: {embedded: 'always'}, + comments: {serialize: 'ids'} + } + }) + ``` + + The `attrs` option for a resource `{embedded: 'always'}` is shorthand for: + + ```js + {serialize: 'records', deserialize: 'records'} + ``` + + ### Configuring Attrs + + A resource's `attrs` option may be set to use `ids`, `records` or `no` for the + `serialize` and `deserialize` settings. + + The `attrs` property can be set on the ApplicationSerializer or a per-type + serializer. + + In the case where embedded JSON is expected while extracting a payload (reading) + the setting is `deserialize: 'records'`, there is no need to use `ids` when + extracting as that is the default behavior without this mixin if you are using + the vanilla EmbeddedRecordsMixin. Likewise, to embed JSON in the payload while + serializing `serialize: 'records'` is the setting to use. There is an option of + not embedding JSON in the serialized payload by using `serialize: 'ids'`. If you + do not want the relationship sent at all, you can use `serialize: 'no'`. + + + ### EmbeddedRecordsMixin defaults + If you do not overwrite `attrs` for a specific relationship, the `EmbeddedRecordsMixin` + will behave in the following way: + + BelongsTo: `{serialize:'id', deserialize:'id'}` + HasMany: `{serialize:'no', deserialize:'ids'}` + + ### Model Relationships + + Embedded records must have a model defined to be extracted and serialized. + + To successfully extract and serialize embedded records the model relationships + must be setup correcty See the + [defining relationships](/guides/models/defining-models/#toc_defining-relationships) + section of the **Defining Models** guide page. + + Records without an `id` property are not considered embedded records, model + instances must have an `id` property to be used with Ember Data. + + ### Example JSON payloads, Models and Serializers + + **When customizing a serializer it is imporant to grok what the cusomizations + are, please read the docs for the methods this mixin provides, in case you need + to modify to fit your specific needs.** + + For example review the docs for each method of this mixin: + * [normalize](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_normalize) + * [serializeBelongsTo](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeBelongsTo) + * [serializeHasMany](/api/data/classes/DS.EmbeddedRecordsMixin.html#method_serializeHasMany) + + @class EmbeddedRecordsMixin + @namespace DS + */ + var EmbeddedRecordsMixin = Ember.Mixin.create({ + + /** + Normalize the record and recursively normalize/extract all the embedded records + while pushing them into the store as they are encountered + + A payload with an attr configured for embedded records needs to be extracted: + + ```js + { + "post": { + "id": "1" + "title": "Rails is omakase", + "comments": [{ + "id": "1", + "body": "Rails is unagi" + }, { + "id": "2", + "body": "Omakase O_o" + }] + } + } + ``` + @method normalize + @param {subclass of DS.Model} type + @param {Object} hash to be normalized + @param {String} key the hash has been referenced by + @return {Object} the normalized hash + **/ + normalize: function(type, hash, prop) { + var normalizedHash = this._super(type, hash, prop); + return extractEmbeddedRecords(this, this.store, type, normalizedHash); + }, + + keyForRelationship: function(key, type){ + if (this.hasDeserializeRecordsOption(key)) { + return this.keyForAttribute(key); + } else { + return this._super(key, type) || key; + } + }, + + /** + Serialize `belongsTo` relationship when it is configured as an embedded object. + + This example of an author model belongs to a post model: + + ```js + Post = DS.Model.extend({ + title: DS.attr('string'), + body: DS.attr('string'), + author: DS.belongsTo('author') + }); + + Author = DS.Model.extend({ + name: DS.attr('string'), + post: DS.belongsTo('post') + }); + ``` + + Use a custom (type) serializer for the post model to configure embedded author + + ```js + App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { + attrs: { + author: {embedded: 'always'} + } + }) + ``` + + A payload with an attribute configured for embedded records can serialize + the records together under the root attribute's payload: + + ```js + { + "post": { + "id": "1" + "title": "Rails is omakase", + "author": { + "id": "2" + "name": "dhh" + } + } + } + ``` + + @method serializeBelongsTo + @param {DS.Model} record + @param {Object} json + @param {Object} relationship + */ + serializeBelongsTo: function(record, json, relationship) { + var attr = relationship.key; + var attrs = this.get('attrs'); + if (this.noSerializeOptionSpecified(attr)) { + this._super(record, json, relationship); + return; + } + var includeIds = this.hasSerializeIdsOption(attr); + var includeRecords = this.hasSerializeRecordsOption(attr); + var embeddedRecord = record.get(attr); + var key; + if (includeIds) { + key = this.keyForRelationship(attr, relationship.kind); + if (!embeddedRecord) { + json[key] = null; + } else { + json[key] = get(embeddedRecord, 'id'); + } + } else if (includeRecords) { + key = this.keyForAttribute(attr); + if (!embeddedRecord) { + json[key] = null; + } else { + json[key] = embeddedRecord.serialize({includeId: true}); + this.removeEmbeddedForeignKey(record, embeddedRecord, relationship, json[key]); + } + } + }, + + /** + Serialize `hasMany` relationship when it is configured as embedded objects. + + This example of a post model has many comments: + + ```js + Post = DS.Model.extend({ + title: DS.attr('string'), + body: DS.attr('string'), + comments: DS.hasMany('comment') + }); + + Comment = DS.Model.extend({ + body: DS.attr('string'), + post: DS.belongsTo('post') + }); + ``` + + Use a custom (type) serializer for the post model to configure embedded comments + + ```js + App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { + attrs: { + comments: {embedded: 'always'} + } + }) + ``` + + A payload with an attribute configured for embedded records can serialize + the records together under the root attribute's payload: + + ```js + { + "post": { + "id": "1" + "title": "Rails is omakase", + "body": "I want this for my ORM, I want that for my template language..." + "comments": [{ + "id": "1", + "body": "Rails is unagi" + }, { + "id": "2", + "body": "Omakase O_o" + }] + } + } + ``` + + The attrs options object can use more specific instruction for extracting and + serializing. When serializing, an option to embed `ids` or `records` can be set. + When extracting the only option is `records`. + + So `{embedded: 'always'}` is shorthand for: + `{serialize: 'records', deserialize: 'records'}` + + To embed the `ids` for a related object (using a hasMany relationship): + + ```js + App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { + attrs: { + comments: {serialize: 'ids', deserialize: 'records'} + } + }) + ``` + + ```js + { + "post": { + "id": "1" + "title": "Rails is omakase", + "body": "I want this for my ORM, I want that for my template language..." + "comments": ["1", "2"] + } + } + ``` + + @method serializeHasMany + @param {DS.Model} record + @param {Object} json + @param {Object} relationship + */ + serializeHasMany: function(record, json, relationship) { + var attr = relationship.key; + var attrs = this.get('attrs'); + if (this.noSerializeOptionSpecified(attr)) { + this._super(record, json, relationship); + return; + } + var includeIds = this.hasSerializeIdsOption(attr); + var includeRecords = this.hasSerializeRecordsOption(attr); + var key; + if (includeIds) { + key = this.keyForRelationship(attr, relationship.kind); + json[key] = get(record, attr).mapBy('id'); + } else if (includeRecords) { + key = this.keyForAttribute(attr); + json[key] = get(record, attr).map(function(embeddedRecord) { + var serializedEmbeddedRecord = embeddedRecord.serialize({includeId: true}); + this.removeEmbeddedForeignKey(record, embeddedRecord, relationship, serializedEmbeddedRecord); + return serializedEmbeddedRecord; + }, this); + } + }, + + /** + When serializing an embedded record, modify the property (in the json payload) + that refers to the parent record (foreign key for relationship). + + Serializing a `belongsTo` relationship removes the property that refers to the + parent record + + Serializing a `hasMany` relationship does not remove the property that refers to + the parent record. + + @method removeEmbeddedForeignKey + @param {DS.Model} record + @param {DS.Model} embeddedRecord + @param {Object} relationship + @param {Object} json + */ + removeEmbeddedForeignKey: function (record, embeddedRecord, relationship, json) { + if (relationship.kind === 'hasMany') { + return; + } else if (relationship.kind === 'belongsTo') { + var parentRecord = record.constructor.inverseFor(relationship.key); + if (parentRecord) { + var name = parentRecord.name; + var embeddedSerializer = this.store.serializerFor(embeddedRecord.constructor); + var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind); + if (parentKey) { + delete json[parentKey]; + } + } + } + }, + + // checks config for attrs option to embedded (always) - serialize and deserialize + hasEmbeddedAlwaysOption: function (attr) { + var option = this.attrsOption(attr); + return option && option.embedded === 'always'; + }, + + // checks config for attrs option to serialize ids + hasSerializeRecordsOption: function(attr) { + var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr); + var option = this.attrsOption(attr); + return alwaysEmbed || (option && (option.serialize === 'records')); + }, + + // checks config for attrs option to serialize records + hasSerializeIdsOption: function(attr) { + var option = this.attrsOption(attr); + return option && (option.serialize === 'ids' || option.serialize === 'id'); + }, + + // checks config for attrs option to serialize records + noSerializeOptionSpecified: function(attr) { + var option = this.attrsOption(attr); + var serializeRecords = this.hasSerializeRecordsOption(attr); + var serializeIds = this.hasSerializeIdsOption(attr); + return !(option && (option.serialize || option.embedded)); + }, + + // checks config for attrs option to deserialize records + // a defined option object for a resource is treated the same as + // `deserialize: 'records'` + hasDeserializeRecordsOption: function(attr) { + var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr); + var option = this.attrsOption(attr); + return alwaysEmbed || (option && option.deserialize === 'records'); + }, + + attrsOption: function(attr) { + var attrs = this.get('attrs'); + return attrs && (attrs[camelize(attr)] || attrs[attr]); + } + }); + + // chooses a relationship kind to branch which function is used to update payload + // does not change payload if attr is not embedded + function extractEmbeddedRecords(serializer, store, type, partial) { + + type.eachRelationship(function(key, relationship) { + if (serializer.hasDeserializeRecordsOption(key)) { + var embeddedType = store.modelFor(relationship.type.typeKey); + if (relationship.kind === "hasMany") { + extractEmbeddedHasMany(store, key, embeddedType, partial); + } + if (relationship.kind === "belongsTo") { + extractEmbeddedBelongsTo(store, key, embeddedType, partial); + } + } + }); + + return partial; + } + + // handles embedding for `hasMany` relationship + function extractEmbeddedHasMany(store, key, embeddedType, hash) { + if (!hash[key]) { + return hash; + } + + var ids = []; + + var embeddedSerializer = store.serializerFor(embeddedType.typeKey); + forEach(hash[key], function(data) { + var embeddedRecord = embeddedSerializer.normalize(embeddedType, data, null); + store.push(embeddedType, embeddedRecord); + ids.push(embeddedRecord.id); + }); + + hash[key] = ids; + return hash; + } + + function extractEmbeddedBelongsTo(store, key, embeddedType, hash) { + if (!hash[key]) { + return hash; + } + + var embeddedSerializer = store.serializerFor(embeddedType.typeKey); + var embeddedRecord = embeddedSerializer.normalize(embeddedType, hash[key], null); + store.push(embeddedType, embeddedRecord); + + hash[key] = embeddedRecord.id; + //TODO Need to add a reference to the parent later so relationship works between both `belongsTo` records + return hash; + } + + __exports__["default"] = EmbeddedRecordsMixin; + }); +define("ember-data/serializers/json_serializer", + ["ember-data/system/changes","exports"], function(__dependency1__, __exports__) { "use strict"; var RelationshipChange = __dependency1__.RelationshipChange; var get = Ember.get; var set = Ember.set; var isNone = Ember.isNone; - var map = Ember.ArrayPolyfills.map; + var map = Ember.ArrayPolyfills.map; + var merge = Ember.merge; /** In Ember Data a Serializer is used to serialize and deserialize @@ -2619,6 +2659,30 @@ define("ember-data/lib/serializers/json_serializer", }); ``` + You can also remove attributes by setting the `serialize` key to + false in your mapping object. + + Example + + ```javascript + App.PersonSerializer = DS.JSONSerializer.extend({ + attrs: { + admin: {serialize: false}, + occupation: {key: 'career'} + } + }); + ``` + + When serialized: + + ```javascript + { + "career": "magician" + } + ``` + + Note that the `admin` is now not included in the payload. + @property attrs @type {Object} */ @@ -2638,6 +2702,8 @@ define("ember-data/lib/serializers/json_serializer", */ applyTransforms: function(type, data) { type.eachTransformedAttribute(function(key, type) { + if (!data.hasOwnProperty(key)) { return; } + var transform = this.transformFor(type); data[key] = transform.deserialize(data[key]); }, this); @@ -2684,11 +2750,76 @@ define("ember-data/lib/serializers/json_serializer", if (!hash) { return hash; } this.normalizeId(hash); + this.normalizeAttributes(type, hash); + this.normalizeRelationships(type, hash); + this.normalizeUsingDeclaredMapping(type, hash); this.applyTransforms(type, hash); return hash; }, + /** + You can use this method to normalize all payloads, regardless of whether they + represent single records or an array. + + For example, you might want to remove some extraneous data from the payload: + + ```js + App.ApplicationSerializer = DS.JSONSerializer.extend({ + normalizePayload: function(payload) { + delete payload.version; + delete payload.status; + return payload; + } + }); + ``` + + @method normalizePayload + @param {Object} payload + @return {Object} the normalized payload + */ + normalizePayload: function(payload) { + return payload; + }, + + /** + @method normalizeAttributes + @private + */ + normalizeAttributes: function(type, hash) { + var payloadKey, key; + + if (this.keyForAttribute) { + type.eachAttribute(function(key) { + payloadKey = this.keyForAttribute(key); + if (key === payloadKey) { return; } + if (!hash.hasOwnProperty(payloadKey)) { return; } + + hash[key] = hash[payloadKey]; + delete hash[payloadKey]; + }, this); + } + }, + + /** + @method normalizeRelationships + @private + */ + normalizeRelationships: function(type, hash) { + var payloadKey, key; + + if (this.keyForRelationship) { + type.eachRelationship(function(key, relationship) { + payloadKey = this.keyForRelationship(key, relationship.kind); + if (key === payloadKey) { return; } + if (!hash.hasOwnProperty(payloadKey)) { return; } + + hash[key] = hash[payloadKey]; + delete hash[payloadKey]; + }, this); + } + }, + /** @method normalizeUsingDeclaredMapping @private @@ -2698,17 +2829,17 @@ define("ember-data/lib/serializers/json_serializer", if (attrs) { for (key in attrs) { - payloadKey = attrs[key]; - if (payloadKey && payloadKey.key) { - payloadKey = payloadKey.key; - } - if (typeof payloadKey === 'string') { + payloadKey = this._getMappedKey(key); + if (!hash.hasOwnProperty(payloadKey)) { continue; } + + if (payloadKey !== key) { hash[key] = hash[payloadKey]; delete hash[payloadKey]; } } } }, + /** @method normalizeId @private @@ -2722,6 +2853,33 @@ define("ember-data/lib/serializers/json_serializer", delete hash[primaryKey]; }, + /** + Looks up the property key that was set by the custom `attr` mapping + passed to the serializer. + + @method _getMappedKey + @private + @param {String} key + @return {String} key + */ + _getMappedKey: function(key) { + var attrs = get(this, 'attrs'); + var mappedKey; + if (attrs && attrs[key]) { + mappedKey = attrs[key]; + //We need to account for both the {title: 'post_title'} and + //{title: {key: 'post_title'}} forms + if (mappedKey.key){ + mappedKey = mappedKey.key; + } + if (typeof mappedKey === 'string'){ + key = mappedKey; + } + } + + return key; + }, + // SERIALIZE /** Called when a record is saved in order to convert the @@ -2892,6 +3050,34 @@ define("ember-data/lib/serializers/json_serializer", return json; }, + /** + You can use this method to customize how a serialized record is added to the complete + JSON hash to be sent to the server. By default the JSON Serializer does not namespace + the payload and just sends the raw serialized JSON object. + If your server expects namespaced keys, you should consider using the RESTSerializer. + Otherwise you can override this method to customize how the record is added to the hash. + + For example, your server may expect underscored root objects. + + ```js + App.ApplicationSerializer = DS.RESTSerializer.extend({ + serializeIntoHash: function(data, type, record, options) { + var root = Ember.String.decamelize(type.typeKey); + data[root] = this.serialize(record, options); + } + }); + ``` + + @method serializeIntoHash + @param {Object} hash + @param {subclass of DS.Model} type + @param {DS.Model} record + @param {Object} options + */ + serializeIntoHash: function(hash, type, record, options) { + merge(hash, this.serialize(record, options)); + }, + /** `serializeAttribute` can be used to customize how `DS.attr` properties are serialized @@ -2925,11 +3111,20 @@ define("ember-data/lib/serializers/json_serializer", value = transform.serialize(value); } + // If attrs.key.serialize is false, do not include the value in the + // response to the server at all. + if (attrs && attrs[key] && attrs[key].serialize === false) { + return; + } // if provided, use the mapping provided by `attrs` in // the serializer - key = attrs && attrs[key] || (this.keyForAttribute ? this.keyForAttribute(key) : key); + var payloadKey = this._getMappedKey(key); - json[key] = value; + if (payloadKey === key && this.keyForAttribute) { + payloadKey = this.keyForAttribute(key); + } + + json[payloadKey] = value; }, /** @@ -2958,15 +3153,21 @@ define("ember-data/lib/serializers/json_serializer", @param {Object} relationship */ serializeBelongsTo: function(record, json, relationship) { + var attrs = get(this, 'attrs'); var key = relationship.key; var belongsTo = get(record, key); - key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key; + // if provided, use the mapping provided by `attrs` in + // the serializer + var payloadKey = this._getMappedKey(key); + if (payloadKey === key && this.keyForRelationship) { + payloadKey = this.keyForRelationship(key, "belongsTo"); + } if (isNone(belongsTo)) { - json[key] = belongsTo; + json[payloadKey] = belongsTo; } else { - json[key] = get(belongsTo, 'id'); + json[payloadKey] = get(belongsTo, 'id'); } if (relationship.options.polymorphic) { @@ -2999,8 +3200,17 @@ define("ember-data/lib/serializers/json_serializer", @param {Object} relationship */ serializeHasMany: function(record, json, relationship) { + var attrs = get(this, 'attrs'); var key = relationship.key; - var payloadKey = this.keyForRelationship ? this.keyForRelationship(key, "hasMany") : key; + var payloadKey; + + // if provided, use the mapping provided by `attrs` in + // the serializer + payloadKey = this._getMappedKey(key); + if (payloadKey === key && this.keyForRelationship) { + payloadKey = this.keyForRelationship(key, "hasMany"); + } + var relationshipType = RelationshipChange.determineRelationshipType(record.constructor, relationship); if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany') { @@ -3085,10 +3295,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Array} array An array of deserialized objects */ - extractFindAll: function(store, type, payload){ - return this.extractArray(store, type, payload); + extractFindAll: function(store, type, payload, id, requestType){ + return this.extractArray(store, type, payload, id, requestType); }, /** `extractFindQuery` is a hook into the extract method used when a @@ -3099,10 +3311,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Array} array An array of deserialized objects */ - extractFindQuery: function(store, type, payload){ - return this.extractArray(store, type, payload); + extractFindQuery: function(store, type, payload, id, requestType){ + return this.extractArray(store, type, payload, id, requestType); }, /** `extractFindMany` is a hook into the extract method used when a @@ -3113,10 +3327,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Array} array An array of deserialized objects */ - extractFindMany: function(store, type, payload){ - return this.extractArray(store, type, payload); + extractFindMany: function(store, type, payload, id, requestType){ + return this.extractArray(store, type, payload, id, requestType); }, /** `extractFindHasMany` is a hook into the extract method used when a @@ -3127,10 +3343,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Array} array An array of deserialized objects */ - extractFindHasMany: function(store, type, payload){ - return this.extractArray(store, type, payload); + extractFindHasMany: function(store, type, payload, id, requestType){ + return this.extractArray(store, type, payload, id, requestType); }, /** @@ -3142,10 +3360,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractCreateRecord: function(store, type, payload) { - return this.extractSave(store, type, payload); + extractCreateRecord: function(store, type, payload, id, requestType) { + return this.extractSave(store, type, payload, id, requestType); }, /** `extractUpdateRecord` is a hook into the extract method used when @@ -3156,10 +3376,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractUpdateRecord: function(store, type, payload) { - return this.extractSave(store, type, payload); + extractUpdateRecord: function(store, type, payload, id, requestType) { + return this.extractSave(store, type, payload, id, requestType); }, /** `extractDeleteRecord` is a hook into the extract method used when @@ -3170,10 +3392,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractDeleteRecord: function(store, type, payload) { - return this.extractSave(store, type, payload); + extractDeleteRecord: function(store, type, payload, id, requestType) { + return this.extractSave(store, type, payload, id, requestType); }, /** @@ -3185,10 +3409,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractFind: function(store, type, payload) { - return this.extractSingle(store, type, payload); + extractFind: function(store, type, payload, id, requestType) { + return this.extractSingle(store, type, payload, id, requestType); }, /** `extractFindBelongsTo` is a hook into the extract method used when @@ -3199,10 +3425,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractFindBelongsTo: function(store, type, payload) { - return this.extractSingle(store, type, payload); + extractFindBelongsTo: function(store, type, payload, id, requestType) { + return this.extractSingle(store, type, payload, id, requestType); }, /** `extractSave` is a hook into the extract method used when a call @@ -3213,10 +3441,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractSave: function(store, type, payload) { - return this.extractSingle(store, type, payload); + extractSave: function(store, type, payload, id, requestType) { + return this.extractSingle(store, type, payload, id, requestType); }, /** @@ -3240,9 +3470,12 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Object} json The deserialized payload */ - extractSingle: function(store, type, payload) { + extractSingle: function(store, type, payload, id, requestType) { + payload = this.normalizePayload(payload); return this.normalize(type, payload); }, @@ -3266,11 +3499,15 @@ define("ember-data/lib/serializers/json_serializer", @param {DS.Store} store @param {subclass of DS.Model} type @param {Object} payload + @param {String or Number} id + @param {String} requestType @return {Array} array An array of deserialized objects */ - extractArray: function(store, type, arrayPayload) { + extractArray: function(store, type, arrayPayload, id, requestType) { + var normalizedPayload = this.normalizePayload(arrayPayload); var serializer = this; - return map.call(arrayPayload, function(singlePayload) { + + return map.call(normalizedPayload, function(singlePayload) { return serializer.normalize(type, singlePayload); }); }, @@ -3323,7 +3560,9 @@ define("ember-data/lib/serializers/json_serializer", @param {String} key @return {String} normalized key */ - + keyForAttribute: function(key){ + return key; + }, /** `keyForRelationship` can be used to define a custom key when @@ -3346,6 +3585,10 @@ define("ember-data/lib/serializers/json_serializer", @return {String} normalized key */ + keyForRelationship: function(key, type){ + return key; + }, + // HELPERS /** @@ -3362,8 +3605,8 @@ define("ember-data/lib/serializers/json_serializer", } }); }); -define("ember-data/lib/serializers/rest_serializer", - ["./json_serializer","ember-inflector/lib/system/string","exports"], +define("ember-data/serializers/rest_serializer", + ["ember-data/serializers/json_serializer","ember-inflector/system/string","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; /** @@ -3552,65 +3795,6 @@ define("ember-data/lib/serializers/rest_serializer", return hash; }, - /** - You can use this method to normalize all payloads, regardless of whether they - represent single records or an array. - - For example, you might want to remove some extraneous data from the payload: - - ```js - App.ApplicationSerializer = DS.RESTSerializer.extend({ - normalizePayload: function(payload) { - delete payload.version; - delete payload.status; - return payload; - } - }); - ``` - - @method normalizePayload - @param {Object} payload - @return {Object} the normalized payload - */ - normalizePayload: function(payload) { - return payload; - }, - - /** - @method normalizeAttributes - @private - */ - normalizeAttributes: function(type, hash) { - var payloadKey, key; - - if (this.keyForAttribute) { - type.eachAttribute(function(key) { - payloadKey = this.keyForAttribute(key); - if (key === payloadKey) { return; } - - hash[key] = hash[payloadKey]; - delete hash[payloadKey]; - }, this); - } - }, - - /** - @method normalizeRelationships - @private - */ - normalizeRelationships: function(type, hash) { - var payloadKey, key; - - if (this.keyForRelationship) { - type.eachRelationship(function(key, relationship) { - payloadKey = this.keyForRelationship(key, relationship.kind); - if (key === payloadKey) { return; } - - hash[key] = hash[payloadKey]; - delete hash[payloadKey]; - }, this); - } - }, /** Called when the server has returned a payload representing @@ -3790,7 +3974,7 @@ define("ember-data/lib/serializers/rest_serializer", comments.push(comment); postCache[comment.post_id].comments.push(comment); delete comment.post_id; - } + }); payload = { comments: comments, posts: payload }; @@ -4154,8 +4338,8 @@ define("ember-data/lib/serializers/rest_serializer", } }); }); -define("ember-data/lib/setup-container", - ["./initializers/store","./initializers/transforms","./initializers/store_injections","./initializers/data_adapter","../../../activemodel-adapter/lib/setup-container","exports"], +define("ember-data/setup-container", + ["ember-data/initializers/store","ember-data/initializers/transforms","ember-data/initializers/store_injections","ember-data/initializers/data_adapter","activemodel-adapter/setup-container","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; var initializeStore = __dependency1__["default"]; @@ -4176,7 +4360,7 @@ define("ember-data/lib/setup-container", setupActiveModelContainer(container, application); }; }); -define("ember-data/lib/system/adapter", +define("ember-data/system/adapter", ["exports"], function(__exports__) { "use strict"; @@ -4313,7 +4497,7 @@ define("ember-data/lib/system/adapter", set the `defaultSerializer` property to be the name of the custom serializer. - Note the `defaultSerializer` serializer has a lower priority then + Note the `defaultSerializer` serializer has a lower priority than a model specific serializer (i.e. `PostSerializer`) or the `application` serializer. @@ -4339,7 +4523,7 @@ define("ember-data/lib/system/adapter", ```javascript App.ApplicationAdapter = DS.Adapter.extend({ find: function(store, type, id) { - var url = [type, id].join('/'); + var url = [type.typeKey, id].join('/'); return new Ember.RSVP.Promise(function(resolve, reject) { jQuery.getJSON(url).then(function(data) { @@ -4599,42 +4783,43 @@ define("ember-data/lib/system/adapter", deleteRecord: Ember.required(Function), /** - Find multiple records at once. + By default the store will try to coalesce all `fetchRecord` calls within the same runloop + into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call. + You can opt out of this behaviour by either not implementing the findMany hook or by setting + coalesceFindRequests to false - By default, it loops over the provided ids and calls `find` on each. - May be overwritten to improve performance and reduce the number of - server requests. + @property coalesceFindRequests + @type {boolean} + */ + coalesceFindRequests: true, - Example - - ```javascript - App.ApplicationAdapter = DS.Adapter.extend({ - findMany: function(store, type, ids) { - var url = type; - return new Ember.RSVP.Promise(function(resolve, reject) { - jQuery.getJSON(url, {ids: ids}).then(function(data) { - Ember.run(null, resolve, data); - }, function(jqXHR) { - jqXHR.then = null; // tame jQuery's ill mannered promises - Ember.run(null, reject, jqXHR); - }); - }); - } - }); - ``` + /** + Find multiple records at once if coalesceFindRequests is true @method findMany @param {DS.Store} store @param {subclass of DS.Model} type the DS.Model class of the records @param {Array} ids + @param {Array} records @return {Promise} promise */ - findMany: function(store, type, ids) { - var promises = map.call(ids, function(id) { - return this.find(store, type, id); - }, this); - return Ember.RSVP.all(promises); + /** + Organize records into groups, each of which is to be passed to separate + calls to `findMany`. + + For example, if your api has nested URLs that depend on the parent, you will + want to group records by their parent. + + The default implementation returns the records as a single group. + + @method groupRecordsForFindMany + @param {Array} records + @return {Array} an array of arrays of records, each of which is to be + loaded separately by `findMany`. + */ + groupRecordsForFindMany: function (store, records) { + return [records]; } }); @@ -4642,8 +4827,8 @@ define("ember-data/lib/system/adapter", __exports__.Adapter = Adapter; __exports__["default"] = Adapter; }); -define("ember-data/lib/system/changes", - ["./changes/relationship_change","exports"], +define("ember-data/system/changes", + ["ember-data/system/changes/relationship_change","exports"], function(__dependency1__, __exports__) { "use strict"; /** @@ -4666,15 +4851,16 @@ define("ember-data/lib/system/changes", __exports__.OneToOneChange = OneToOneChange; __exports__.ManyToManyChange = ManyToManyChange; }); -define("ember-data/lib/system/changes/relationship_change", - ["../model","exports"], - function(__dependency1__, __exports__) { +define("ember-data/system/changes/relationship_change", + ["ember-data/system/model/model","ember-data/system/relationship-meta","exports"], + function(__dependency1__, __dependency2__, __exports__) { "use strict"; /** @module ember-data */ - var Model = __dependency1__.Model; + var Model = __dependency1__["default"]; + var isSyncRelationship = __dependency2__.isSyncRelationship; var get = Ember.get; var set = Ember.set; @@ -4740,53 +4926,51 @@ define("ember-data/lib/system/changes/relationship_change", var ManyToManyChange = {}; RelationshipChange._createChange = function(options){ - if(options.changeType === "add"){ + if (options.changeType === 'add') { return RelationshipChangeAdd.create(options); } - if(options.changeType === "remove"){ + if (options.changeType === 'remove') { return RelationshipChangeRemove.create(options); } }; - RelationshipChange.determineRelationshipType = function(recordType, knownSide){ var knownKey = knownSide.key, key, otherKind; var knownKind = knownSide.kind; var inverse = recordType.inverseFor(knownKey); - if (inverse){ + if (inverse) { key = inverse.name; otherKind = inverse.kind; } - if (!inverse){ - return knownKind === "belongsTo" ? "oneToNone" : "manyToNone"; + if (!inverse) { + return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone'; } else { - if(otherKind === "belongsTo"){ - return knownKind === "belongsTo" ? "oneToOne" : "manyToOne"; + if (otherKind === 'belongsTo') { + return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne'; } else { - return knownKind === "belongsTo" ? "oneToMany" : "manyToMany"; + return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany'; } } - }; RelationshipChange.createChange = function(firstRecord, secondRecord, store, options){ // Get the type of the child based on the child's client ID var firstRecordType = firstRecord.constructor, changeType; changeType = RelationshipChange.determineRelationshipType(firstRecordType, options); - if (changeType === "oneToMany"){ + if (changeType === 'oneToMany') { return OneToManyChange.createChange(firstRecord, secondRecord, store, options); - } else if (changeType === "manyToOne"){ + } else if (changeType === 'manyToOne') { return OneToManyChange.createChange(secondRecord, firstRecord, store, options); - } else if (changeType === "oneToNone"){ + } else if (changeType === 'oneToNone') { return OneToNoneChange.createChange(firstRecord, secondRecord, store, options); - } else if (changeType === "manyToNone"){ + } else if (changeType === 'manyToNone') { return ManyToNoneChange.createChange(firstRecord, secondRecord, store, options); - } else if (changeType === "oneToOne"){ + } else if (changeType === 'oneToOne') { return OneToOneChange.createChange(firstRecord, secondRecord, store, options); - } else if (changeType === "manyToMany"){ + } else if (changeType === 'manyToMany') { return ManyToManyChange.createChange(firstRecord, secondRecord, store, options); } }; @@ -4794,13 +4978,13 @@ define("ember-data/lib/system/changes/relationship_change", OneToNoneChange.createChange = function(childRecord, parentRecord, store, options) { var key = options.key; var change = RelationshipChange._createChange({ - parentRecord: parentRecord, - childRecord: childRecord, - firstRecord: childRecord, - store: store, - changeType: options.changeType, - firstRecordName: key, - firstRecordKind: "belongsTo" + parentRecord: parentRecord, + childRecord: childRecord, + firstRecord: childRecord, + store: store, + changeType: options.changeType, + firstRecordName: key, + firstRecordKind: 'belongsTo' }); store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change); @@ -4811,13 +4995,13 @@ define("ember-data/lib/system/changes/relationship_change", ManyToNoneChange.createChange = function(childRecord, parentRecord, store, options) { var key = options.key; var change = RelationshipChange._createChange({ - parentRecord: childRecord, - childRecord: parentRecord, - secondRecord: childRecord, - store: store, - changeType: options.changeType, - secondRecordName: options.key, - secondRecordKind: "hasMany" + parentRecord: childRecord, + childRecord: parentRecord, + secondRecord: childRecord, + store: store, + changeType: options.changeType, + secondRecordName: options.key, + secondRecordKind: 'hasMany' }); store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change); @@ -4833,20 +5017,19 @@ define("ember-data/lib/system/changes/relationship_change", var key = options.key; var change = RelationshipChange._createChange({ - parentRecord: parentRecord, - childRecord: childRecord, - firstRecord: childRecord, - secondRecord: parentRecord, - firstRecordKind: "hasMany", - secondRecordKind: "hasMany", - store: store, - changeType: options.changeType, - firstRecordName: key + parentRecord: parentRecord, + childRecord: childRecord, + firstRecord: childRecord, + secondRecord: parentRecord, + firstRecordKind: 'hasMany', + secondRecordKind: 'hasMany', + store: store, + changeType: options.changeType, + firstRecordName: key }); store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change); - return change; }; @@ -4862,19 +5045,19 @@ define("ember-data/lib/system/changes/relationship_change", } else if (options.key) { key = options.key; } else { - Ember.assert("You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent", false); + Ember.assert('You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent', false); } var change = RelationshipChange._createChange({ - parentRecord: parentRecord, - childRecord: childRecord, - firstRecord: childRecord, - secondRecord: parentRecord, - firstRecordKind: "belongsTo", - secondRecordKind: "belongsTo", - store: store, - changeType: options.changeType, - firstRecordName: key + parentRecord: parentRecord, + childRecord: childRecord, + firstRecord: childRecord, + secondRecord: parentRecord, + firstRecordKind: 'belongsTo', + secondRecordKind: 'belongsTo', + store: store, + changeType: options.changeType, + firstRecordName: key }); store.addRelationshipChangeFor(childRecord, key, parentRecord, null, change); @@ -4883,17 +5066,17 @@ define("ember-data/lib/system/changes/relationship_change", }; OneToOneChange.maintainInvariant = function(options, store, childRecord, key){ - if (options.changeType === "add" && store.recordIsMaterialized(childRecord)) { + if (options.changeType === 'add' && store.recordIsMaterialized(childRecord)) { var oldParent = get(childRecord, key); - if (oldParent){ + if (oldParent) { var correspondingChange = OneToOneChange.createChange(childRecord, oldParent, store, { - parentType: options.parentType, - hasManyName: options.hasManyName, - changeType: "remove", - key: options.key - }); + parentType: options.parentType, + hasManyName: options.hasManyName, + changeType: 'remove', + key: options.key + }); store.addRelationshipChangeFor(childRecord, key, options.parentRecord , null, correspondingChange); - correspondingChange.sync(); + correspondingChange.sync(); } } }; @@ -4911,19 +5094,19 @@ define("ember-data/lib/system/changes/relationship_change", } else if (options.key) { key = options.key; } else { - Ember.assert("You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent", false); + Ember.assert('You must pass either a parentType or belongsToName option to OneToManyChange.forChildAndParent', false); } var change = RelationshipChange._createChange({ - parentRecord: parentRecord, - childRecord: childRecord, - firstRecord: childRecord, - secondRecord: parentRecord, - firstRecordKind: "belongsTo", - secondRecordKind: "hasMany", - store: store, - changeType: options.changeType, - firstRecordName: key + parentRecord: parentRecord, + childRecord: childRecord, + firstRecord: childRecord, + secondRecord: parentRecord, + firstRecordKind: 'belongsTo', + secondRecordKind: 'hasMany', + store: store, + changeType: options.changeType, + firstRecordName: key }); store.addRelationshipChangeFor(childRecord, key, parentRecord, change.getSecondRecordName(), change); @@ -4931,17 +5114,16 @@ define("ember-data/lib/system/changes/relationship_change", return change; }; - OneToManyChange.maintainInvariant = function(options, store, childRecord, key){ - if (options.changeType === "add" && childRecord) { + if (options.changeType === 'add' && childRecord) { var oldParent = get(childRecord, key); - if (oldParent){ + if (oldParent) { var correspondingChange = OneToManyChange.createChange(childRecord, oldParent, store, { - parentType: options.parentType, - hasManyName: options.hasManyName, - changeType: "remove", - key: options.key - }); + parentType: options.parentType, + hasManyName: options.hasManyName, + changeType: 'remove', + key: options.key + }); store.addRelationshipChangeFor(childRecord, key, options.parentRecord, correspondingChange.getSecondRecordName(), correspondingChange); correspondingChange.sync(); } @@ -4953,7 +5135,6 @@ define("ember-data/lib/system/changes/relationship_change", @namespace DS */ RelationshipChange.prototype = { - getSecondRecordName: function() { var name = this.secondRecordName, parent; @@ -4976,8 +5157,7 @@ define("ember-data/lib/system/changes/relationship_change", @return {String} */ getFirstRecordName: function() { - var name = this.firstRecordName; - return name; + return this.firstRecordName; }, /** @@ -5007,10 +5187,10 @@ define("ember-data/lib/system/changes/relationship_change", coalesce: function(){ var relationshipPairs = this.store.relationshipChangePairsFor(this.firstRecord); - forEach(relationshipPairs, function(pair){ - var addedChange = pair["add"]; - var removedChange = pair["remove"]; - if(addedChange && removedChange) { + forEach(relationshipPairs, function(pair) { + var addedChange = pair['add']; + var removedChange = pair['remove']; + if (addedChange && removedChange) { addedChange.destroy(); removedChange.destroy(); } @@ -5021,12 +5201,7 @@ define("ember-data/lib/system/changes/relationship_change", RelationshipChangeAdd.prototype = Ember.create(RelationshipChange.create({})); RelationshipChangeRemove.prototype = Ember.create(RelationshipChange.create({})); - // the object is a value, and not a promise - function isValue(object) { - return typeof object === 'object' && (!object.then || typeof object.then !== 'function'); - } - - RelationshipChangeAdd.prototype.changeType = "add"; + RelationshipChangeAdd.prototype.changeType = 'add'; RelationshipChangeAdd.prototype.sync = function() { var secondRecordName = this.getSecondRecordName(); var firstRecordName = this.getFirstRecordName(); @@ -5037,38 +5212,34 @@ define("ember-data/lib/system/changes/relationship_change", //Ember.assert("You specified a belongsTo (" + belongsToName + ") on " + child.constructor + " but did not specify an inverse hasMany on " + (!hasManyName && (newParent || oldParent || this.lastParentRecord).constructor), hasManyName); if (secondRecord instanceof Model && firstRecord instanceof Model) { - if(this.secondRecordKind === "belongsTo"){ - secondRecord.suspendRelationshipObservers(function(){ + if (this.secondRecordKind === 'belongsTo') { + secondRecord.suspendRelationshipObservers(function() { set(secondRecord, secondRecordName, firstRecord); }); - - } - else if(this.secondRecordKind === "hasMany"){ - secondRecord.suspendRelationshipObservers(function(){ + } else if (this.secondRecordKind === 'hasMany' && isSyncRelationship(secondRecord, secondRecordName)) { + secondRecord.suspendRelationshipObservers(function() { var relationship = get(secondRecord, secondRecordName); - if (isValue(relationship)) { relationship.addObject(firstRecord); } + relationship.addObject(firstRecord); }); } } if (firstRecord instanceof Model && secondRecord instanceof Model && get(firstRecord, firstRecordName) !== secondRecord) { - if(this.firstRecordKind === "belongsTo"){ - firstRecord.suspendRelationshipObservers(function(){ + if (this.firstRecordKind === 'belongsTo') { + firstRecord.suspendRelationshipObservers(function() { set(firstRecord, firstRecordName, secondRecord); }); - } - else if(this.firstRecordKind === "hasMany"){ - firstRecord.suspendRelationshipObservers(function(){ + } else if (this.firstRecordKind === 'hasMany' && isSyncRelationship(secondRecord, secondRecordName)) { + firstRecord.suspendRelationshipObservers(function() { var relationship = get(firstRecord, firstRecordName); - if (isValue(relationship)) { relationship.addObject(secondRecord); } + relationship.addObject(secondRecord); }); } } - this.coalesce(); }; - RelationshipChangeRemove.prototype.changeType = "remove"; + RelationshipChangeRemove.prototype.changeType = 'remove'; RelationshipChangeRemove.prototype.sync = function() { var secondRecordName = this.getSecondRecordName(); var firstRecordName = this.getFirstRecordName(); @@ -5079,29 +5250,27 @@ define("ember-data/lib/system/changes/relationship_change", //Ember.assert("You specified a belongsTo (" + belongsToName + ") on " + child.constructor + " but did not specify an inverse hasMany on " + (!hasManyName && (newParent || oldParent || this.lastParentRecord).constructor), hasManyName); if (secondRecord instanceof Model && firstRecord instanceof Model) { - if(this.secondRecordKind === "belongsTo"){ - secondRecord.suspendRelationshipObservers(function(){ + if (this.secondRecordKind === 'belongsTo') { + secondRecord.suspendRelationshipObservers(function() { set(secondRecord, secondRecordName, null); }); - } - else if(this.secondRecordKind === "hasMany"){ - secondRecord.suspendRelationshipObservers(function(){ + } else if (this.secondRecordKind === 'hasMany' && isSyncRelationship(secondRecord, secondRecordName)) { + secondRecord.suspendRelationshipObservers(function() { var relationship = get(secondRecord, secondRecordName); - if (isValue(relationship)) { relationship.removeObject(firstRecord); } + relationship.removeObject(firstRecord); }); } } if (firstRecord instanceof Model && get(firstRecord, firstRecordName)) { - if(this.firstRecordKind === "belongsTo"){ - firstRecord.suspendRelationshipObservers(function(){ + if (this.firstRecordKind === 'belongsTo') { + firstRecord.suspendRelationshipObservers(function() { set(firstRecord, firstRecordName, null); }); - } - else if(this.firstRecordKind === "hasMany"){ - firstRecord.suspendRelationshipObservers(function(){ - var relationship = get(firstRecord, firstRecordName); - if (isValue(relationship)) { relationship.removeObject(secondRecord); } + } else if (this.firstRecordKind === 'hasMany' && isSyncRelationship(firstRecord, firstRecordName)) { + firstRecord.suspendRelationshipObservers(function() { + var relationship = get(firstRecord, firstRecordName); + relationship.removeObject(secondRecord); }); } } @@ -5117,7 +5286,7 @@ define("ember-data/lib/system/changes/relationship_change", __exports__.OneToOneChange = OneToOneChange; __exports__.ManyToManyChange = ManyToManyChange; }); -define("ember-data/lib/system/container_proxy", +define("ember-data/system/container_proxy", ["exports"], function(__exports__) { "use strict"; @@ -5159,10 +5328,12 @@ define("ember-data/lib/system/container_proxy", }; ContainerProxy.prototype.registerDeprecations = function(proxyPairs) { - for (var i = proxyPairs.length; i > 0; i--) { - var proxyPair = proxyPairs[i - 1], - deprecated = proxyPair['deprecated'], - valid = proxyPair['valid']; + var i, proxyPair, deprecated, valid, proxy; + + for (i = proxyPairs.length; i > 0; i--) { + proxyPair = proxyPairs[i - 1]; + deprecated = proxyPair['deprecated']; + valid = proxyPair['valid']; this.registerDeprecation(deprecated, valid); } @@ -5170,8 +5341,8 @@ define("ember-data/lib/system/container_proxy", __exports__["default"] = ContainerProxy; }); -define("ember-data/lib/system/debug", - ["./debug/debug_info","./debug/debug_adapter","exports"], +define("ember-data/system/debug", + ["ember-data/system/debug/debug_info","ember-data/system/debug/debug_adapter","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; /** @@ -5182,8 +5353,8 @@ define("ember-data/lib/system/debug", __exports__["default"] = DebugAdapter; }); -define("ember-data/lib/system/debug/debug_adapter", - ["../model","exports"], +define("ember-data/system/debug/debug_adapter", + ["ember-data/system/model","exports"], function(__dependency1__, __exports__) { "use strict"; /** @@ -5279,8 +5450,8 @@ define("ember-data/lib/system/debug/debug_adapter", }, observeRecord: function(record, recordUpdated) { - var releaseMethods = Ember.A(), self = this, - keysToObserve = Ember.A(['id', 'isNew', 'isDirty']); + var releaseMethods = Ember.A(), self = this; + var keysToObserve = Ember.A(['id', 'isNew', 'isDirty']); record.eachAttribute(function(key) { keysToObserve.push(key); @@ -5305,8 +5476,8 @@ define("ember-data/lib/system/debug/debug_adapter", }); }); -define("ember-data/lib/system/debug/debug_info", - ["../model","exports"], +define("ember-data/system/debug/debug_info", + ["ember-data/system/model","exports"], function(__dependency1__, __exports__) { "use strict"; var Model = __dependency1__.Model; @@ -5379,8 +5550,8 @@ define("ember-data/lib/system/debug/debug_info", __exports__["default"] = Model; }); -define("ember-data/lib/system/model", - ["./model/model","./model/attributes","./model/states","./model/errors","exports"], +define("ember-data/system/model", + ["ember-data/system/model/model","ember-data/system/model/attributes","ember-data/system/model/states","ember-data/system/model/errors","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; /** @@ -5397,8 +5568,8 @@ define("ember-data/lib/system/model", __exports__.attr = attr; __exports__.Errors = Errors; }); -define("ember-data/lib/system/model/attributes", - ["./model","exports"], +define("ember-data/system/model/attributes", + ["ember-data/system/model/model","exports"], function(__dependency1__, __exports__) { "use strict"; var Model = __dependency1__["default"]; @@ -5459,7 +5630,7 @@ define("ember-data/lib/system/model/attributes", }); return map; - }), + }).readOnly(), /** A map whose keys are the attributes of the model (properties @@ -5502,7 +5673,7 @@ define("ember-data/lib/system/model/attributes", }); return map; - }), + }).readOnly(), /** Iterates through the attributes of the model, calling the passed function on each @@ -5707,7 +5878,7 @@ define("ember-data/lib/system/model/attributes", }).meta(meta); }; }); -define("ember-data/lib/system/model/errors", +define("ember-data/system/model/errors", ["exports"], function(__exports__) { "use strict"; @@ -6052,8 +6223,8 @@ define("ember-data/lib/system/model/errors", } }); }); -define("ember-data/lib/system/model/model", - ["./states","./errors","../store","exports"], +define("ember-data/system/model/model", + ["ember-data/system/model/states","ember-data/system/model/errors","ember-data/system/store","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; var RootState = __dependency1__["default"]; @@ -6067,12 +6238,28 @@ define("ember-data/lib/system/model/model", var set = Ember.set; var merge = Ember.merge; var Promise = Ember.RSVP.Promise; + var forEach = Ember.ArrayPolyfills.forEach; var JSONSerializer; var retrieveFromCurrentState = Ember.computed('currentState', function(key, value) { return get(get(this, 'currentState'), key); }).readOnly(); + var _extractPivotNameCache = Object.create(null); + var _splitOnDotCache = Object.create(null); + + function splitOnDot(name) { + return _splitOnDotCache[name] || ( + _splitOnDotCache[name] = name.split('.') + ); + } + + function extractPivotName(name) { + return _extractPivotNameCache[name] || ( + _extractPivotNameCache[name] = splitOnDot(name)[0] + ); + } + /** The model class that all Ember Data records descend from. @@ -6412,7 +6599,7 @@ define("ember-data/lib/system/model/model", @return {Object} A JSON representation of the object. */ toJSON: function(options) { - if (!JSONSerializer) { JSONSerializer = requireModule("ember-data/lib/serializers/json_serializer")["default"]; } + if (!JSONSerializer) { JSONSerializer = requireModule("ember-data/serializers/json_serializer")["default"]; } // container is for lazy transform lookups var serializer = JSONSerializer.create({ container: this.container }); return serializer.serialize(this, options); @@ -6511,17 +6698,16 @@ define("ember-data/lib/system/model/model", // POSSIBLE TODO: Remove this code and replace with // always having direct references to state objects - var pivotName = name.split(".", 1), - currentState = get(this, 'currentState'), - state = currentState; + var pivotName = extractPivotName(name); + var currentState = get(this, 'currentState'); + var state = currentState; do { if (state.exit) { state.exit(this); } state = state.parentState; } while (!state.hasOwnProperty(pivotName)); - var path = name.split("."); - + var path = splitOnDot(name); var setups = [], enters = [], i, l; for (i=0, l=path.length; i= 1); Ember.assert("You may not pass `" + id + "` as id to the store's find method", arguments.length === 1 || !Ember.isNone(id)); @@ -10030,7 +10405,7 @@ define("ember-data/lib/system/store", return this.findQuery(type, id); } - return this.findById(type, coerceId(id)); + return this.findById(type, coerceId(id), preload); }, /** @@ -10042,10 +10417,22 @@ define("ember-data/lib/system/store", @param {String|Integer} id @return {Promise} promise */ - findById: function(typeName, id) { + findById: function(typeName, id, preload) { + var fetchedRecord; + var type = this.modelFor(typeName); var record = this.recordForId(type, id); - var fetchedRecord = this.fetchRecord(record); + + if (preload) { + record._preloadData(preload); + } + + if (get(record, 'isEmpty')) { + fetchedRecord = this.scheduleFetch(record); + //TODO double check about reloading + } else if (get(record, 'isLoading')){ + fetchedRecord = record._loadingPromise; + } return promiseObject(fetchedRecord || record, "DS: Store#findById " + type + " with id: " + id); }, @@ -10080,10 +10467,6 @@ define("ember-data/lib/system/store", @return {Promise} promise */ fetchRecord: function(record) { - if (isNone(record)) { return null; } - if (record._loadingPromise) { return record._loadingPromise; } - if (!get(record, 'isEmpty')) { return null; } - var type = record.constructor; var id = get(record, 'id'); var adapter = this.adapterFor(type); @@ -10091,11 +10474,115 @@ define("ember-data/lib/system/store", Ember.assert("You tried to find a record but you have no adapter (for " + type + ")", adapter); Ember.assert("You tried to find a record but your adapter (for " + type + ") does not implement 'find'", adapter.find); - var promise = _find(adapter, this, type, id); - record.loadingData(promise); + var promise = _find(adapter, this, type, id, record); return promise; }, + scheduleFetchMany: function(records) { + return Ember.RSVP.all(map(records, this.scheduleFetch, this)); + }, + + scheduleFetch: function(record) { + var type = record.constructor; + if (isNone(record)) { return null; } + if (record._loadingPromise) { return record._loadingPromise; } + + var resolver = Ember.RSVP.defer('Fetching ' + type + 'with id: ' + record.get('id')); + var recordResolverPair = { + record: record, + resolver: resolver + }; + var promise = resolver.promise; + + record.loadingData(promise); + + if (!this._pendingFetch.get(type)){ + this._pendingFetch.set(type, [recordResolverPair]); + } else { + this._pendingFetch.get(type).push(recordResolverPair); + } + Ember.run.scheduleOnce('afterRender', this, this.flushAllPendingFetches); + + return promise; + }, + + flushAllPendingFetches: function(){ + if (this.isDestroyed || this.isDestroying) { + return; + } + + this._pendingFetch.forEach(this._flushPendingFetchForType, this); + this._pendingFetch = Ember.Map.create(); + }, + + _flushPendingFetchForType: function (type, recordResolverPairs) { + var store = this; + var adapter = store.adapterFor(type); + var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests; + var records = Ember.A(recordResolverPairs).mapBy('record'); + var resolvers = Ember.A(recordResolverPairs).mapBy('resolver'); + + function _fetchRecord(recordResolverPair) { + recordResolverPair.resolver.resolve(store.fetchRecord(recordResolverPair.record)); + } + + function resolveFoundRecords(records) { + forEach(records, function(record){ + var pair = Ember.A(recordResolverPairs).findBy('record', record); + if (pair){ + var resolver = pair.resolver; + resolver.resolve(record); + } + }); + } + + function makeMissingRecordsRejector(requestedRecords) { + return function rejectMissingRecords(resolvedRecords) { + var missingRecords = requestedRecords.without(resolvedRecords); + rejectRecords(missingRecords); + }; + } + + function makeRecordsRejector(records) { + return function (error) { + rejectRecords(records, error); + }; + } + + function rejectRecords(records, error) { + forEach(records, function(record){ + var pair = Ember.A(recordResolverPairs).findBy('record', record); + if (pair){ + var resolver = pair.resolver; + resolver.reject(error); + } + }); + } + + if (recordResolverPairs.length === 1) { + _fetchRecord(recordResolverPairs[0]); + } else if (shouldCoalesce) { + var groups = adapter.groupRecordsForFindMany(this, records); + forEach(groups, function (groupOfRecords) { + var requestedRecords = Ember.A(groupOfRecords); + var ids = requestedRecords.mapBy('id'); + if (ids.length > 1) { + _findMany(adapter, store, type, ids, requestedRecords). + then(resolveFoundRecords). + then(makeMissingRecordsRejector(requestedRecords)). + then(null, makeRecordsRejector(requestedRecords)); + } else if (ids.length === 1) { + var pair = Ember.A(recordResolverPairs).findBy('record', groupOfRecords[0]); + _fetchRecord(pair); + } else { + Ember.assert("You cannot return an empty array from adapter's method groupRecordsForFindMany", false); + } + }); + } else { + forEach(recordResolverPairs, _fetchRecord); + } + }, + /** Get a record by a given type and ID without triggering a fetch. @@ -10145,54 +10632,7 @@ define("ember-data/lib/system/store", Ember.assert("You tried to reload a record but you have no adapter (for " + type + ")", adapter); Ember.assert("You tried to reload a record but your adapter does not implement `find`", adapter.find); - return _find(adapter, this, type, id); - }, - - /** - This method takes a list of records, groups the records by type, - converts the records into IDs, and then invokes the adapter's `findMany` - method. - - The records are grouped by type to invoke `findMany` on adapters - for each unique type in records. - - It is used both by a brand new relationship (via the `findMany` - method) or when the data underlying an existing relationship - changes. - - @method fetchMany - @private - @param {Array} records - @param {DS.Model} owner - @return {Promise} promise - */ - fetchMany: function(records, owner) { - if (!records.length) { - return Ember.RSVP.resolve(records); - } - - // Group By Type - var recordsByTypeMap = Ember.MapWithDefault.create({ - defaultValue: function() { return Ember.A(); } - }); - - forEach(records, function(record) { - recordsByTypeMap.get(record.constructor).push(record); - }); - - var promises = []; - - forEach(recordsByTypeMap, function(type, records) { - var ids = records.mapBy('id'), - adapter = this.adapterFor(type); - - Ember.assert("You tried to load many records but you have no adapter (for " + type + ")", adapter); - Ember.assert("You tried to load many records but your adapter does not implement `findMany`", adapter.findMany); - - promises.push(_findMany(adapter, this, type, ids, owner)); - }, this); - - return Ember.RSVP.all(promises); + return this.scheduleFetch(record); }, /** @@ -10225,7 +10665,7 @@ define("ember-data/lib/system/store", var idToRecord = this.typeMapFor(type).idToRecord; var record = idToRecord[id]; - if (!record || !idToRecord.hasOwnProperty(id)) { + if (!record || !idToRecord[id]) { record = this.buildRecord(type, id); } @@ -10244,13 +10684,9 @@ define("ember-data/lib/system/store", findMany: function(owner, inputRecords, typeName, resolver) { var type = this.modelFor(typeName); var records = Ember.A(inputRecords); - var unloadedRecords = records.filterBy('isEmpty', true); + var unloadedRecords = records.filterProperty('isEmpty', true); var manyArray = this.recordArrayManager.createManyArray(type, records); - forEach(unloadedRecords, function(record) { - record.loadingData(); - }); - manyArray.loadingRecordsCount = unloadedRecords.length; if (unloadedRecords.length) { @@ -10258,7 +10694,7 @@ define("ember-data/lib/system/store", this.recordArrayManager.registerWaitingRecordArray(record, manyArray); }, this); - resolver.resolve(this.fetchMany(unloadedRecords, owner)); + resolver.resolve(this.scheduleFetchMany(unloadedRecords, owner)); } else { if (resolver) { resolver.resolve(); } manyArray.set('isLoaded', true); @@ -10713,9 +11149,9 @@ define("ember-data/lib/system/store", if (typeMap) { return typeMap; } typeMap = { - idToRecord: {}, + idToRecord: Object.create(null), records: [], - metadata: {}, + metadata: Object.create(null), type: type }; @@ -10914,6 +11350,31 @@ define("ember-data/lib/system/store", serializer.pushPayload(this, payload); }, + /** + `normalize` converts a json payload into the normalized form that + [push](#method_push) expects. + + Example + + ```js + socket.on('message', function(message) { + var modelName = message.model; + var data = message.data; + store.push(modelName, store.normalize(modelName, data)); + }); + ``` + + @method normalize + @param {String} The name of the model type for this payload + @param {Object} payload + @return {Object} The normalized payload + */ + normalize: function (type, payload) { + var serializer = this.serializerFor(type); + var model = this.modelFor(type); + return serializer.normalize(model, payload); + }, + /** Update existing records in the store. Unlike [push](#method_push), update will merge the new data properties with the existing @@ -10997,7 +11458,7 @@ define("ember-data/lib/system/store", var typeMap = this.typeMapFor(type); var idToRecord = typeMap.idToRecord; - Ember.assert('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord.hasOwnProperty(id)); + Ember.assert('The id ' + id + ' has already been used with another record of type ' + type.toString() + '.', !id || !idToRecord[id]); Ember.assert("`" + Ember.inspect(type)+ "` does not appear to be an ember-data model", (typeof type._create === 'function') ); // lookupFactory should really return an object that creates @@ -11059,6 +11520,7 @@ define("ember-data/lib/system/store", var parentClientId = parentRecord ? parentRecord : parentRecord; var key = childKey + parentKey; var changes = this._relationshipChanges; + if (!(clientId in changes)) { changes[clientId] = {}; } @@ -11076,6 +11538,7 @@ define("ember-data/lib/system/store", var parentClientId = parentRecord ? parentRecord.clientId : parentRecord; var changes = this._relationshipChanges; var key = childKey + parentKey; + if (!(clientId in changes) || !(parentClientId in changes[clientId]) || !(key in changes[clientId][parentClientId])){ return; } @@ -11090,9 +11553,9 @@ define("ember-data/lib/system/store", //TODO(Igor) What about the other side var changesObject = this._relationshipChanges[record.clientId]; for (var objKey in changesObject){ - if(changesObject.hasOwnProperty(objKey)){ + if (changesObject.hasOwnProperty(objKey)){ for (var changeKey in changesObject[objKey]){ - if(changesObject[objKey].hasOwnProperty(changeKey)){ + if (changesObject[objKey].hasOwnProperty(changeKey)){ toReturn.push(changesObject[objKey][changeKey]); } } @@ -11191,10 +11654,15 @@ define("ember-data/lib/system/store", return; } - var kind = relationship.kind, - value = data[key]; + var kind = relationship.kind; + var value = data[key]; - if (value == null) { return; } + if (value == null) { + if (kind === 'hasMany' && record) { + value = data[key] = record.get(key).toArray(); + } + return; + } if (kind === 'belongsTo') { deserializeRecordId(store, data, key, relationship, value); @@ -11208,7 +11676,7 @@ define("ember-data/lib/system/store", } function deserializeRecordId(store, data, key, relationship, id) { - if (!Model) { Model = requireModule("ember-data/lib/system/model")["Model"]; } + if (!Model) { Model = requireModule("ember-data/system/model")["Model"]; } if (isNone(id) || id instanceof Model) { return; } @@ -11287,7 +11755,7 @@ define("ember-data/lib/system/store", PromiseArray = Ember.ArrayProxy.extend(Ember.PromiseProxyMixin); /** A `PromiseObject` is an object that acts like both an `Ember.Object` - and a promise. When the promise is resolved the the resulting value + and a promise. When the promise is resolved, then the resulting value will be set to the `PromiseObject`'s `content` property. This makes it easy to create data bindings with the `PromiseObject` that will be updated when the promise resolves. @@ -11362,34 +11830,71 @@ define("ember-data/lib/system/store", return serializer; } - function _find(adapter, store, type, id) { - var promise = adapter.find(store, type, id); + function _objectIsAlive(object) { + return !(get(object, "isDestroyed") || get(object, "isDestroying")); + } + + function _guard(promise, test) { + var guarded = promise['finally'](function() { + if (!test()) { + guarded._subscribers.length = 0; + } + }); + + return guarded; + } + + function _bind(fn) { + var args = Array.prototype.slice.call(arguments, 1); + + return function() { + return fn.apply(undefined, args); + }; + } + + function _find(adapter, store, type, id, record) { + var promise = adapter.find(store, type, id, record); var serializer = serializerForAdapter(adapter, type); var label = "DS: Handle Adapter#find of " + type + " with id: " + id; - return Promise.cast(promise, label).then(function(adapterPayload) { + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + + return promise.then(function(adapterPayload) { Ember.assert("You made a request for a " + type.typeKey + " with id " + id + ", but the adapter's response did not have any data", adapterPayload); var payload = serializer.extract(store, type, adapterPayload, id, 'find'); return store.push(type, payload); }, function(error) { var record = store.getById(type, id); - record.notFound(); + if (record) { + record.notFound(); + } throw error; }, "DS: Extract payload of '" + type + "'"); } - function _findMany(adapter, store, type, ids, owner) { - var promise = adapter.findMany(store, type, ids, owner); + + function _findMany(adapter, store, type, ids, records) { + var promise = adapter.findMany(store, type, ids, records); var serializer = serializerForAdapter(adapter, type); var label = "DS: Handle Adapter#findMany of " + type; - return Promise.cast(promise, label).then(function(adapterPayload) { + if (promise === undefined) { + throw new Error('adapter.findMany returned undefined, this was very likely a mistake'); + } + + var guardedPromise; + + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + + return promise.then(function(adapterPayload) { var payload = serializer.extract(store, type, adapterPayload, null, 'findMany'); Ember.assert("The response from a findMany must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array'); - store.pushMany(type, payload); + return store.pushMany(type, payload); }, null, "DS: Extract payload of " + type); } @@ -11398,7 +11903,11 @@ define("ember-data/lib/system/store", var serializer = serializerForAdapter(adapter, relationship.type); var label = "DS: Handle Adapter#findHasMany of " + record + " : " + relationship.type; - return Promise.cast(promise, label).then(function(adapterPayload) { + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + promise = _guard(promise, _bind(_objectIsAlive, record)); + + return promise.then(function(adapterPayload) { var payload = serializer.extract(store, relationship.type, adapterPayload, null, 'findHasMany'); Ember.assert("The response from a findHasMany must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array'); @@ -11413,7 +11922,11 @@ define("ember-data/lib/system/store", var serializer = serializerForAdapter(adapter, relationship.type); var label = "DS: Handle Adapter#findBelongsTo of " + record + " : " + relationship.type; - return Promise.cast(promise, label).then(function(adapterPayload) { + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + promise = _guard(promise, _bind(_objectIsAlive, record)); + + return promise.then(function(adapterPayload) { var payload = serializer.extract(store, relationship.type, adapterPayload, null, 'findBelongsTo'); var record = store.push(relationship.type, payload); @@ -11427,7 +11940,10 @@ define("ember-data/lib/system/store", var serializer = serializerForAdapter(adapter, type); var label = "DS: Handle Adapter#findAll of " + type; - return Promise.cast(promise, label).then(function(adapterPayload) { + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + + return promise.then(function(adapterPayload) { var payload = serializer.extract(store, type, adapterPayload, null, 'findAll'); Ember.assert("The response from a findAll must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array'); @@ -11443,7 +11959,10 @@ define("ember-data/lib/system/store", var serializer = serializerForAdapter(adapter, type); var label = "DS: Handle Adapter#findQuery of " + type; - return Promise.cast(promise, label).then(function(adapterPayload) { + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + + return promise.then(function(adapterPayload) { var payload = serializer.extract(store, type, adapterPayload, null, 'findQuery'); Ember.assert("The response from a findQuery must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array'); @@ -11459,7 +11978,11 @@ define("ember-data/lib/system/store", var serializer = serializerForAdapter(adapter, type); var label = "DS: Extract and notify about " + operation + " completion of " + record; - Ember.assert("Your adapter's '" + operation + "' method must return a promise, but it returned " + promise, isThenable(promise)); + Ember.assert("Your adapter's '" + operation + "' method must return a value, but it returned `undefined", promise !==undefined); + + promise = Promise.cast(promise, label); + promise = _guard(promise, _bind(_objectIsAlive, store)); + promise = _guard(promise, _bind(_objectIsAlive, record)); return promise.then(function(adapterPayload) { var payload; @@ -11486,10 +12009,11 @@ define("ember-data/lib/system/store", __exports__.Store = Store; __exports__.PromiseArray = PromiseArray; __exports__.PromiseObject = PromiseObject; + __exports__["default"] = Store; }); -define("ember-data/lib/transforms", - ["./transforms/base","./transforms/number","./transforms/date","./transforms/string","./transforms/boolean","exports"], +define("ember-data/transforms", + ["ember-data/transforms/base","ember-data/transforms/number","ember-data/transforms/date","ember-data/transforms/string","ember-data/transforms/boolean","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; var Transform = __dependency1__["default"]; @@ -11504,7 +12028,7 @@ define("ember-data/lib/transforms", __exports__.StringTransform = StringTransform; __exports__.BooleanTransform = BooleanTransform; }); -define("ember-data/lib/transforms/base", +define("ember-data/transforms/base", ["exports"], function(__exports__) { "use strict"; @@ -11580,8 +12104,8 @@ define("ember-data/lib/transforms/base", deserialize: Ember.required() }); }); -define("ember-data/lib/transforms/boolean", - ["./base","exports"], +define("ember-data/transforms/boolean", + ["ember-data/transforms/base","exports"], function(__dependency1__, __exports__) { "use strict"; var Transform = __dependency1__["default"]; @@ -11627,8 +12151,8 @@ define("ember-data/lib/transforms/boolean", } }); }); -define("ember-data/lib/transforms/date", - ["./base","exports"], +define("ember-data/transforms/date", + ["ember-data/transforms/base","exports"], function(__dependency1__, __exports__) { "use strict"; /** @@ -11720,8 +12244,8 @@ define("ember-data/lib/transforms/date", } }); }); -define("ember-data/lib/transforms/number", - ["./base","exports"], +define("ember-data/transforms/number", + ["ember-data/transforms/base","exports"], function(__dependency1__, __exports__) { "use strict"; var Transform = __dependency1__["default"]; @@ -11759,8 +12283,8 @@ define("ember-data/lib/transforms/number", } }); }); -define("ember-data/lib/transforms/string", - ["./base","exports"], +define("ember-data/transforms/string", + ["ember-data/transforms/base","exports"], function(__dependency1__, __exports__) { "use strict"; var Transform = __dependency1__["default"]; @@ -11796,7 +12320,28 @@ define("ember-data/lib/transforms/string", } }); }); -define("ember-inflector/lib/ext/string", +define("ember-inflector", + ["./system","./ext/string","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; + var Inflector = __dependency1__.Inflector; + var defaultRules = __dependency1__.defaultRules; + var pluralize = __dependency1__.pluralize; + var singularize = __dependency1__.singularize; + + Inflector.defaultRules = defaultRules; + Ember.Inflector = Inflector; + + Ember.String.pluralize = pluralize; + Ember.String.singularize = singularize; + + + __exports__["default"] = Inflector; + + __exports__.pluralize = pluralize; + __exports__.singularize = singularize; + }); +define("ember-inflector/ext/string", ["../system/string"], function(__dependency1__) { "use strict"; @@ -11825,28 +12370,7 @@ define("ember-inflector/lib/ext/string", }; } }); -define("ember-inflector/lib/main", - ["./system","./ext/string","exports"], - function(__dependency1__, __dependency2__, __exports__) { - "use strict"; - var Inflector = __dependency1__.Inflector; - var defaultRules = __dependency1__.defaultRules; - var pluralize = __dependency1__.pluralize; - var singularize = __dependency1__.singularize; - - Inflector.defaultRules = defaultRules; - Ember.Inflector = Inflector; - - Ember.String.pluralize = pluralize; - Ember.String.singularize = singularize; - - - __exports__["default"] = Inflector; - - __exports__.pluralize = pluralize; - __exports__.singularize = singularize; - }); -define("ember-inflector/lib/system", +define("ember-inflector/system", ["./system/inflector","./system/string","./system/inflections","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; @@ -11865,11 +12389,11 @@ define("ember-inflector/lib/system", __exports__.pluralize = pluralize; __exports__.defaultRules = defaultRules; }); -define("ember-inflector/lib/system/inflections", +define("ember-inflector/system/inflections", ["exports"], function(__exports__) { "use strict"; - var defaultRules = { + __exports__["default"] = { plurals: [ [/$/, 's'], [/s$/i, 's'], @@ -11947,14 +12471,15 @@ define("ember-inflector/lib/system/inflections", 'police' ] }; - - __exports__["default"] = defaultRules; }); -define("ember-inflector/lib/system/inflector", +define("ember-inflector/system/inflector", ["exports"], function(__exports__) { "use strict"; var BLANK_REGEX = /^\s*$/; + var LAST_WORD_DASHED_REGEX = /(\w+[_-])([a-z\d]+$)/; + var LAST_WORD_CAMELIZED_REGEX = /(\w+)([A-Z][a-z\d]*$)/; + var CAMELIZED_REGEX = /[A-Z][a-z\d]*$/; function loadUncountable(rules, uncountable) { for (var i = 0, length = uncountable.length; i < length; i++) { @@ -11968,8 +12493,13 @@ define("ember-inflector/lib/system/inflector", for (var i = 0, length = irregularPairs.length; i < length; i++) { pair = irregularPairs[i]; + //pluralizing rules.irregular[pair[0].toLowerCase()] = pair[1]; + rules.irregular[pair[1].toLowerCase()] = pair[1]; + + //singularizing rules.irregularInverse[pair[1].toLowerCase()] = pair[0]; + rules.irregularInverse[pair[0].toLowerCase()] = pair[0]; } } @@ -12033,28 +12563,93 @@ define("ember-inflector/lib/system/inflector", */ function Inflector(ruleSet) { ruleSet = ruleSet || {}; - ruleSet.uncountable = ruleSet.uncountable || {}; - ruleSet.irregularPairs = ruleSet.irregularPairs || {}; + ruleSet.uncountable = ruleSet.uncountable || makeDictionary(); + ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary(); var rules = this.rules = { plurals: ruleSet.plurals || [], singular: ruleSet.singular || [], - irregular: {}, - irregularInverse: {}, - uncountable: {} + irregular: makeDictionary(), + irregularInverse: makeDictionary(), + uncountable: makeDictionary() }; loadUncountable(rules, ruleSet.uncountable); loadIrregular(rules, ruleSet.irregularPairs); + + this.enableCache(); + } + + if (!Object.create && !Object.create(null).hasOwnProperty) { + throw new Error("This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg"); + } + + function makeDictionary() { + var cache = Object.create(null); + cache['_dict'] = null; + delete cache['_dict']; + return cache; } Inflector.prototype = { + /** + @public + + As inflections can be costly, and commonly the same subset of words are repeatedly + inflected an optional cache is provided. + + @method enableCache + */ + enableCache: function() { + this.purgeCache(); + + this.singularize = function(word) { + this._cacheUsed = true; + return this._sCache[word] || (this._sCache[word] = this._singularize(word)); + }; + + this.pluralize = function(word) { + this._cacheUsed = true; + return this._pCache[word] || (this._pCache[word] = this._pluralize(word)); + }; + }, + + /** + @public + + @method purgedCache + */ + purgeCache: function() { + this._cacheUsed = false; + this._sCache = makeDictionary(); + this._pCache = makeDictionary(); + }, + + /** + @public + disable caching + + @method disableCache; + */ + disableCache: function() { + this._sCache = null; + this._pCache = null; + this.singularize = function(word) { + return this._singularize(word); + }; + + this.pluralize = function(word) { + return this._pluralize(word); + }; + }, + /** @method plural @param {RegExp} regex @param {String} string */ plural: function(regex, string) { + if (this._cacheUsed) { this.purgeCache(); } this.rules.plurals.push([regex, string.toLowerCase()]); }, @@ -12064,6 +12659,7 @@ define("ember-inflector/lib/system/inflector", @param {String} string */ singular: function(regex, string) { + if (this._cacheUsed) { this.purgeCache(); } this.rules.singular.push([regex, string.toLowerCase()]); }, @@ -12072,6 +12668,7 @@ define("ember-inflector/lib/system/inflector", @param {String} regex */ uncountable: function(string) { + if (this._cacheUsed) { this.purgeCache(); } loadUncountable(this.rules, [string.toLowerCase()]); }, @@ -12081,6 +12678,7 @@ define("ember-inflector/lib/system/inflector", @param {String} plural */ irregular: function (singular, plural) { + if (this._cacheUsed) { this.purgeCache(); } loadIrregular(this.rules, [[singular, plural]]); }, @@ -12089,14 +12687,21 @@ define("ember-inflector/lib/system/inflector", @param {String} word */ pluralize: function(word) { - return this.inflect(word, this.rules.plurals, this.rules.irregular); + return this._pluralize(word); }, + _pluralize: function(word) { + return this.inflect(word, this.rules.plurals, this.rules.irregular); + }, /** @method singularize @param {String} word */ singularize: function(word) { + return this._singularize(word); + }, + + _singularize: function(word) { return this.inflect(word, this.rules.singular, this.rules.irregularInverse); }, @@ -12109,27 +12714,41 @@ define("ember-inflector/lib/system/inflector", @param {Object} irregular */ inflect: function(word, typeRules, irregular) { - var inflection, substitution, result, lowercase, isBlank, - isUncountable, isIrregular, isIrregularInverse, rule; - + var inflection, substitution, result, lowercase, wordSplit, + firstPhrase, lastWord, isBlank, isCamelized, isUncountable, + isIrregular, isIrregularInverse, rule; + isBlank = BLANK_REGEX.test(word); + isCamelized = CAMELIZED_REGEX.test(word); + firstPhrase = ""; if (isBlank) { return word; } lowercase = word.toLowerCase(); + wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word); + if (wordSplit){ + firstPhrase = wordSplit[1]; + lastWord = wordSplit[2].toLowerCase(); + } - isUncountable = this.rules.uncountable[lowercase]; + isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord]; if (isUncountable) { return word; } - isIrregular = irregular && irregular[lowercase]; + isIrregular = irregular && (irregular[lowercase] || irregular[lastWord]); if (isIrregular) { - return isIrregular; + if (irregular[lowercase]){ + return isIrregular; + } + else { + isIrregular = (isCamelized) ? isIrregular.capitalize() : isIrregular; + return firstPhrase + isIrregular; + } } for (var i = typeRules.length, min = 0; i > min; i--) { @@ -12154,21 +12773,22 @@ define("ember-inflector/lib/system/inflector", __exports__["default"] = Inflector; }); -define("ember-inflector/lib/system/string", +define("ember-inflector/system/string", ["./inflector","exports"], function(__dependency1__, __exports__) { "use strict"; var Inflector = __dependency1__["default"]; - var pluralize = function(word) { - return Inflector.inflector.pluralize(word); - }; - var singularize = function(word) { + function pluralize(word) { + return Inflector.inflector.pluralize(word); + } + + function singularize(word) { return Inflector.inflector.singularize(word); - }; + } __exports__.pluralize = pluralize; __exports__.singularize = singularize; }); -global.DS = requireModule('ember-data/lib/main')['default']; -}(Ember.lookup)); + global.DS = requireModule('ember-data')['default']; + })(this); diff --git a/vendor/assets/ember/development/ember.js b/vendor/assets/ember/development/ember.js index 46115472..ba74d19d 100644 --- a/vendor/assets/ember/development/ember.js +++ b/vendor/assets/ember/development/ember.js @@ -1,5 +1,5 @@ // Fetched from channel: canary, with url http://builds.emberjs.com/canary/ember.js -// Fetched on: 2014-07-01T13:19:13Z +// Fetched on: 2014-08-07T09:19:26Z /*! * @overview Ember - JavaScript Application Framework * @copyright Copyright 2011-2014 Tilde Inc. and contributors @@ -7,7 +7,7 @@ * Portions Copyright 2008-2011 Apple Inc. All rights reserved. * @license Licensed under MIT license * See https://raw.github.com/emberjs/ember.js/master/LICENSE - * @version 1.7.0-beta.1+canary.83fe4e00 + * @version 1.8.0-beta.1+canary.919cf869 */ (function() { @@ -869,7 +869,47 @@ define("backburner/utils", } }; }); +define("calculateVersion", + [], + function() { + "use strict"; + 'use strict'; + var fs = require('fs'); + var path = require('path'); + + module.exports = function () { + var packageVersion = require('../package.json').version; + var output = [packageVersion]; + var gitPath = path.join(__dirname,'..','.git'); + var headFilePath = path.join(gitPath, 'HEAD'); + + if (packageVersion.indexOf('+') > -1) { + try { + if (fs.existsSync(headFilePath)) { + var headFile = fs.readFileSync(headFilePath, {encoding: 'utf8'}); + var branchName = headFile.split('/').slice(-1)[0].trim(); + var refPath = headFile.split(' ')[1]; + var branchSHA; + + if (refPath) { + var branchPath = path.join(gitPath, refPath.trim()); + branchSHA = fs.readFileSync(branchPath); + } else { + branchSHA = branchName; + } + + output.push(branchSHA.slice(0,10)); + } + } catch (err) { + console.error(err.stack); + } + return output.join('.'); + } else { + return packageVersion; + } + }; + }); define("container", ["container/container","exports"], function(__dependency1__, __exports__) { @@ -898,12 +938,12 @@ define("container", __exports__["default"] = Container; }); define("container/container", - ["container/inheriting_dict","ember-metal/core","exports"], + ["ember-metal/core","ember-metal/dictionary","exports"], function(__dependency1__, __dependency2__, __exports__) { "use strict"; - var InheritingDict = __dependency1__["default"]; - var Ember = __dependency2__["default"]; + var Ember = __dependency1__["default"]; // Ember.assert + var dictionary = __dependency2__["default"]; // A lightweight container that helps to assemble and decouple components. // Public api for the container is still in flux. @@ -914,18 +954,19 @@ define("container/container", this.resolver = parent && parent.resolver || function() {}; - this.registry = new InheritingDict(parent && parent.registry); - this.cache = new InheritingDict(parent && parent.cache); - this.factoryCache = new InheritingDict(parent && parent.factoryCache); - this.resolveCache = new InheritingDict(parent && parent.resolveCache); - this.typeInjections = new InheritingDict(parent && parent.typeInjections); - this.injections = {}; + this.registry = dictionary(parent ? parent.registry : null); + this.cache = dictionary(parent ? parent.cache : null); + this.factoryCache = dictionary(parent ? parent.factoryCache : null); + this.resolveCache = dictionary(parent ? parent.resolveCache : null); + this.typeInjections = dictionary(parent ? parent.typeInjections : null); + this.injections = dictionary(null); + this.normalizeCache = dictionary(null); - this.factoryTypeInjections = new InheritingDict(parent && parent.factoryTypeInjections); - this.factoryInjections = {}; + this.factoryTypeInjections = dictionary(parent ? parent.factoryTypeInjections : null); + this.factoryInjections = dictionary(null); - this._options = new InheritingDict(parent && parent._options); - this._typeOptions = new InheritingDict(parent && parent._typeOptions); + this._options = dictionary(parent ? parent._options : null); + this._typeOptions = dictionary(parent ? parent._typeOptions : null); } Container.prototype = { @@ -1046,12 +1087,12 @@ define("container/container", var normalizedName = this.normalize(fullName); - if (this.cache.has(normalizedName)) { + if (normalizedName in this.cache) { throw new Error('Cannot re-register: `' + fullName +'`, as it has already been looked up.'); } - this.registry.set(normalizedName, factory); - this._options.set(normalizedName, options || {}); + this.registry[normalizedName] = factory; + this._options[normalizedName] = (options || {}); }, /** @@ -1075,11 +1116,11 @@ define("container/container", var normalizedName = this.normalize(fullName); - this.registry.remove(normalizedName); - this.cache.remove(normalizedName); - this.factoryCache.remove(normalizedName); - this.resolveCache.remove(normalizedName); - this._options.remove(normalizedName); + delete this.registry[normalizedName]; + delete this.cache[normalizedName]; + delete this.factoryCache[normalizedName]; + delete this.resolveCache[normalizedName]; + delete this._options[normalizedName]; }, /** @@ -1138,12 +1179,25 @@ define("container/container", /** A hook to enable custom fullName normalization behaviour + @method normalizeFullName + @param {String} fullName + @return {string} normalized fullName + */ + normalizeFullName: function(fullName) { + return fullName; + }, + + /** + normalize a fullName based on the applications conventions + @method normalize @param {String} fullName @return {string} normalized fullName */ normalize: function(fullName) { - return fullName; + return this.normalizeCache[fullName] || ( + this.normalizeCache[fullName] = this.normalizeFullName(fullName) + ); }, /** @@ -1256,7 +1310,7 @@ define("container/container", optionsForType: function(type, options) { if (this.parent) { illegalChildOperation('optionsForType'); } - this._typeOptions.set(type, options); + this._typeOptions[type] = options; }, /** @@ -1305,12 +1359,14 @@ define("container/container", */ typeInjection: function(type, property, fullName) { Ember.assert('fullName must be a proper full name', validateFullName(fullName)); + if (this.parent) { illegalChildOperation('typeInjection'); } var fullNameType = fullName.split(':')[0]; - if(fullNameType === type) { + if (fullNameType === type) { throw new Error('Cannot inject a `' + fullName + '` on other ' + type + '(s). Register the `' + fullName + '` as a different type and perform the typeInjection.'); } + addTypeInjection(this.typeInjections, type, property, fullName); }, @@ -1371,7 +1427,7 @@ define("container/container", Ember.assert('fullName must be a proper full name', validateFullName(fullName)); var normalizedName = this.normalize(fullName); - if (this.cache.has(normalizedName)) { + if (this.cache[normalizedName]) { throw new Error("Attempted to register an injection for a type that has already been looked up. ('" + normalizedName + "', '" + property + "', '" + injectionName + "')"); } addInjection(this.injections, normalizedName, property, normalizedInjectionName); @@ -1476,7 +1532,7 @@ define("container/container", Ember.assert('fullName must be a proper full name', validateFullName(fullName)); - if (this.factoryCache.has(normalizedName)) { + if (this.factoryCache[normalizedName]) { throw new Error('Attempted to register a factoryInjection for a type that has already ' + 'been looked up. (\'' + normalizedName + '\', \'' + property + '\', \'' + injectionName + '\')'); } @@ -1518,17 +1574,17 @@ define("container/container", }; function resolve(container, normalizedName) { - var cached = container.resolveCache.get(normalizedName); + var cached = container.resolveCache[normalizedName]; if (cached) { return cached; } - var resolved = container.resolver(normalizedName) || container.registry.get(normalizedName); - container.resolveCache.set(normalizedName, resolved); + var resolved = container.resolver(normalizedName) || container.registry[normalizedName]; + container.resolveCache[normalizedName] = resolved; return resolved; } function has(container, fullName){ - if (container.cache.has(fullName)) { + if (container.cache[fullName]) { return true; } @@ -1538,8 +1594,8 @@ define("container/container", function lookup(container, fullName, options) { options = options || {}; - if (container.cache.has(fullName) && options.singleton !== false) { - return container.cache.get(fullName); + if (container.cache[fullName] && options.singleton !== false) { + return container.cache[fullName]; } var value = instantiate(container, fullName); @@ -1547,7 +1603,7 @@ define("container/container", if (value === undefined) { return; } if (isSingleton(container, fullName) && options.singleton !== false) { - container.cache.set(fullName, value); + container.cache[fullName] = value; } return value; @@ -1585,14 +1641,14 @@ define("container/container", } function option(container, fullName, optionName) { - var options = container._options.get(fullName); + var options = container._options[fullName]; if (options && options[optionName] !== undefined) { return options[optionName]; } var type = fullName.split(':')[0]; - options = container._typeOptions.get(type); + options = container._typeOptions[type]; if (options) { return options[optionName]; @@ -1601,8 +1657,8 @@ define("container/container", function factoryFor(container, fullName) { var cache = container.factoryCache; - if (cache.has(fullName)) { - return cache.get(fullName); + if (cache[fullName]) { + return cache[fullName]; } var factory = container.resolve(fullName); if (factory === undefined) { return; } @@ -1611,6 +1667,7 @@ define("container/container", if (!factory || typeof factory.extend !== 'function' || (!Ember.MODEL_FACTORY_INJECTIONS && type === 'model')) { // TODO: think about a 'safe' merge style extension // for now just fallback to create time injection + cache[fullName] = factory; return factory; } else { var injections = injectionsFor(container, fullName); @@ -1621,18 +1678,18 @@ define("container/container", var injectedFactory = factory.extend(injections); injectedFactory.reopenClass(factoryInjections); - cache.set(fullName, injectedFactory); + cache[fullName] = injectedFactory; return injectedFactory; } } function injectionsFor(container, fullName) { - var splitName = fullName.split(':'), - type = splitName[0], - injections = []; + var splitName = fullName.split(':'); + var type = splitName[0]; + var injections = []; - injections = injections.concat(container.typeInjections.get(type) || []); + injections = injections.concat(container.typeInjections[type] || []); injections = injections.concat(container.injections[fullName] || []); injections = buildInjections(container, injections); @@ -1643,11 +1700,11 @@ define("container/container", } function factoryInjectionsFor(container, fullName) { - var splitName = fullName.split(':'), - type = splitName[0], - factoryInjections = []; + var splitName = fullName.split(':'); + var type = splitName[0]; + var factoryInjections = []; - factoryInjections = factoryInjections.concat(container.factoryTypeInjections.get(type) || []); + factoryInjections = factoryInjections.concat(container.factoryTypeInjections[type] || []); factoryInjections = factoryInjections.concat(container.factoryInjections[fullName] || []); factoryInjections = buildInjections(container, factoryInjections); @@ -1682,26 +1739,34 @@ define("container/container", } function eachDestroyable(container, callback) { - container.cache.eachLocal(function(key, value) { - if (option(container, key, 'instantiate') === false) { return; } - callback(value); - }); + var cache = container.cache; + var keys = Object.keys(cache); + var key, value; + + for (var i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + value = cache[key]; + + if (option(container, key, 'instantiate') !== false) { + callback(value); + } + } } function resetCache(container) { - container.cache.eachLocal(function(key, value) { - if (option(container, key, 'instantiate') === false) { return; } + eachDestroyable(container, function(value) { value.destroy(); }); - container.cache.dict = {}; + + container.cache.dict = dictionary(null); } function addTypeInjection(rules, type, property, fullName) { - var injections = rules.get(type); + var injections = rules[type]; if (!injections) { injections = []; - rules.set(type, injections); + rules[type] = injections; } injections.push({ @@ -1720,125 +1785,14 @@ define("container/container", function addInjection(rules, factoryName, property, injectionName) { var injections = rules[factoryName] = rules[factoryName] || []; - injections.push({ property: property, fullName: injectionName }); + injections.push({ + property: property, + fullName: injectionName + }); } __exports__["default"] = Container; }); -define("container/inheriting_dict", - ["exports"], - function(__exports__) { - "use strict"; - // A safe and simple inheriting object. - function InheritingDict(parent) { - this.parent = parent; - this.dict = {}; - } - - InheritingDict.prototype = { - - /** - @property parent - @type InheritingDict - @default null - */ - - parent: null, - - /** - Object used to store the current nodes data. - - @property dict - @type Object - @default Object - */ - dict: null, - - /** - Retrieve the value given a key, if the value is present at the current - level use it, otherwise walk up the parent hierarchy and try again. If - no matching key is found, return undefined. - - @method get - @param {String} key - @return {any} - */ - get: function(key) { - var dict = this.dict; - - if (dict.hasOwnProperty(key)) { - return dict[key]; - } - - if (this.parent) { - return this.parent.get(key); - } - }, - - /** - Set the given value for the given key, at the current level. - - @method set - @param {String} key - @param {Any} value - */ - set: function(key, value) { - this.dict[key] = value; - }, - - /** - Delete the given key - - @method remove - @param {String} key - */ - remove: function(key) { - delete this.dict[key]; - }, - - /** - Check for the existence of given a key, if the key is present at the current - level return true, otherwise walk up the parent hierarchy and try again. If - no matching key is found, return false. - - @method has - @param {String} key - @return {Boolean} - */ - has: function(key) { - var dict = this.dict; - - if (dict.hasOwnProperty(key)) { - return true; - } - - if (this.parent) { - return this.parent.has(key); - } - - return false; - }, - - /** - Iterate and invoke a callback for each local key-value pair. - - @method eachLocal - @param {Function} callback - @param {Object} binding - */ - eachLocal: function(callback, binding) { - var dict = this.dict; - - for (var prop in dict) { - if (dict.hasOwnProperty(prop)) { - callback.call(binding, prop, dict[prop]); - } - } - } - }; - - __exports__["default"] = InheritingDict; - }); define("ember-application", ["ember-metal/core","ember-runtime/system/lazy_load","ember-application/system/dag","ember-application/system/resolver","ember-application/system/application","ember-application/ext/controller"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__) { @@ -1856,7 +1810,7 @@ define("ember-application", var DAG = __dependency3__["default"]; var Resolver = __dependency4__.Resolver; - var DefaultResolver = __dependency4__.default; + var DefaultResolver = __dependency4__["default"]; var Application = __dependency5__["default"]; // side effect of extending ControllerMixin @@ -1991,8 +1945,8 @@ define("ember-application/ext/controller", needs: [], init: function() { - var needs = get(this, 'needs'), - length = get(needs, 'length'); + var needs = get(this, 'needs'); + var length = get(needs, 'length'); if (length > 0) { Ember.assert(' `' + inspect(this) + ' specifies `needs`, but does ' + @@ -2046,8 +2000,8 @@ define("ember-application/ext/controller", __exports__["default"] = ControllerMixin; }); define("ember-application/system/application", - ["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","ember-application/system/deprecated-container","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __exports__) { + ["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __exports__) { "use strict"; /** @module ember @@ -2084,7 +2038,6 @@ define("ember-application/system/application", var K = __dependency26__.K; var EmberHandlebars = __dependency27__["default"]; - var DeprecatedContainer = __dependency28__["default"]; var ContainerDebugAdapter; @@ -2231,6 +2184,7 @@ define("ember-application/system/application", */ var Application = Namespace.extend(DeferredMixin, { + _suppressDeferredDeprecation: true, /** The root DOM element of the Application. This can be specified as an @@ -2305,7 +2259,7 @@ define("ember-application/system/application", this.scheduleInitialize(); - Ember.libraries.registerCoreLibrary('Handlebars', EmberHandlebars.VERSION); + Ember.libraries.registerCoreLibrary('Handlebars' + (EmberHandlebars.compile ? '' : '-runtime'), EmberHandlebars.VERSION); Ember.libraries.registerCoreLibrary('jQuery', jQuery().jquery); if ( Ember.LOG_VERSION ) { @@ -2702,11 +2656,11 @@ define("ember-application/system/application", @method runInitializers */ runInitializers: function() { - var initializers = get(this.constructor, 'initializers'), - container = this.__container__, - graph = new DAG(), - namespace = this, - name, initializer; + var initializers = get(this.constructor, 'initializers'); + var container = this.__container__; + var graph = new DAG(); + var namespace = this; + var name, initializer; for (name in initializers) { initializer = initializers[name]; @@ -2747,9 +2701,9 @@ define("ember-application/system/application", @method setupEventDispatcher */ setupEventDispatcher: function() { - var customEvents = get(this, 'customEvents'), - rootElement = get(this, 'rootElement'), - dispatcher = this.__container__.lookup('event_dispatcher:main'); + var customEvents = get(this, 'customEvents'); + var rootElement = get(this, 'rootElement'); + var dispatcher = this.__container__.lookup('event_dispatcher:main'); set(this, 'eventDispatcher', dispatcher); dispatcher.setup(customEvents, rootElement); @@ -2810,6 +2764,17 @@ define("ember-application/system/application", initializer: function(options) { this.constructor.initializer(options); + }, + + /** + @method then + @private + @deprecated + */ + then: function() { + Ember.deprecate('Do not use `.then` on an instance of Ember.Application. Please use the `.ready` hook instead.'); + + this._super.apply(this, arguments); } }); @@ -2981,12 +2946,10 @@ define("ember-application/system/application", buildContainer: function(namespace) { var container = new Container(); - Container.defaultContainer = new DeprecatedContainer(container); - container.set = set; - container.resolver = resolverFor(namespace); - container.normalize = container.resolver.normalize; - container.describe = container.resolver.describe; + container.resolver = resolverFor(namespace); + container.normalizeFullName = container.resolver.normalize; + container.describe = container.resolver.describe; container.makeToString = container.resolver.makeToString; container.optionsForType('component', { singleton: false }); @@ -3096,11 +3059,12 @@ define("ember-application/system/dag", var EmberError = __dependency1__["default"]; function visit(vertex, fn, visited, path) { - var name = vertex.name, - vertices = vertex.incoming, - names = vertex.incomingNames, - len = names.length, - i; + var name = vertex.name; + var vertices = vertex.incoming; + var names = vertex.incomingNames; + var len = names.length; + var i; + if (!visited) { visited = {}; } @@ -3161,11 +3125,12 @@ define("ember-application/system/dag", }; DAG.prototype.topsort = function(fn) { - var visited = {}, - vertices = this.vertices, - names = this.names, - len = names.length, - i, vertex; + var visited = {}; + var vertices = this.vertices; + var names = this.names; + var len = names.length; + var i, vertex; + for (i = 0; i < len; i++) { vertex = vertices[names[i]]; if (!vertex.hasOutgoing) { @@ -3199,35 +3164,9 @@ define("ember-application/system/dag", __exports__["default"] = DAG; }); -define("ember-application/system/deprecated-container", - ["exports"], - function(__exports__) { - "use strict"; - function DeprecatedContainer(container) { - this._container = container; - } - - DeprecatedContainer.deprecate = function(method) { - return function() { - var container = this._container; - - Ember.deprecate('Using the defaultContainer is no longer supported. [defaultContainer#' + method + '] see: http://git.io/EKPpnA', false); - return container[method].apply(container, arguments); - }; - }; - - DeprecatedContainer.prototype = { - _container: null, - lookup: DeprecatedContainer.deprecate('lookup'), - resolve: DeprecatedContainer.deprecate('resolve'), - register: DeprecatedContainer.deprecate('register') - }; - - __exports__["default"] = DeprecatedContainer; - }); define("ember-application/system/resolver", - ["ember-metal/core","ember-metal/property_get","ember-metal/logger","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/system/namespace","ember-handlebars","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/logger","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/system/namespace","ember-handlebars","ember-metal/dictionary","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; /** @module ember @@ -3253,31 +3192,15 @@ define("ember-application/system/resolver", @property namespace */ namespace: null, - normalize: function(fullName) { - throw new Error("Invalid call to `resolver.normalize(fullName)`. Please override the 'normalize' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - resolve: function(fullName) { - throw new Error("Invalid call to `resolver.resolve(parsedName)`. Please override the 'resolve' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - parseName: function(parsedName) { - throw new Error("Invalid call to `resolver.resolveByType(parsedName)`. Please override the 'resolveByType' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - lookupDescription: function(fullName) { - throw new Error("Invalid call to `resolver.lookupDescription(fullName)`. Please override the 'lookupDescription' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - makeToString: function(factory, fullName) { - throw new Error("Invalid call to `resolver.makeToString(factory, fullName)`. Please override the 'makeToString' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - resolveOther: function(parsedName) { - throw new Error("Invalid call to `resolver.resolveOther(parsedName)`. Please override the 'resolveOther' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - }, - _logLookup: function(found, parsedName) { - throw new Error("Invalid call to `resolver._logLookup(found, parsedName)`. Please override the '_logLookup' method in subclass of `Ember.Resolver` to prevent falling through to this error."); - } + normalize: Ember.required(Function), + resolve: Ember.required(Function), + parseName: Ember.required(Function), + lookupDescription: Ember.required(Function), + makeToString: Ember.required(Function), + resolveOther: Ember.required(Function), + _logLookup: Ember.required(Function) }); __exports__.Resolver = Resolver; - - /** The DefaultResolver defines the default lookup rules to resolve container lookups before consulting the container for registered @@ -3348,6 +3271,7 @@ define("ember-application/system/resolver", @namespace Ember @extends Ember.Object */ + var dictionary = __dependency8__["default"]; __exports__["default"] = EmberObject.extend({ /** @@ -3358,10 +3282,13 @@ define("ember-application/system/resolver", */ namespace: null, + init: function() { + this._parseNameCache = dictionary(null); + }, normalize: function(fullName) { - var split = fullName.split(':', 2), - type = split[0], - name = split[1]; + var split = fullName.split(':', 2); + var type = split[0]; + var name = split[1]; Ember.assert("Tried to normalize a container name without a colon (:) in it. You probably tried to lookup a name that did not contain a type, a colon, and a name. A proper lookup name would be `view:post`.", split.length === 2); @@ -3369,11 +3296,15 @@ define("ember-application/system/resolver", var result = name; if (result.indexOf('.') > -1) { - result = result.replace(/\.(.)/g, function(m) { return m.charAt(1).toUpperCase(); }); + result = result.replace(/\.(.)/g, function(m) { + return m.charAt(1).toUpperCase(); + }); } if (name.indexOf('_') > -1) { - result = result.replace(/_(.)/g, function(m) { return m.charAt(1).toUpperCase(); }); + result = result.replace(/_(.)/g, function(m) { + return m.charAt(1).toUpperCase(); + }); } return type + ':' + result; @@ -3393,12 +3324,12 @@ define("ember-application/system/resolver", @return {Object} the resolved factory */ resolve: function(fullName) { - var parsedName = this.parseName(fullName), - resolveMethodName = parsedName.resolveMethodName, - resolved; + var parsedName = this.parseName(fullName); + var resolveMethodName = parsedName.resolveMethodName; + var resolved; if (!(parsedName.name && parsedName.type)) { - throw new TypeError("Invalid fullName: `" + fullName + "`, must be of the form `type:name` "); + throw new TypeError('Invalid fullName: `' + fullName + '`, must be of the form `type:name` '); } if (this[resolveMethodName]) { @@ -3416,7 +3347,7 @@ define("ember-application/system/resolver", return resolved; }, /** - Convert the string name of the form "type:name" to + Convert the string name of the form 'type:name' to a Javascript object with the parsed aspects of the name broken out. @@ -3424,12 +3355,19 @@ define("ember-application/system/resolver", @param {String} fullName the lookup string @method parseName */ + parseName: function(fullName) { - var nameParts = fullName.split(":"), - type = nameParts[0], fullNameWithoutType = nameParts[1], - name = fullNameWithoutType, - namespace = get(this, 'namespace'), - root = namespace; + return this._parseNameCache[fullName] || ( + this._parseNameCache[fullName] = this._parseName(fullName) + ); + }, + + _parseName: function(fullName) { + var nameParts = fullName.split(':'); + var type = nameParts[0], fullNameWithoutType = nameParts[1]; + var name = fullNameWithoutType; + var namespace = get(this, 'namespace'); + var root = namespace; if (type !== 'template' && name.indexOf('/') !== -1) { var parts = name.split('/'); @@ -3446,7 +3384,7 @@ define("ember-application/system/resolver", fullNameWithoutType: fullNameWithoutType, name: name, root: root, - resolveMethodName: "resolve" + classify(type) + resolveMethodName: 'resolve' + classify(type) }; }, @@ -3464,11 +3402,14 @@ define("ember-application/system/resolver", var parsedName = this.parseName(fullName); if (parsedName.type === 'template') { - return "template at " + parsedName.fullNameWithoutType.replace(/\./g, '/'); + return 'template at ' + parsedName.fullNameWithoutType.replace(/\./g, '/'); } - var description = parsedName.root + "." + classify(parsedName.name); - if (parsedName.type !== 'model') { description += classify(parsedName.type); } + var description = parsedName.root + '.' + classify(parsedName.name); + + if (parsedName.type !== 'model') { + description += classify(parsedName.type); + } return description; }, @@ -3511,6 +3452,7 @@ define("ember-application/system/resolver", return Ember.TEMPLATES[templateName]; } }, + /** Lookup the view using `resolveOther` @@ -3523,6 +3465,7 @@ define("ember-application/system/resolver", this.useRouterNaming(parsedName); return this.resolveOther(parsedName); }, + /** Lookup the controller using `resolveOther` @@ -3557,8 +3500,8 @@ define("ember-application/system/resolver", @method resolveModel */ resolveModel: function(parsedName) { - var className = classify(parsedName.name), - factory = get(parsedName.root, className); + var className = classify(parsedName.name); + var factory = get(parsedName.root, className); if (factory) { return factory; } }, @@ -3584,8 +3527,8 @@ define("ember-application/system/resolver", @method resolveOther */ resolveOther: function(parsedName) { - var className = classify(parsedName.name) + classify(parsedName.type), - factory = get(parsedName.root, className); + var className = classify(parsedName.name) + classify(parsedName.type); + var factory = get(parsedName.root, className); if (factory) { return factory; } }, @@ -3599,7 +3542,7 @@ define("ember-application/system/resolver", var symbol, padding; if (found) { symbol = '[✓]'; } - else { symbol = '[ ]'; } + else { symbol = '[ ]'; } if (parsedName.fullName.length > 60) { padding = '.'; @@ -3898,7 +3841,7 @@ define("ember-extension-support/container_debug_adapter", classes in the resolver for a given type. @method canCatalogEntriesByType - @param {string} type The type. e.g. "model", "controller", "route" + @param {String} type The type. e.g. "model", "controller", "route" @return {boolean} whether a list is available for this type. */ canCatalogEntriesByType: function(type) { @@ -3910,7 +3853,7 @@ define("ember-extension-support/container_debug_adapter", Returns the available classes a given type. @method catalogEntriesByType - @param {string} type The type. e.g. "model", "controller", "route" + @param {String} type The type. e.g. "model", "controller", "route" @return {Array} An array of strings. */ catalogEntriesByType: function(type) { @@ -4946,8 +4889,8 @@ define("ember-handlebars/component_lookup", __exports__["default"] = ComponentLookup; }); define("ember-handlebars/controls", - ["ember-handlebars/controls/checkbox","ember-handlebars/controls/text_field","ember-handlebars/controls/text_area","ember-metal/core","ember-handlebars-compiler","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { + ["ember-handlebars/controls/checkbox","ember-handlebars/controls/text_field","ember-handlebars/controls/text_area","ember-metal/core","ember-handlebars-compiler","ember-handlebars/ext","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) { "use strict"; var Checkbox = __dependency1__["default"]; var TextField = __dependency2__["default"]; @@ -4958,12 +4901,21 @@ define("ember-handlebars/controls", // var emberAssert = Ember.assert; var EmberHandlebars = __dependency5__["default"]; + var handlebarsGet = __dependency6__.handlebarsGet; var helpers = EmberHandlebars.helpers; /** @module ember @submodule ember-handlebars-compiler */ + function _resolveOption(context, options, key) { + if (options.hashTypes[key] === "ID") { + return handlebarsGet(context, options.hash[key], options); + } else { + return options.hash[key]; + } + } + /** The `{{input}}` helper inserts an HTML `` tag into the template, @@ -5023,6 +4975,35 @@ define("ember-handlebars/controls", ``` + ## Actions + + The helper can send multiple actions based on user events. + + The action property defines the action which is send when + the user presses the return key. + + ```handlebars + {{input action="submit"}} + ``` + + The helper allows some user events to send actions. + + * `enter` + * `insert-newline` + * `escape-press` + * `focus-in` + * `focus-out` + * `key-press` + + For example, if you desire an action to be sent when the input is blurred, + you only need to setup the action name to the event name property. + + ```handlebars + {{input focus-in="alertMessage"}} + ``` + + See more about [Text Support Actions](/api/classes/Ember.TextField.html) + ## Extension Internally, `{{input type="text"}}` creates an instance of `Ember.TextField`, passing @@ -5042,7 +5023,7 @@ define("ember-handlebars/controls", itself extends `Ember.Component`, meaning that it does NOT inherit the `controller` of the parent view. - See more about [Ember components](api/classes/Ember.Component.html) + See more about [Ember components](/api/classes/Ember.Component.html) ## Use as checkbox @@ -5115,7 +5096,7 @@ define("ember-handlebars/controls", var hash = options.hash, types = options.hashTypes, - inputType = hash.type, + inputType = _resolveOption(this, options, 'type'), onEvent = hash.on; delete hash.type; @@ -5260,12 +5241,41 @@ define("ember-handlebars/controls", ``` + ## Actions + + The helper can send multiple actions based on user events. + + The action property defines the action which is send when + the user presses the return key. + + ```handlebars + {{input action="submit"}} + ``` + + The helper allows some user events to send actions. + + * `enter` + * `insert-newline` + * `escape-press` + * `focus-in` + * `focus-out` + * `key-press` + + For example, if you desire an action to be sent when the input is blurred, + you only need to setup the action name to the event name property. + + ```handlebars + {{textarea focus-in="alertMessage"}} + ``` + + See more about [Text Support Actions](/api/classes/Ember.TextArea.html) + ## Extension Internally, `{{textarea}}` creates an instance of `Ember.TextArea`, passing arguments from the helper to `Ember.TextArea`'s `create` method. You can extend the capabilities of text areas in your application by reopening this - class. For example, if you are building a Bootstrap project where `data-*` + class. For example, if you are building a Bootstrap project where `data-*` attributes are used, you can globally add support for a `data-*` attribute on all `{{textarea}}`s' in your app by reopening `Ember.TextArea` or `Ember.TextSupport` and adding it to the `attributeBindings` concatenated @@ -5281,7 +5291,7 @@ define("ember-handlebars/controls", itself extends `Ember.Component`, meaning that it does NOT inherit the `controller` of the parent view. - See more about [Ember components](api/classes/Ember.Component.html) + See more about [Ember components](/api/classes/Ember.Component.html) @method textarea @for Ember.Handlebars.helpers @@ -6324,10 +6334,10 @@ define("ember-handlebars/controls/text_support", }, /** - The action to be sent when the user inserts a new line. + Called when the user inserts a new line. Called by the `Ember.TextSupport` mixin on keyUp if keycode matches 13. - Uses sendAction to send the `enter` action to the controller. + Uses sendAction to send the `enter` action. @method insertNewline @param {Event} event @@ -6341,7 +6351,7 @@ define("ember-handlebars/controls/text_support", Called when the user hits escape. Called by the `Ember.TextSupport` mixin on keyUp if keycode matches 27. - Uses sendAction to send the `escape-press` action to the controller. + Uses sendAction to send the `escape-press` action. @method cancel @param {Event} event @@ -6353,6 +6363,8 @@ define("ember-handlebars/controls/text_support", /** Called when the text area is focused. + Uses sendAction to send the `focus-in` action. + @method focusIn @param {Event} event */ @@ -6361,7 +6373,9 @@ define("ember-handlebars/controls/text_support", }, /** - Called when the text area is blurred. + Called when the text area is blurred. + + Uses sendAction to send the `focus-out` action. @method focusOut @param {Event} event @@ -6371,10 +6385,10 @@ define("ember-handlebars/controls/text_support", }, /** - The action to be sent when the user presses a key. Enabled by setting + Called when the user presses a key. Enabled by setting the `onEvent` property to `keyPress`. - Uses sendAction to send the `keyPress` action to the controller. + Uses sendAction to send the `key-press` action. @method keyPress @param {Event} event @@ -6417,8 +6431,8 @@ define("ember-handlebars/controls/text_support", __exports__["default"] = TextSupport; }); define("ember-handlebars/ext", - ["ember-metal/core","ember-runtime/system/string","ember-handlebars-compiler","ember-metal/property_get","ember-metal/binding","ember-metal/error","ember-metal/mixin","ember-metal/is_empty","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { + ["ember-metal/core","ember-runtime/system/string","ember-handlebars-compiler","ember-metal/property_get","ember-metal/binding","ember-metal/error","ember-metal/mixin","ember-metal/is_empty","ember-metal/cache","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; // Ember.FEATURES, Ember.assert, Ember.Handlebars, Ember.lookup @@ -6453,13 +6467,20 @@ define("ember-handlebars/ext", @param path {String} @param data {Hash} */ + + var Cache = __dependency9__["default"]; + + var FIRST_SEGMENT_CACHE = new Cache(1000, function(path){ + return path.split('.', 1)[0]; + }); + function normalizePath(root, path, data) { - var keywords = (data && data.keywords) || {}, - keyword, isKeyword; + var keywords = (data && data.keywords) || {}; + var keyword, isKeyword; // Get the first segment of the path. For example, if the // path is "foo.bar.baz", returns "foo". - keyword = path.split('.', 1)[0]; + keyword = FIRST_SEGMENT_CACHE.get(path); // Test to see if the first path is a keyword that has been // passed along in the view's data hash. If so, we will treat @@ -6480,7 +6501,11 @@ define("ember-handlebars/ext", } } - return { root: root, path: path, isKeyword: isKeyword }; + return { + root: root, + path: path, + isKeyword: isKeyword + }; } @@ -6496,32 +6521,25 @@ define("ember-handlebars/ext", @param {Object} options The template's option hash */ function handlebarsGet(root, path, options) { - var data = options && options.data, - normalizedPath = normalizePath(root, path, data), - value; + var data = options && options.data; + var normalizedPath = normalizePath(root, path, data); + var value; - if (Ember.FEATURES.isEnabled("ember-handlebars-caps-lookup")) { + // In cases where the path begins with a keyword, change the + // root to the value represented by that keyword, and ensure + // the path is relative to it. + root = normalizedPath.root; + path = normalizedPath.path; - // If the path starts with a capital letter, look it up on Ember.lookup, - // which defaults to the `window` object in browsers. - if (isGlobalPath(path)) { - value = get(Ember.lookup, path); - } else { + value = get(root, path); - // In cases where the path begins with a keyword, change the - // root to the value represented by that keyword, and ensure - // the path is relative to it. - value = get(normalizedPath.root, normalizedPath.path); + if (isGlobalPath(path)) { + if (value === undefined && root !== Ember.lookup) { + root = Ember.lookup; + value = get(root, path); } - - } else { - root = normalizedPath.root; - path = normalizedPath.path; - - value = get(root, path); - - if (value === undefined && root !== Ember.lookup && isGlobalPath(path)) { - value = get(Ember.lookup, path); + if (root === Ember.lookup || root === null) { + Ember.deprecate("Global lookup of "+path+" from a Handlebars template is deprecated.", options.silenceGlobalDeprecation); } } @@ -6769,8 +6787,8 @@ define("ember-handlebars/ext", @param {String} dependentKeys* */ function registerBoundHelper(name, fn) { - var boundHelperArgs = slice.call(arguments, 1), - boundFn = makeBoundHelper.apply(this, boundHelperArgs); + var boundHelperArgs = slice.call(arguments, 1); + var boundFn = makeBoundHelper.apply(this, boundHelperArgs); EmberHandlebars.registerHelper(name, boundFn); } @@ -6805,20 +6823,21 @@ define("ember-handlebars/ext", var dependentKeys = slice.call(arguments, 1); function helper() { - var properties = slice.call(arguments, 0, -1), - numProperties = properties.length, - options = arguments[arguments.length - 1], - normalizedProperties = [], - data = options.data, - types = data.isUnbound ? slice.call(options.types, 1) : options.types, - hash = options.hash, - view = data.view, - contexts = options.contexts, - currentContext = (contexts && contexts.length) ? contexts[0] : this, - prefixPathForDependentKeys = '', - loc, len, hashOption, - boundOption, property, - normalizedValue = SimpleHandlebarsView.prototype.normalizedValue; + var properties = slice.call(arguments, 0, -1); + var numProperties = properties.length; + var options = arguments[arguments.length - 1]; + var normalizedProperties = []; + var data = options.data; + var types = data.isUnbound ? slice.call(options.types, 1) : options.types; + var hash = options.hash; + var hashTypes = options.hashTypes; + var view = data.view; + var contexts = options.contexts; + var currentContext = (contexts && contexts.length) ? contexts[0] : this; + var prefixPathForDependentKeys = ''; + var loc, len, hashOption; + var boundOption, property; + var normalizedValue = SimpleHandlebarsView.prototype.normalizedValue; Ember.assert("registerBoundHelper-generated helpers do not support use with Handlebars blocks.", !options.fn); @@ -6828,6 +6847,8 @@ define("ember-handlebars/ext", if (IS_BINDING.test(hashOption)) { // Lop off 'Binding' suffix. boundOptions[hashOption.slice(0, -7)] = hash[hashOption]; + } else if (hashTypes[hashOption] === 'ID') { + boundOptions[hashOption] = hash[hashOption]; } } @@ -6841,7 +6862,7 @@ define("ember-handlebars/ext", normalizedProperties.push(normalizedProp); watchedProperties.push(normalizedProp); } else { - if(data.isUnbound) { + if (data.isUnbound) { normalizedProperties.push({path: properties[loc]}); }else { normalizedProperties.push(null); @@ -6906,9 +6927,9 @@ define("ember-handlebars/ext", } // Add dependent key observers to the first param - var normalized = normalizedProperties[0], - pathRoot = normalized.root, - path = normalized.path; + var normalized = normalizedProperties[0]; + var pathRoot = normalized.root; + var path = normalized.path; if(!isEmpty(path)) { prefixPathForDependentKeys = path + '.'; @@ -6933,25 +6954,21 @@ define("ember-handlebars/ext", @param {String} options */ function evaluateUnboundHelper(context, fn, normalizedProperties, options) { - var args = [], - hash = options.hash, - boundOptions = hash.boundOptions, - types = slice.call(options.types, 1), - loc, - len, - property, - propertyType, - boundOption; + var args = []; + var hash = options.hash; + var boundOptions = hash.boundOptions; + var types = slice.call(options.types, 1); + var loc, len, property, propertyType, boundOption; for (boundOption in boundOptions) { if (!boundOptions.hasOwnProperty(boundOption)) { continue; } hash[boundOption] = handlebarsGet(context, boundOptions[boundOption], options); } - for(loc = 0, len = normalizedProperties.length; loc < len; ++loc) { + for (loc = 0, len = normalizedProperties.length; loc < len; ++loc) { property = normalizedProperties[loc]; propertyType = types[loc]; - if(propertyType === "ID") { + if (propertyType === "ID") { args.push(handlebarsGet(property.root, property.path, options)); } else { args.push(property.path); @@ -6982,8 +6999,8 @@ define("ember-handlebars/ext", __exports__.evaluateUnboundHelper = evaluateUnboundHelper; }); define("ember-handlebars/helpers/binding", - ["ember-metal/core","ember-handlebars-compiler","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-runtime/system/string","ember-metal/platform","ember-metal/is_none","ember-metal/enumerable_utils","ember-metal/array","ember-views/views/view","ember-metal/run_loop","ember-metal/observer","ember-metal/binding","ember-views/system/jquery","ember-handlebars/ext","ember-runtime/keys","ember-handlebars/views/handlebars_bound_view","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __exports__) { + ["ember-metal/core","ember-handlebars-compiler","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-runtime/system/string","ember-metal/platform","ember-metal/is_none","ember-metal/enumerable_utils","ember-metal/array","ember-views/views/view","ember-metal/run_loop","ember-metal/observer","ember-metal/binding","ember-views/system/jquery","ember-handlebars/ext","ember-metal/keys","ember-metal/cache","ember-handlebars/views/handlebars_bound_view","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __exports__) { "use strict"; /** @module ember @@ -7013,9 +7030,10 @@ define("ember-handlebars/helpers/binding", var isArray = __dependency5__.isArray; var handlebarsGetEscaped = __dependency16__.getEscaped; var keys = __dependency17__["default"]; + var Cache = __dependency18__["default"]; - var _HandlebarsBoundView = __dependency18__._HandlebarsBoundView; - var SimpleHandlebarsView = __dependency18__.SimpleHandlebarsView; + var _HandlebarsBoundView = __dependency19__._HandlebarsBoundView; + var SimpleHandlebarsView = __dependency19__.SimpleHandlebarsView; var normalizePath = __dependency16__.normalizePath; var handlebarsGet = __dependency16__.handlebarsGet; @@ -7084,11 +7102,11 @@ define("ember-handlebars/helpers/binding", // Binds a property into the DOM. This will create a hook in DOM that the // KVO system will look for and update if the property changes. function bind(property, options, preserveContext, shouldDisplay, valueNormalizer, childProperties) { - var data = options.data, - fn = options.fn, - inverse = options.inverse, - view = data.view, - normalized, observer, i; + var data = options.data; + var fn = options.fn; + var inverse = options.inverse; + var view = data.view; + var normalized, observer, i; // we relied on the behavior of calling without // context to mean this === window, but when running @@ -7172,9 +7190,9 @@ define("ember-handlebars/helpers/binding", } function simpleBind(currentContext, property, options) { - var data = options.data, - view = data.view, - normalized, observer, pathRoot, output; + var data = options.data; + var view = data.view; + var normalized, observer, pathRoot, output; normalized = normalizePath(currentContext, property, data); pathRoot = normalized.root; @@ -7257,6 +7275,10 @@ define("ember-handlebars/helpers/binding", return helpers.bind.call(this, property, options); } + var ISNT_HELPER_CACHE = new Cache(1000, function(key) { + return key.indexOf('-') === -1; + }); + __exports__.ISNT_HELPER_CACHE = ISNT_HELPER_CACHE; /** Used to lookup/resolve handlebars helpers. The lookup order is: @@ -7277,7 +7299,7 @@ define("ember-handlebars/helpers/binding", return helpers[name]; } - if (!container || name.indexOf('-') === -1) { + if (!container || ISNT_HELPER_CACHE.get(name)) { return; } @@ -7358,7 +7380,6 @@ define("ember-handlebars/helpers/binding", return bind.call(context, property, fn, true, shouldDisplayIfHelperContent, shouldDisplayIfHelperContent, ['isTruthy', 'length']); } - /** @private @@ -7378,11 +7399,11 @@ define("ember-handlebars/helpers/binding", @since 1.4.0 */ function unboundIfHelper(property, fn) { - var context = (fn.contexts && fn.contexts.length) ? fn.contexts[0] : this, - data = fn.data, - template = fn.fn, - inverse = fn.inverse, - normalized, propertyValue, result; + var context = (fn.contexts && fn.contexts.length) ? fn.contexts[0] : this; + var data = fn.data; + var template = fn.fn; + var inverse = fn.inverse; + var normalized, propertyValue, result; normalized = normalizePath(context, property, data); propertyValue = handlebarsGet(context, property, fn); @@ -7512,7 +7533,7 @@ define("ember-handlebars/helpers/binding", localizedOptions.hash.keywordPath = contextPath; bindContext = this; - context = path; + context = contextPath; options = localizedOptions; preserveContext = true; } else { @@ -7589,7 +7610,7 @@ define("ember-handlebars/helpers/binding", imageTitle ``` - The above handlebars template will fill the ``'s `src` attribute will + The above handlebars template will fill the ``'s `src` attribute with the value of the property referenced with `"imageUrl"` and its `alt` attribute with the value of the property referenced with `"imageTitle"`. @@ -7743,8 +7764,8 @@ define("ember-handlebars/helpers/binding", normalized = normalizePath(ctx, path, options.data); - var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options), - type = typeOf(value); + var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options); + var type = typeOf(value); Ember.assert(fmt("Attributes must be numbers, strings or booleans, not %@", [value]), value === null || value === undefined || type === 'number' || type === 'string' || type === 'boolean'); @@ -7840,8 +7861,8 @@ define("ember-handlebars/helpers/binding", // determine which class string to return, based on whether it is // a Boolean or not. var classStringForPath = function(root, parsedPath, options) { - var val, - path = parsedPath.path; + var val; + var path = parsedPath.path; if (path === 'this') { val = root; @@ -7862,13 +7883,11 @@ define("ember-handlebars/helpers/binding", // closes over this variable, so it knows which string to remove when // the property changes. var oldClass; - var observer; - - var parsedPath = View._parsePropertyPath(binding), - path = parsedPath.path, - pathRoot = context, - normalized; + var parsedPath = View._parsePropertyPath(binding); + var path = parsedPath.path; + var pathRoot = context; + var normalized; if (path !== '' && path !== 'this') { normalized = normalizePath(context, path, options.data); @@ -8112,6 +8131,7 @@ define("ember-handlebars/helpers/collection", if (path) { controller = data.keywords.controller; container = controller && controller.container; + options.silenceGlobalDeprecation = true; collectionClass = handlebarsGet(this, path, options) || container.lookupFactory('view:' + path); Ember.assert(fmt("%@ #collection: Could not find collection class %@", [data.view, path]), !!collectionClass); } @@ -8138,6 +8158,7 @@ define("ember-handlebars/helpers/collection", "not found at " + container.describe("view:" + hash.itemView) + " (and it was not registered in the container)", !!itemViewClass); } else if (hash.itemViewClass) { + options.silenceGlobalDeprecation = true; itemViewClass = handlebarsGet(collectionPrototype, hash.itemViewClass, options); } else { itemViewClass = collectionPrototype.itemViewClass; @@ -8177,6 +8198,7 @@ define("ember-handlebars/helpers/collection", tagName: itemHash.tagName }); } else if (hash.emptyViewClass) { + options.silenceGlobalDeprecation = true; emptyViewClass = handlebarsGet(this, hash.emptyViewClass, options); } if (emptyViewClass) { hash.emptyView = emptyViewClass; } @@ -8815,7 +8837,7 @@ define("ember-handlebars/helpers/loc", Take note that `"welcome"` is a string and not an object reference. - See [Ember.String.loc](/api/classes/Ember.String.html#method_loc) for how to + See [Ember.String.loc](/api/classes/Ember.String.html#method_loc) for how to set up localized string references. @method loc @@ -9081,8 +9103,8 @@ define("ember-handlebars/helpers/unbound", } }); define("ember-handlebars/helpers/view", - ["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-views/system/jquery","ember-views/views/view","ember-metal/binding","ember-handlebars/ext","ember-runtime/system/string","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) { + ["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-views/system/jquery","ember-views/views/view","ember-metal/binding","ember-metal/merge","ember-handlebars/ext","ember-runtime/system/string","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) { "use strict"; /*globals Handlebars */ @@ -9102,9 +9124,10 @@ define("ember-handlebars/helpers/view", var jQuery = __dependency6__["default"]; var View = __dependency7__["default"]; var isGlobalPath = __dependency8__.isGlobalPath; - var normalizePath = __dependency9__.normalizePath; - var handlebarsGet = __dependency9__.handlebarsGet; - var EmberString = __dependency10__["default"]; + var merge = __dependency9__["default"]; + var normalizePath = __dependency10__.normalizePath; + var handlebarsGet = __dependency10__.handlebarsGet; + var EmberString = __dependency11__["default"]; var LOWERCASE_A_Z = /^[a-z]/, @@ -9132,6 +9155,7 @@ define("ember-handlebars/helpers/view", if (hash.hasOwnProperty('idBinding')) { // id can't be bound, so just perform one-time lookup. + options.silenceGlobalDeprecation = true; hash.id = handlebarsGet(thisContext, hash.idBinding, options); hashType.id = 'STRING'; delete hash.idBinding; @@ -9181,7 +9205,7 @@ define("ember-handlebars/helpers/view", } if (dup) { - hash = jQuery.extend({}, hash); + hash = merge({}, hash); delete hash.id; delete hash.tag; delete hash['class']; @@ -9223,7 +9247,7 @@ define("ember-handlebars/helpers/view", } } - return jQuery.extend(hash, extensions); + return merge(hash, extensions); }, // Transform bindings from the current context to a context that can be evaluated within the view. @@ -9259,6 +9283,7 @@ define("ember-handlebars/helpers/view", if (options.types[0] === 'STRING' && LOWERCASE_A_Z.test(path) && !VIEW_PREFIX.test(path)) { lookup = path; } else { + options.silenceGlobalDeprecation = true; newView = handlebarsGet(thisContext, path, options); if (typeof newView === 'string') { lookup = newView; @@ -9471,11 +9496,14 @@ define("ember-handlebars/helpers/view", Ember.assert("The view helper only takes a single argument", arguments.length <= 2); // If no path is provided, treat path param as options - // and get an instance of the registered `view:default` + // and get an instance of the registered `view:toplevel` if (path && path.data && path.data.isRenderData) { options = path; - Ember.assert('{{view}} helper requires parent view to have a container but none was found. This usually happens when you are manually-managing views.', !!options.data.view.container); - path = options.data.view.container.lookupFactory('view:default'); + if (options.data && options.data.view && options.data.view.container) { + path = options.data.view.container.lookupFactory('view:toplevel'); + } else { + path = View; + } } options.helperName = options.helperName || 'view'; @@ -9744,8 +9772,8 @@ define("ember-handlebars/string", __exports__["default"] = htmlSafe; }); define("ember-handlebars/views/handlebars_bound_view", - ["ember-handlebars-compiler","ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-views/views/view","ember-views/views/states","ember-handlebars/views/metamorph_view","ember-handlebars/ext","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) { + ["ember-handlebars-compiler","ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-views/views/view","ember-views/views/states","ember-handlebars/views/metamorph_view","ember-handlebars/ext","ember-metal/utils","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) { "use strict"; /*globals Handlebars, Metamorph:true */ /*jshint newcap:false*/ @@ -9779,13 +9807,15 @@ define("ember-handlebars/views/handlebars_bound_view", var _MetamorphView = __dependency11__["default"]; var handlebarsGet = __dependency12__.handlebarsGet; + var uuid = __dependency13__.uuid; function SimpleHandlebarsView(path, pathRoot, isEscaped, templateData) { this.path = path; this.pathRoot = pathRoot; this.isEscaped = isEscaped; this.templateData = templateData; - + this[Ember.GUID_KEY] = uuid(); + this._lastNormalizedValue = undefined; this.morph = Metamorph(); this.state = 'preRender'; this.updateId = null; @@ -9814,9 +9844,9 @@ define("ember-handlebars/views/handlebars_bound_view", propertyDidChange: K, normalizedValue: function() { - var path = this.path, - pathRoot = this.pathRoot, - result, templateData; + var path = this.path; + var pathRoot = this.pathRoot; + var result, templateData; // Use the pathRoot as the result if no path is provided. This // happens if the path is `this`, which gets normalized into @@ -9842,12 +9872,12 @@ define("ember-handlebars/views/handlebars_bound_view", buffer.push(string); }, - render: function() { + render: function(value) { // If not invoked via a triple-mustache ({{{foo}}}), escape // the content of the template. var escape = this.isEscaped; - var result = this.normalizedValue(); - + var result = value || this.normalizedValue(); + this._lastNormalizedValue = result; if (result === null || result === undefined) { result = ""; } else if (!(result instanceof SafeString)) { @@ -9876,7 +9906,10 @@ define("ember-handlebars/views/handlebars_bound_view", update: function () { this.updateId = null; - this.morph.html(this.render()); + var value = this.normalizedValue(); + if (value !== this._lastNormalizedValue) { + this.morph.html(this.render(value)); + } }, _transitionTo: function(state) { @@ -9998,10 +10031,10 @@ define("ember-handlebars/views/handlebars_bound_view", pathRoot: null, normalizedValue: function() { - var path = get(this, 'path'), - pathRoot = get(this, 'pathRoot'), - valueNormalizer = get(this, 'valueNormalizerFunc'), - result, templateData; + var path = get(this, 'path'); + var pathRoot = get(this, 'pathRoot'); + var valueNormalizer = get(this, 'valueNormalizerFunc'); + var result, templateData; // Use the pathRoot as the result if no path is provided. This // happens if the path is `this`, which gets normalized into @@ -10043,14 +10076,15 @@ define("ember-handlebars/views/handlebars_bound_view", // the content of the template. var escape = get(this, 'isEscaped'); - var shouldDisplay = get(this, 'shouldDisplayFunc'), - preserveContext = get(this, 'preserveContext'), - context = get(this, 'previousContext'); + var shouldDisplay = get(this, 'shouldDisplayFunc'); + var preserveContext = get(this, 'preserveContext'); + var context = get(this, 'previousContext'); - var inverseTemplate = get(this, 'inverseTemplate'), - displayTemplate = get(this, 'displayTemplate'); + var inverseTemplate = get(this, 'inverseTemplate'); + var displayTemplate = get(this, 'displayTemplate'); var result = this.normalizedValue(); + this._lastNormalizedValue = result; // First, test the conditional to see if we should @@ -10248,8 +10282,8 @@ define("ember-handlebars/views/metamorph_view", __exports__._SimpleMetamorphView = _SimpleMetamorphView;__exports__["default"] = View.extend(_Metamorph); }); define("ember-metal", - ["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __exports__) { + ["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/cache","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/computed_macros","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","ember-metal/is_present","ember-metal/keys","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __dependency26__, __dependency27__, __dependency28__, __dependency29__, __dependency30__, __dependency31__, __dependency32__, __dependency33__, __dependency34__, __dependency35__, __dependency36__, __exports__) { "use strict"; /** Ember Metal @@ -10267,7 +10301,6 @@ define("ember-metal", var reset = __dependency3__.reset; var generateGuid = __dependency4__.generateGuid; var GUID_KEY = __dependency4__.GUID_KEY; - var GUID_PREFIX = __dependency4__.GUID_PREFIX; var guidFor = __dependency4__.guidFor; var META_DESC = __dependency4__.META_DESC; var EMPTY_META = __dependency4__.EMPTY_META; @@ -10288,98 +10321,103 @@ define("ember-metal", var applyStr = __dependency4__.applyStr; var EmberError = __dependency5__["default"]; var EnumerableUtils = __dependency6__["default"]; + var Cache = __dependency7__["default"]; + var create = __dependency8__.create; + var platform = __dependency8__.platform; + var map = __dependency9__.map; + var forEach = __dependency9__.forEach; + var filter = __dependency9__.filter; + var indexOf = __dependency9__.indexOf; + var Logger = __dependency10__["default"]; - var create = __dependency7__.create; - var platform = __dependency7__.platform; - var map = __dependency8__.map; - var forEach = __dependency8__.forEach; - var filter = __dependency8__.filter; - var indexOf = __dependency8__.indexOf; - var Logger = __dependency9__["default"]; + var get = __dependency11__.get; + var getWithDefault = __dependency11__.getWithDefault; + var normalizeTuple = __dependency11__.normalizeTuple; + var _getPath = __dependency11__._getPath; - var get = __dependency10__.get; - var getWithDefault = __dependency10__.getWithDefault; - var normalizeTuple = __dependency10__.normalizeTuple; - var _getPath = __dependency10__._getPath; + var on = __dependency12__.on; + var addListener = __dependency12__.addListener; + var removeListener = __dependency12__.removeListener; + var suspendListener = __dependency12__.suspendListener; + var suspendListeners = __dependency12__.suspendListeners; + var sendEvent = __dependency12__.sendEvent; + var hasListeners = __dependency12__.hasListeners; + var watchedEvents = __dependency12__.watchedEvents; + var listenersFor = __dependency12__.listenersFor; + var listenersDiff = __dependency12__.listenersDiff; + var listenersUnion = __dependency12__.listenersUnion; - var on = __dependency11__.on; - var addListener = __dependency11__.addListener; - var removeListener = __dependency11__.removeListener; - var suspendListener = __dependency11__.suspendListener; - var suspendListeners = __dependency11__.suspendListeners; - var sendEvent = __dependency11__.sendEvent; - var hasListeners = __dependency11__.hasListeners; - var watchedEvents = __dependency11__.watchedEvents; - var listenersFor = __dependency11__.listenersFor; - var listenersDiff = __dependency11__.listenersDiff; - var listenersUnion = __dependency11__.listenersUnion; + var ObserverSet = __dependency13__["default"]; - var ObserverSet = __dependency12__["default"]; + var propertyWillChange = __dependency14__.propertyWillChange; + var propertyDidChange = __dependency14__.propertyDidChange; + var overrideChains = __dependency14__.overrideChains; + var beginPropertyChanges = __dependency14__.beginPropertyChanges; + var endPropertyChanges = __dependency14__.endPropertyChanges; + var changeProperties = __dependency14__.changeProperties; - var propertyWillChange = __dependency13__.propertyWillChange; - var propertyDidChange = __dependency13__.propertyDidChange; - var overrideChains = __dependency13__.overrideChains; - var beginPropertyChanges = __dependency13__.beginPropertyChanges; - var endPropertyChanges = __dependency13__.endPropertyChanges; - var changeProperties = __dependency13__.changeProperties; + var Descriptor = __dependency15__.Descriptor; + var defineProperty = __dependency15__.defineProperty; + var set = __dependency16__.set; + var trySet = __dependency16__.trySet; - var Descriptor = __dependency14__.Descriptor; - var defineProperty = __dependency14__.defineProperty; - var set = __dependency15__.set; - var trySet = __dependency15__.trySet; + var OrderedSet = __dependency17__.OrderedSet; + var Map = __dependency17__.Map; + var MapWithDefault = __dependency17__.MapWithDefault; + var getProperties = __dependency18__["default"]; + var setProperties = __dependency19__["default"]; + var watchKey = __dependency20__.watchKey; + var unwatchKey = __dependency20__.unwatchKey; + var flushPendingChains = __dependency21__.flushPendingChains; + var removeChainWatcher = __dependency21__.removeChainWatcher; + var ChainNode = __dependency21__.ChainNode; + var finishChains = __dependency21__.finishChains; + var watchPath = __dependency22__.watchPath; + var unwatchPath = __dependency22__.unwatchPath; + var watch = __dependency23__.watch; + var isWatching = __dependency23__.isWatching; + var unwatch = __dependency23__.unwatch; + var rewatch = __dependency23__.rewatch; + var destroy = __dependency23__.destroy; + var expandProperties = __dependency24__["default"]; + var ComputedProperty = __dependency25__.ComputedProperty; + var computed = __dependency25__.computed; + var cacheFor = __dependency25__.cacheFor; - var OrderedSet = __dependency16__.OrderedSet; - var Map = __dependency16__.Map; - var MapWithDefault = __dependency16__.MapWithDefault; - var getProperties = __dependency17__["default"]; - var setProperties = __dependency18__["default"]; - var watchKey = __dependency19__.watchKey; - var unwatchKey = __dependency19__.unwatchKey; - var flushPendingChains = __dependency20__.flushPendingChains; - var removeChainWatcher = __dependency20__.removeChainWatcher; - var ChainNode = __dependency20__.ChainNode; - var finishChains = __dependency20__.finishChains; - var watchPath = __dependency21__.watchPath; - var unwatchPath = __dependency21__.unwatchPath; - var watch = __dependency22__.watch; - var isWatching = __dependency22__.isWatching; - var unwatch = __dependency22__.unwatch; - var rewatch = __dependency22__.rewatch; - var destroy = __dependency22__.destroy; - var expandProperties = __dependency23__["default"]; - var ComputedProperty = __dependency24__.ComputedProperty; - var computed = __dependency24__.computed; - var cacheFor = __dependency24__.cacheFor; + // side effect of defining the computed.* macros + + var addObserver = __dependency27__.addObserver; + var observersFor = __dependency27__.observersFor; + var removeObserver = __dependency27__.removeObserver; + var addBeforeObserver = __dependency27__.addBeforeObserver; + var _suspendBeforeObserver = __dependency27__._suspendBeforeObserver; + var _suspendObserver = __dependency27__._suspendObserver; + var _suspendBeforeObservers = __dependency27__._suspendBeforeObservers; + var _suspendObservers = __dependency27__._suspendObservers; + var beforeObserversFor = __dependency27__.beforeObserversFor; + var removeBeforeObserver = __dependency27__.removeBeforeObserver; + var IS_BINDING = __dependency28__.IS_BINDING; + var mixin = __dependency28__.mixin; + var Mixin = __dependency28__.Mixin; + var required = __dependency28__.required; + var aliasMethod = __dependency28__.aliasMethod; + var observer = __dependency28__.observer; + var immediateObserver = __dependency28__.immediateObserver; + var beforeObserver = __dependency28__.beforeObserver; + var Binding = __dependency29__.Binding; + var isGlobalPath = __dependency29__.isGlobalPath; + var bind = __dependency29__.bind; + var oneWay = __dependency29__.oneWay; + var run = __dependency30__["default"]; + var libraries = __dependency31__["default"]; + var isNone = __dependency32__.isNone; + var none = __dependency32__.none; + var isEmpty = __dependency33__.isEmpty; + var empty = __dependency33__.empty; + var isBlank = __dependency34__["default"]; + var isPresent = __dependency35__["default"]; + var keys = __dependency36__["default"]; - var addObserver = __dependency25__.addObserver; - var observersFor = __dependency25__.observersFor; - var removeObserver = __dependency25__.removeObserver; - var addBeforeObserver = __dependency25__.addBeforeObserver; - var _suspendBeforeObserver = __dependency25__._suspendBeforeObserver; - var _suspendObserver = __dependency25__._suspendObserver; - var _suspendBeforeObservers = __dependency25__._suspendBeforeObservers; - var _suspendObservers = __dependency25__._suspendObservers; - var beforeObserversFor = __dependency25__.beforeObserversFor; - var removeBeforeObserver = __dependency25__.removeBeforeObserver; - var IS_BINDING = __dependency26__.IS_BINDING; - var mixin = __dependency26__.mixin; - var Mixin = __dependency26__.Mixin; - var required = __dependency26__.required; - var aliasMethod = __dependency26__.aliasMethod; - var observer = __dependency26__.observer; - var immediateObserver = __dependency26__.immediateObserver; - var beforeObserver = __dependency26__.beforeObserver; - var Binding = __dependency27__.Binding; - var isGlobalPath = __dependency27__.isGlobalPath; - var bind = __dependency27__.bind; - var oneWay = __dependency27__.oneWay; - var run = __dependency28__["default"]; - var libraries = __dependency29__["default"]; - var isNone = __dependency30__.isNone; - var none = __dependency30__.none; - var isEmpty = __dependency31__.isEmpty; - var empty = __dependency31__.empty; - var isBlank = __dependency32__["default"]; // END IMPORTS // BEGIN EXPORTS @@ -10392,10 +10430,12 @@ define("ember-metal", Ember.instrument = instrument; Ember.subscribe = subscribe; + Ember._Cache = Cache; + Ember.generateGuid = generateGuid; Ember.GUID_KEY = GUID_KEY; - Ember.GUID_PREFIX = GUID_PREFIX; Ember.create = create; + Ember.keys = keys; Ember.platform = platform; var EmberArrayPolyfills = Ember.ArrayPolyfills = {}; @@ -10529,6 +10569,10 @@ define("ember-metal", Ember.isBlank = isBlank; + if (Ember.FEATURES.isEnabled('ember-metal-is-present')) { + Ember.isPresent = isPresent; + } + Ember.merge = merge; /** @@ -10562,6 +10606,86 @@ define("ember-metal", __exports__["default"] = Ember; }); +define("ember-metal/alias", + ["ember-metal/property_get","ember-metal/property_set","ember-metal/error","ember-metal/properties","ember-metal/computed","ember-metal/platform","ember-metal/utils","ember-metal/dependent_keys","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { + "use strict"; + var get = __dependency1__.get; + var set = __dependency2__.set; + var EmberError = __dependency3__["default"]; + var Descriptor = __dependency4__.Descriptor; + var defineProperty = __dependency4__.defineProperty; + var ComputedProperty = __dependency5__.ComputedProperty; + var create = __dependency6__.create; + var meta = __dependency7__.meta; + var inspect = __dependency7__.inspect; + var addDependentKeys = __dependency8__.addDependentKeys; + var removeDependentKeys = __dependency8__.removeDependentKeys; + + function alias(altKey) { + return new AliasedProperty(altKey); + } + + __exports__.alias = alias;function AliasedProperty(altKey) { + this.altKey = altKey; + this._dependentKeys = [ altKey ]; + } + + __exports__.AliasedProperty = AliasedProperty;AliasedProperty.prototype = create(Descriptor.prototype); + + AliasedProperty.prototype.get = function AliasedProperty_get(obj, keyName) { + return get(obj, this.altKey); + }; + + AliasedProperty.prototype.set = function AliasedProperty_set(obj, keyName, value) { + return set(obj, this.altKey, value); + }; + + AliasedProperty.prototype.willWatch = function(obj, keyName) { + addDependentKeys(this, obj, keyName, meta(obj)); + }; + + AliasedProperty.prototype.didUnwatch = function(obj, keyName) { + removeDependentKeys(this, obj, keyName, meta(obj)); + }; + + AliasedProperty.prototype.setup = function(obj, keyName) { + var m = meta(obj); + if (m.watching[keyName]) { + addDependentKeys(this, obj, keyName, m); + } + }; + + AliasedProperty.prototype.teardown = function(obj, keyName) { + var m = meta(obj); + if (m.watching[keyName]) { + removeDependentKeys(this, obj, keyName, m); + } + }; + + AliasedProperty.prototype.readOnly = function() { + this.set = AliasedProperty_readOnlySet; + return this; + }; + + function AliasedProperty_readOnlySet(obj, keyName, value) { + throw new EmberError('Cannot set read-only property "' + keyName + '" on object: ' + inspect(obj)); + } + + AliasedProperty.prototype.oneWay = function() { + this.set = AliasedProperty_oneWaySet; + return this; + }; + + function AliasedProperty_oneWaySet(obj, keyName, value) { + defineProperty(obj, keyName, null); + return set(obj, keyName, value); + } + + // Backwards compatibility with Ember Data + AliasedProperty.prototype._meta = undefined; + AliasedProperty.prototype.meta = ComputedProperty.prototype.meta; + }); define("ember-metal/array", ["exports"], function(__exports__) { @@ -10579,22 +10703,26 @@ define("ember-metal/array", return func && Function.prototype.toString.call(func).indexOf('[native code]') > -1; }; + var defineNativeShim = function(nativeFunc, shim) { + if (isNativeFunc(nativeFunc)) { + return nativeFunc; + } + return shim; + }; + // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map - var map = isNativeFunc(ArrayPrototype.map) ? ArrayPrototype.map : function(fun /*, thisp */) { + var map = defineNativeShim(ArrayPrototype.map, function(fun /*, thisp */) { //"use strict"; - if (this === void 0 || this === null) { + if (this === void 0 || this === null || typeof fun !== "function") { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { - throw new TypeError(); - } - var res = new Array(len); var thisp = arguments[1]; + for (var i = 0; i < len; i++) { if (i in t) { res[i] = fun.call(thisp, t[i], i, t); @@ -10602,44 +10730,61 @@ define("ember-metal/array", } return res; - }; + }); // From: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach - var forEach = isNativeFunc(ArrayPrototype.forEach) ? ArrayPrototype.forEach : function(fun /*, thisp */) { + var forEach = defineNativeShim(ArrayPrototype.forEach, function(fun /*, thisp */) { //"use strict"; - if (this === void 0 || this === null) { + if (this === void 0 || this === null || typeof fun !== "function") { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; - if (typeof fun !== "function") { - throw new TypeError(); - } - var thisp = arguments[1]; + for (var i = 0; i < len; i++) { if (i in t) { fun.call(thisp, t[i], i, t); } } - }; + }); + + var indexOf = defineNativeShim(ArrayPrototype.indexOf, function (obj, fromIndex) { + if (fromIndex === null || fromIndex === undefined) { + fromIndex = 0; + } + else if (fromIndex < 0) { + fromIndex = Math.max(0, this.length + fromIndex); + } - var indexOf = isNativeFunc(ArrayPrototype.indexOf) ? ArrayPrototype.indexOf : function (obj, fromIndex) { - if (fromIndex === null || fromIndex === undefined) { fromIndex = 0; } - else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); } for (var i = fromIndex, j = this.length; i < j; i++) { - if (this[i] === obj) { return i; } + if (this[i] === obj) { + return i; + } } return -1; - }; + }); - var filter = isNativeFunc(ArrayPrototype.filter) ? ArrayPrototype.filter : function (fn, context) { + var lastIndexOf = defineNativeShim(ArrayPrototype.lastIndexOf, function(obj, fromIndex) { + var idx, len = this.length; + + if (fromIndex === undefined) fromIndex = len-1; + else fromIndex = (fromIndex < 0) ? Math.ceil(fromIndex) : Math.floor(fromIndex); + if (fromIndex < 0) fromIndex += len; + + for(idx = fromIndex;idx>=0;idx--) { + if (this[idx] === obj) return idx ; + } + return -1; + }); + + var filter = defineNativeShim(ArrayPrototype.filter, function (fn, context) { var i, - value, - result = [], - length = this.length; + value, + result = [], + length = this.length; for (i = 0; i < length; i++) { if (this.hasOwnProperty(i)) { @@ -10650,25 +10795,14 @@ define("ember-metal/array", } } return result; - }; - + }); if (Ember.SHIM_ES5) { - if (!ArrayPrototype.map) { - ArrayPrototype.map = map; - } - - if (!ArrayPrototype.forEach) { - ArrayPrototype.forEach = forEach; - } - - if (!ArrayPrototype.filter) { - ArrayPrototype.filter = filter; - } - - if (!ArrayPrototype.indexOf) { - ArrayPrototype.indexOf = indexOf; - } + ArrayPrototype.map = ArrayPrototype.map || map; + ArrayPrototype.forEach = ArrayPrototype.forEach || forEach; + ArrayPrototype.filter = ArrayPrototype.filter || filter; + ArrayPrototype.indexOf = ArrayPrototype.indexOf || indexOf; + ArrayPrototype.lastIndexOf = ArrayPrototype.lastIndexOf || lastIndexOf; } /** @@ -10681,10 +10815,11 @@ define("ember-metal/array", __exports__.forEach = forEach; __exports__.filter = filter; __exports__.indexOf = indexOf; + __exports__.lastIndexOf = lastIndexOf; }); define("ember-metal/binding", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/map","ember-metal/observer","ember-metal/run_loop","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/map","ember-metal/observer","ember-metal/run_loop","ember-metal/path_cache","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; // Ember.Logger, Ember.LOG_BINDINGS, assert @@ -10697,6 +10832,8 @@ define("ember-metal/binding", var removeObserver = __dependency6__.removeObserver; var _suspendObserver = __dependency6__._suspendObserver; var run = __dependency7__["default"]; + var isGlobalPath = __dependency8__.isGlobal; + // ES6TODO: where is Ember.lookup defined? /** @@ -10719,8 +10856,6 @@ define("ember-metal/binding", */ Ember.LOG_BINDINGS = false || !!Ember.ENV.LOG_BINDINGS; - var IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/; - /** Returns true if the provided path is global (e.g., `MyApp.fooController.bar`) instead of local (`foo.bar.baz`). @@ -10731,9 +10866,6 @@ define("ember-metal/binding", @param {String} path @return Boolean */ - function isGlobalPath(path) { - return IS_GLOBAL.test(path); - } function getWithGlobals(obj, path) { return get(isGlobalPath(path) ? Ember.lookup : obj, path); @@ -10743,12 +10875,14 @@ define("ember-metal/binding", // BINDING // - var Binding = function(toPath, fromPath) { + function Binding(toPath, fromPath) { this._direction = 'fwd'; this._from = fromPath; this._to = toPath; this._directionMap = Map.create(); - }; + this._readyToSync = undefined; + this._oneWay = undefined; + } /** @class Binding @@ -11012,7 +11146,6 @@ define("ember-metal/binding", } }); - /** An `Ember.Binding` connects the properties of two objects so that whenever the value of one property changes, the other property will be changed also. @@ -11166,6 +11299,66 @@ define("ember-metal/binding", __exports__.oneWay = oneWay;__exports__.Binding = Binding; __exports__.isGlobalPath = isGlobalPath; }); +define("ember-metal/cache", + ["ember-metal/dictionary","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var dictionary = __dependency1__["default"]; + __exports__["default"] = Cache; + + function Cache(limit, func) { + this.store = dictionary(null); + this.size = 0; + this.misses = 0; + this.hits = 0; + this.limit = limit; + this.func = func; + } + + var FALSE = function() { }; + var ZERO = function() { }; + var UNDEFINED = function() { }; + var NULL = function() { }; + + Cache.prototype = { + set: function(key, value) { + if (this.limit > this.size) { + this.size ++; + if (value === undefined) { + this.store[key] = UNDEFINED; + } else { + this.store[key] = value; + } + } + + return value; + }, + + get: function(key) { + var value = this.store[key]; + + if (value === undefined) { + this.misses ++; + value = this.set(key, this.func(key)); + } else if (value === UNDEFINED) { + this.hits ++; + value = UNDEFINED; + } else { + this.hits ++; + // nothing to translate + } + + return value; + }, + + purge: function() { + this.store = dictionary(null); + this.size = 0; + this.hits = 0; + this.misses = 0; + } + }; + }); define("ember-metal/chains", ["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/array","ember-metal/watch_key","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { @@ -11175,7 +11368,6 @@ define("ember-metal/chains", var get = __dependency2__.get; var normalizeTuple = __dependency2__.normalizeTuple; var meta = __dependency3__.meta; - var META_KEY = __dependency3__.META_KEY; var forEach = __dependency4__.forEach; var watchKey = __dependency5__.watchKey; var unwatchKey = __dependency5__.unwatchKey; @@ -11221,7 +11413,7 @@ define("ember-metal/chains", function removeChainWatcher(obj, keyName, node) { if (!obj || 'object' !== typeof obj) { return; } // nothing to do - var m = obj[META_KEY]; + var m = obj['__ember_meta__']; if (m && !m.hasOwnProperty('chainWatchers')) { return; } // nothing to do var nodes = m && m.chainWatchers; @@ -11275,7 +11467,7 @@ define("ember-metal/chains", function lazyGet(obj, key) { if (!obj) return undefined; - var meta = obj[META_KEY]; + var meta = obj['__ember_meta__']; // check if object meant only to be a prototype if (meta && meta.proto === obj) return undefined; @@ -11495,7 +11687,7 @@ define("ember-metal/chains", function finishChains(obj) { // We only create meta if we really have to - var m = obj[META_KEY], chains = m && m.chains; + var m = obj['__ember_meta__'], chains = m && m.chains; if (chains) { if (chains.value() !== obj) { metaFor(obj).chains = chains = chains.copy(obj); @@ -11509,29 +11701,22 @@ define("ember-metal/chains", __exports__.ChainNode = ChainNode; }); define("ember-metal/computed", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/watching","ember-metal/expand_properties","ember-metal/error","ember-metal/properties","ember-metal/property_events","ember-metal/is_empty","ember-metal/is_none","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/expand_properties","ember-metal/error","ember-metal/properties","ember-metal/property_events","ember-metal/dependent_keys","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; var get = __dependency2__.get; var set = __dependency3__.set; var meta = __dependency4__.meta; - var META_KEY = __dependency4__.META_KEY; - var guidFor = __dependency4__.guidFor; - var typeOf = __dependency4__.typeOf; var inspect = __dependency4__.inspect; - var EnumerableUtils = __dependency5__["default"]; - var create = __dependency6__.create; - var watch = __dependency7__.watch; - var unwatch = __dependency7__.unwatch; - var expandProperties = __dependency8__["default"]; - var EmberError = __dependency9__["default"]; - var Descriptor = __dependency10__.Descriptor; - var defineProperty = __dependency10__.defineProperty; - var propertyWillChange = __dependency11__.propertyWillChange; - var propertyDidChange = __dependency11__.propertyDidChange; - var isEmpty = __dependency12__["default"]; - var isNone = __dependency13__.isNone; + var expandProperties = __dependency5__["default"]; + var EmberError = __dependency6__["default"]; + var Descriptor = __dependency7__.Descriptor; + var defineProperty = __dependency7__.defineProperty; + var propertyWillChange = __dependency8__.propertyWillChange; + var propertyDidChange = __dependency8__.propertyDidChange; + var addDependentKeys = __dependency9__.addDependentKeys; + var removeDependentKeys = __dependency9__.removeDependentKeys; /** @module ember-metal @@ -11541,84 +11726,10 @@ define("ember-metal/computed", var metaFor = meta, - a_slice = [].slice, - o_create = create; + a_slice = [].slice; function UNDEFINED() { } - var lengthPattern = /\.(length|\[\])$/; - - // .......................................................... - // DEPENDENT KEYS - // - - // data structure: - // meta.deps = { - // 'depKey': { - // 'keyName': count, - // } - // } - - /* - This function returns a map of unique dependencies for a - given object and key. - */ - function keysForDep(depsMeta, depKey) { - var keys = depsMeta[depKey]; - if (!keys) { - // if there are no dependencies yet for a the given key - // create a new empty list of dependencies for the key - keys = depsMeta[depKey] = {}; - } else if (!depsMeta.hasOwnProperty(depKey)) { - // otherwise if the dependency list is inherited from - // a superclass, clone the hash - keys = depsMeta[depKey] = o_create(keys); - } - return keys; - } - - function metaForDeps(meta) { - return keysForDep(meta, 'deps'); - } - - function addDependentKeys(desc, obj, keyName, meta) { - // the descriptor has a list of dependent keys, so - // add all of its dependent keys. - var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys; - if (!depKeys) return; - - depsMeta = metaForDeps(meta); - - for(idx = 0, len = depKeys.length; idx < len; idx++) { - depKey = depKeys[idx]; - // Lookup keys meta for depKey - keys = keysForDep(depsMeta, depKey); - // Increment the number of times depKey depends on keyName. - keys[keyName] = (keys[keyName] || 0) + 1; - // Watch the depKey - watch(obj, depKey, meta); - } - } - - function removeDependentKeys(desc, obj, keyName, meta) { - // the descriptor has a list of dependent keys, so - // remove all of its dependent keys. - var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys; - if (!depKeys) return; - - depsMeta = metaForDeps(meta); - - for(idx = 0, len = depKeys.length; idx < len; idx++) { - depKey = depKeys[idx]; - // Lookup keys meta for depKey - keys = keysForDep(depsMeta, depKey); - // Decrement the number of times depKey depends on keyName. - keys[keyName] = (keys[keyName] || 0) - 1; - // Unwatch the depKey - unwatch(obj, depKey, meta); - } - } - // .......................................................... // COMPUTED PROPERTY // @@ -11756,7 +11867,7 @@ define("ember-metal/computed", @return {Ember.ComputedProperty} this @chainable */ - ComputedPropertyPrototype.volatile = function() { + ComputedPropertyPrototype["volatile"] = function() { return this.cacheable(false); }; @@ -11954,13 +12065,13 @@ define("ember-metal/computed", @return {Object} The return value of the function backing the CP. */ ComputedPropertyPrototype.set = function(obj, keyName, value) { - var cacheable = this._cacheable, - func = this.func, - meta = metaFor(obj, cacheable), - oldSuspended = this._suspended, - hadCachedValue = false, - cache = meta.cache, - funcArgLength, cachedValue, ret; + var cacheable = this._cacheable; + var func = this.func; + var meta = metaFor(obj, cacheable); + var oldSuspended = this._suspended; + var hadCachedValue = false; + var cache = meta.cache; + var funcArgLength, cachedValue, ret; if (this._readOnly) { throw new EmberError('Cannot set read-only property "' + keyName + '" on object: ' + inspect(obj)); @@ -11971,7 +12082,10 @@ define("ember-metal/computed", try { if (cacheable && cache[keyName] !== undefined) { - cachedValue = cache[keyName]; + if(cache[keyName] !== UNDEFINED) { + cachedValue = cache[keyName]; + } + hadCachedValue = true; } @@ -12086,9 +12200,9 @@ define("ember-metal/computed", @return {Object} the cached value */ function cacheFor(obj, key) { - var meta = obj[META_KEY], - cache = meta && meta.cache, - ret = cache && cache[key]; + var meta = obj['__ember_meta__']; + var cache = meta && meta.cache; + var ret = cache && cache[key]; if (ret === UNDEFINED) { return undefined; } return ret; @@ -12112,6 +12226,28 @@ define("ember-metal/computed", cache[key] = undefined; }; + __exports__.ComputedProperty = ComputedProperty; + __exports__.computed = computed; + __exports__.cacheFor = cacheFor; + }); +define("ember-metal/computed_macros", + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/is_empty","ember-metal/is_none","ember-metal/alias"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__) { + "use strict"; + var Ember = __dependency1__["default"]; + var get = __dependency2__.get; + var set = __dependency3__.set; + var computed = __dependency4__.computed; + var isEmpty = __dependency5__["default"]; + var isNone = __dependency6__.isNone; + var alias = __dependency7__.alias; + + /** + @module ember-metal + */ + + var a_slice = [].slice; + function getProperties(self, propertyNames) { var ret = {}; for(var i = 0; i < propertyNames.length; i++) { @@ -12649,15 +12785,7 @@ define("ember-metal/computed", @return {Ember.ComputedProperty} computed property which creates an alias to the original value for property. */ - computed.alias = function(dependentKey) { - return computed(dependentKey, function(key, value) { - if (arguments.length > 1) { - set(this, dependentKey, value); - } - - return get(this, dependentKey); - }); - }; + computed.alias = alias; /** Where `computed.alias` aliases `get` and `set`, and allows for bidirectional @@ -12692,9 +12820,7 @@ define("ember-metal/computed", one way computed property to the original value for property. */ computed.oneWay = function(dependentKey) { - return computed(dependentKey, function() { - return get(this, dependentKey); - }); + return alias(dependentKey).oneWay(); }; @@ -12746,9 +12872,7 @@ define("ember-metal/computed", @since 1.5.0 */ computed.readOnly = function(dependentKey) { - return computed(dependentKey, function() { - return get(this, dependentKey); - }).readOnly(); + return alias(dependentKey).readOnly(); }; /** A computed property that acts like a standard getter and setter, @@ -12775,10 +12899,13 @@ define("ember-metal/computed", @param {String} defaultPath @return {Ember.ComputedProperty} computed property which acts like a standard getter and setter, but defaults to the value from `defaultPath`. + @deprecated Use `Ember.computed.oneWay` or custom CP with default instead. */ // ES6TODO: computed should have its own export path so you can do import {defaultTo} from computed computed.defaultTo = function(defaultPath) { return computed(function(key, newValue, cachedValue) { + Ember.deprecate('Usage of Ember.computed.defaultTo is deprecated, use `Ember.computed.oneWay` instead.'); + if (arguments.length === 1) { return get(this, defaultPath); } @@ -12810,10 +12937,6 @@ define("ember-metal/computed", } }); }; - - __exports__.ComputedProperty = ComputedProperty; - __exports__.computed = computed; - __exports__.cacheFor = cacheFor; }); define("ember-metal/core", ["exports"], @@ -12843,7 +12966,7 @@ define("ember-metal/core", @class Ember @static - @version 1.7.0-beta.1+canary.83fe4e00 + @version 1.8.0-beta.1+canary.919cf869 */ if ('undefined' === typeof Ember) { @@ -12870,10 +12993,10 @@ define("ember-metal/core", /** @property VERSION @type String - @default '1.7.0-beta.1+canary.83fe4e00' + @default '1.8.0-beta.1+canary.919cf869' @static */ - Ember.VERSION = '1.7.0-beta.1+canary.83fe4e00'; + Ember.VERSION = '1.8.0-beta.1+canary.919cf869'; /** Standard environmental variables. You can define these in a global `EmberENV` @@ -13030,6 +13153,109 @@ define("ember-metal/core", __exports__["default"] = Ember; }); +define("ember-metal/dependent_keys", + ["ember-metal/platform","ember-metal/watching","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; + var create = __dependency1__.create; + var watch = __dependency2__.watch; + var unwatch = __dependency2__.unwatch; + + /** + @module ember-metal + */ + + var o_create = create; + + // .......................................................... + // DEPENDENT KEYS + // + + // data structure: + // meta.deps = { + // 'depKey': { + // 'keyName': count, + // } + // } + + /* + This function returns a map of unique dependencies for a + given object and key. + */ + function keysForDep(depsMeta, depKey) { + var keys = depsMeta[depKey]; + if (!keys) { + // if there are no dependencies yet for a the given key + // create a new empty list of dependencies for the key + keys = depsMeta[depKey] = {}; + } else if (!depsMeta.hasOwnProperty(depKey)) { + // otherwise if the dependency list is inherited from + // a superclass, clone the hash + keys = depsMeta[depKey] = o_create(keys); + } + return keys; + } + + function metaForDeps(meta) { + return keysForDep(meta, 'deps'); + } + + function addDependentKeys(desc, obj, keyName, meta) { + // the descriptor has a list of dependent keys, so + // add all of its dependent keys. + var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys; + if (!depKeys) return; + + depsMeta = metaForDeps(meta); + + for(idx = 0, len = depKeys.length; idx < len; idx++) { + depKey = depKeys[idx]; + // Lookup keys meta for depKey + keys = keysForDep(depsMeta, depKey); + // Increment the number of times depKey depends on keyName. + keys[keyName] = (keys[keyName] || 0) + 1; + // Watch the depKey + watch(obj, depKey, meta); + } + } + + __exports__.addDependentKeys = addDependentKeys;function removeDependentKeys(desc, obj, keyName, meta) { + // the descriptor has a list of dependent keys, so + // remove all of its dependent keys. + var depKeys = desc._dependentKeys, depsMeta, idx, len, depKey, keys; + if (!depKeys) return; + + depsMeta = metaForDeps(meta); + + for(idx = 0, len = depKeys.length; idx < len; idx++) { + depKey = depKeys[idx]; + // Lookup keys meta for depKey + keys = keysForDep(depsMeta, depKey); + // Decrement the number of times depKey depends on keyName. + keys[keyName] = (keys[keyName] || 0) - 1; + // Unwatch the depKey + unwatch(obj, depKey, meta); + } + } + + __exports__.removeDependentKeys = removeDependentKeys; + }); +define("ember-metal/dictionary", + ["exports"], + function(__exports__) { + "use strict"; + // the delete is meant to hint at runtimes that this object should remain in + // dictionary mode. This is clearly a runtime specific hack, but currently it + // appears worthwile in some usecases. Please note, these deletes do increase + // the cost of creation dramatically over a plain Object.create. And as this + // only makes sense for long-lived dictionaries that aren't instantiated often. + __exports__["default"] = function makeDictionary(parent) { + var dict = Object.create(parent); + dict['_dict'] = null; + delete dict['_dict']; + return dict; + } + }); define("ember-metal/enumerable_utils", ["ember-metal/array","exports"], function(__dependency1__, __exports__) { @@ -13322,7 +13548,6 @@ define("ember-metal/events", */ var Ember = __dependency1__["default"]; var meta = __dependency2__.meta; - var META_KEY = __dependency2__.META_KEY; var tryFinally = __dependency2__.tryFinally; var apply = __dependency2__.apply; var applyStr = __dependency2__.applyStr; @@ -13389,7 +13614,7 @@ define("ember-metal/events", } function listenersUnion(obj, eventName, otherActions) { - var meta = obj[META_KEY], + var meta = obj['__ember_meta__'], actions = meta && meta.listeners && meta.listeners[eventName]; if (!actions) { return; } @@ -13406,7 +13631,7 @@ define("ember-metal/events", } __exports__.listenersUnion = listenersUnion;function listenersDiff(obj, eventName, otherActions) { - var meta = obj[META_KEY], + var meta = obj['__ember_meta__'], actions = meta && meta.listeners && meta.listeners[eventName], diffActions = []; @@ -13497,7 +13722,7 @@ define("ember-metal/events", if (method) { _removeListener(target, method); } else { - var meta = obj[META_KEY], + var meta = obj['__ember_meta__'], actions = meta && meta.listeners && meta.listeners[eventName]; if (!actions) { return; } @@ -13600,7 +13825,7 @@ define("ember-metal/events", @param obj */ function watchedEvents(obj) { - var listeners = obj[META_KEY].listeners, ret = []; + var listeners = obj['__ember_meta__'].listeners, ret = []; if (listeners) { for(var eventName in listeners) { @@ -13631,7 +13856,7 @@ define("ember-metal/events", } if (!actions) { - var meta = obj[META_KEY]; + var meta = obj['__ember_meta__']; actions = meta && meta.listeners && meta.listeners[eventName]; } @@ -13668,7 +13893,7 @@ define("ember-metal/events", @param {String} eventName */ function hasListeners(obj, eventName) { - var meta = obj[META_KEY], + var meta = obj['__ember_meta__'], actions = meta && meta.listeners && meta.listeners[eventName]; return !!(actions && actions.length); @@ -13683,7 +13908,7 @@ define("ember-metal/events", */ function listenersFor(obj, eventName) { var ret = []; - var meta = obj[META_KEY], + var meta = obj['__ember_meta__'], actions = meta && meta.listeners && meta.listeners[eventName]; if (!actions) { return ret; } @@ -13730,17 +13955,19 @@ define("ember-metal/events", __exports__.on = on;__exports__.removeListener = removeListener; }); define("ember-metal/expand_properties", - ["ember-metal/error","ember-metal/enumerable_utils","exports"], - function(__dependency1__, __dependency2__, __exports__) { + ["ember-metal/core","ember-metal/error","ember-metal/enumerable_utils","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; - var EmberError = __dependency1__["default"]; - var forEach = __dependency2__.forEach; + var Ember = __dependency1__["default"]; + var EmberError = __dependency2__["default"]; + var forEach = __dependency3__.forEach; /** @module ember-metal */ - var BRACE_EXPANSION = /^((?:[^\.]*\.)*)\{(.*)\}$/; + var BRACE_EXPANSION = /^((?:[^\.]*\.)*)\{(.*)\}$/, + SPLIT_REGEX = /\{|\}/; /** Expands `pattern`, invoking `callback` for each expansion. @@ -13761,18 +13988,26 @@ define("ember-metal/expand_properties", @method @private - @param {string} pattern The property pattern to expand. - @param {function} callback The callback to invoke. It is invoked once per + @param {String} pattern The property pattern to expand. + @param {Function} callback The callback to invoke. It is invoked once per expansion, and is passed the expansion. */ __exports__["default"] = function expandProperties(pattern, callback) { - var match, prefix, list; - if (pattern.indexOf(' ') > -1) { - throw new EmberError('Brace expanded properties cannot contain spaces, ' + + throw new EmberError('Brace expanded properties cannot contain spaces, ' + 'e.g. `user.{firstName, lastName}` should be `user.{firstName,lastName}`'); } + if (Ember.FEATURES.isEnabled('property-brace-expansion-improvement')) { + return newExpandProperties(pattern, callback); + } else { + return oldExpandProperties(pattern, callback); + } + } + + function oldExpandProperties(pattern, callback) { + var match, prefix, list; + if (match = BRACE_EXPANSION.exec(pattern)) { prefix = match[1]; list = match[2]; @@ -13784,6 +14019,39 @@ define("ember-metal/expand_properties", callback(pattern); } } + + function newExpandProperties(pattern, callback) { + if ('string' === Ember.typeOf(pattern)) { + var parts = pattern.split(SPLIT_REGEX), + properties = [parts]; + + forEach(parts, function(part, index) { + if (part.indexOf(',') >= 0) { + properties = duplicateAndReplace(properties, part.split(','), index); + } + }); + + forEach(properties, function(property) { + callback(property.join('')); + }); + } else { + callback(pattern); + } + } + + function duplicateAndReplace(properties, currentParts, index) { + var all = []; + + forEach(properties, function(property) { + forEach(currentParts, function(part) { + var current = property.slice(0); + current[index] = part; + all.push(current); + }); + }); + + return all; + } }); define("ember-metal/get_properties", ["ember-metal/property_get","ember-metal/utils","exports"], @@ -14147,6 +14415,116 @@ define("ember-metal/is_none", __exports__["default"] = isNone; __exports__.isNone = isNone; }); +define("ember-metal/is_present", + ["ember-metal/is_blank","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var isBlank = __dependency1__["default"]; + var isPresent; + + if (Ember.FEATURES.isEnabled('ember-metal-is-present')) { + /** + A value is present if it not `isBlank`. + + ```javascript + Ember.isPresent(); // false + Ember.isPresent(null); // false + Ember.isPresent(undefined); // false + Ember.isPresent(''); // false + Ember.isPresent([]); // false + Ember.isPresent('\n\t'); // false + Ember.isPresent(' '); // false + Ember.isPresent({}); // true + Ember.isPresent('\n\t Hello'); // true + Ember.isPresent('Hello world'); // true + Ember.isPresent([1,2,3]); // true + ``` + + @method isPresent + @for Ember + @param {Object} obj Value to test + @return {Boolean} + @since 1.7.0 + */ + isPresent = function isPresent(obj) { + return !isBlank(obj); + }; + } + + __exports__["default"] = isPresent; + }); +define("ember-metal/keys", + ["ember-metal/enumerable_utils","ember-metal/platform","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; + var EnumerableUtils = __dependency1__["default"]; + var create = __dependency2__.create; + + /** + Returns all of the keys defined on an object or hash. This is useful + when inspecting objects for debugging. On browsers that support it, this + uses the native `Object.keys` implementation. + + @method keys + @for Ember + @param {Object} obj + @return {Array} Array containing keys of obj + */ + var keys = Object.keys; + + if (!keys || create.isSimulated) { + var prototypeProperties = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'valueOf', + 'toLocaleString', + 'toString' + ]; + var pushPropertyName = function(obj, array, key) { + // Prevents browsers that don't respect non-enumerability from + // copying internal Ember properties + if (key.substring(0, 2) === '__') { + return; + } + + if (key === '_super') { + return; + } + + if (EnumerableUtils.indexOf(array, key) >= 0) { + return; + } + + if (typeof obj.hasOwnProperty === 'function' && !obj.hasOwnProperty(key)) { + return; + } + + array.push(key); + }; + + keys = function keys(obj) { + var ret = []; + var key; + + for (key in obj) { + pushPropertyName(obj, ret, key); + } + + // IE8 doesn't enumerate property that named the same as prototype properties. + for (var i = 0, l = prototypeProperties.length; i < l; i++) { + key = prototypeProperties[i]; + + pushPropertyName(obj, ret, key); + } + + return ret; + }; + } + + __exports__["default"] = keys; + }); define("ember-metal/libraries", ["ember-metal/enumerable_utils","exports"], function(__dependency1__, __exports__) { @@ -14380,15 +14758,16 @@ define("ember-metal/map", var output = {}; for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { output[prop] = obj[prop]; } + // hasOwnPropery is not needed because obj is Object.create(null); + output[prop] = obj[prop]; } return output; } function copyMap(original, newObject) { - var keys = original.keys.copy(), - values = copy(original.values); + var keys = original.keys.copy(); + var values = copy(original.values); newObject.keys = keys; newObject.values = values; @@ -14420,13 +14799,12 @@ define("ember-metal/map", return new OrderedSet(); }; - OrderedSet.prototype = { /** @method clear */ clear: function() { - this.presenceSet = {}; + this.presenceSet = Object.create(null); this.list = []; }, @@ -14435,11 +14813,11 @@ define("ember-metal/map", @param obj */ add: function(obj) { - var guid = guidFor(obj), - presenceSet = this.presenceSet, - list = this.list; + var guid = guidFor(obj); + var presenceSet = this.presenceSet; + var list = this.list; - if (guid in presenceSet) { return; } + if (presenceSet[guid]) { return; } presenceSet[guid] = true; list.push(obj); @@ -14450,9 +14828,9 @@ define("ember-metal/map", @param obj */ remove: function(obj) { - var guid = guidFor(obj), - presenceSet = this.presenceSet, - list = this.list; + var guid = guidFor(obj); + var presenceSet = this.presenceSet; + var list = this.list; delete presenceSet[guid]; @@ -14476,10 +14854,10 @@ define("ember-metal/map", @return {Boolean} */ has: function(obj) { - var guid = guidFor(obj), - presenceSet = this.presenceSet; + var guid = guidFor(obj); + var presenceSet = this.presenceSet; - return guid in presenceSet; + return presenceSet[guid]; }, /** @@ -14540,7 +14918,7 @@ define("ember-metal/map", */ function Map() { this.keys = OrderedSet.create(); - this.values = {}; + this.values = Object.create(null); } Ember.Map = Map; @@ -14571,8 +14949,8 @@ define("ember-metal/map", @return {*} the value associated with the key, or `undefined` */ get: function(key) { - var values = this.values, - guid = guidFor(key); + var values = this.values; + var guid = guidFor(key); return values[guid]; }, @@ -14586,9 +14964,9 @@ define("ember-metal/map", @param {*} value */ set: function(key, value) { - var keys = this.keys, - values = this.values, - guid = guidFor(key); + var keys = this.keys; + var values = this.values; + var guid = guidFor(key); keys.add(key); values[guid] = value; @@ -14605,11 +14983,11 @@ define("ember-metal/map", remove: function(key) { // don't use ES6 "delete" because it will be annoying // to use in browsers that are not ES6 friendly; - var keys = this.keys, - values = this.values, - guid = guidFor(key); + var keys = this.keys; + var values = this.values; + var guid = guidFor(key); - if (values.hasOwnProperty(guid)) { + if (values[guid]) { keys.remove(key); delete values[guid]; set(this, 'length', keys.list.length); @@ -14627,10 +15005,10 @@ define("ember-metal/map", @return {Boolean} true if the item was present, false otherwise */ has: function(key) { - var values = this.values, - guid = guidFor(key); + var values = this.values; + var guid = guidFor(key); - return values.hasOwnProperty(guid); + return !!values[guid]; }, /** @@ -14645,8 +15023,8 @@ define("ember-metal/map", callback. By default, `this` is the map. */ forEach: function(callback, self) { - var keys = this.keys, - values = this.values; + var keys = this.keys; + var values = this.values; keys.forEach(function(key) { var guid = guidFor(key); @@ -14673,7 +15051,7 @@ define("ember-metal/map", @param {*} [options.defaultValue] */ function MapWithDefault(options) { - Map.call(this); + this._super$constructor(); this.defaultValue = options.defaultValue; } @@ -14694,6 +15072,9 @@ define("ember-metal/map", }; MapWithDefault.prototype = create(Map.prototype); + MapWithDefault.prototype.constructor = MapWithDefault; + MapWithDefault.prototype._super$constructor = Map; + MapWithDefault.prototype._super$get = Map.prototype.get; /** Retrieve the value associated with a given key. @@ -14706,7 +15087,7 @@ define("ember-metal/map", var hasValue = this.has(key); if (hasValue) { - return Map.prototype.get.call(this, key); + return this._super$get(key); } else { var defaultValue = this.defaultValue(key); this.set(key, defaultValue); @@ -14773,7 +15154,6 @@ define("ember-metal/mixin", var create = __dependency4__.create; var guidFor = __dependency5__.guidFor; var meta = __dependency5__.meta; - var META_KEY = __dependency5__.META_KEY; var wrap = __dependency5__.wrap; var makeArray = __dependency5__.makeArray; var apply = __dependency5__.apply; @@ -15319,7 +15699,7 @@ define("ember-metal/mixin", MixinPrototype.detect = function(obj) { if (!obj) { return false; } if (obj instanceof Mixin) { return _detect(obj, this, {}); } - var m = obj[META_KEY], + var m = obj['__ember_meta__'], mixins = m && m.mixins; if (mixins) { return !!mixins[guidFor(this)]; @@ -15359,7 +15739,7 @@ define("ember-metal/mixin", // returns the mixins currently applied to the specified object // TODO: Make Ember.mixin Mixin.mixins = function(obj) { - var m = obj[META_KEY], + var m = obj['__ember_meta__'], mixins = m && m.mixins, ret = []; if (!mixins) { return ret; } @@ -15405,7 +15785,7 @@ define("ember-metal/mixin", }); var goodGuy = App.Person.create(); - + goodGuy.name(); // 'Tomhuda Katzdale' goodGuy.moniker(); // 'Tomhuda Katzdale' ``` @@ -15769,6 +16149,46 @@ define("ember-metal/observer_set", this.observers = []; }; }); +define("ember-metal/path_cache", + ["ember-metal/cache","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Cache = __dependency1__["default"]; + + var IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/; + var IS_GLOBAL_PATH = /^([A-Z$]|([0-9][A-Z$])).*[\.]/; + var HAS_THIS = 'this.'; + + var isGlobalCache = new Cache(1000, function(key) { return IS_GLOBAL.test(key); }); + var isGlobalPathCache = new Cache(1000, function(key) { return IS_GLOBAL_PATH.test(key); }); + var hasThisCache = new Cache(1000, function(key) { return key.indexOf(HAS_THIS) !== -1; }); + var isPathCache = new Cache(1000, function(key) { return key.indexOf('.') !== -1; }); + + var caches = { + isGlobalCache: isGlobalCache, + isGlobalPathCache: isGlobalPathCache, + hasThisCache: hasThisCache, + isPathCache: isPathCache + }; + __exports__.caches = caches; + function isGlobal(path) { + return isGlobalCache.get(path); + } + + __exports__.isGlobal = isGlobal;function isGlobalPath(path) { + return isGlobalPathCache.get(path); + } + + __exports__.isGlobalPath = isGlobalPath;function hasThis(path) { + return hasThisCache.get(path); + } + + __exports__.hasThis = hasThis;function isPath(path) { + return isPathCache.get(path); + } + + __exports__.isPath = isPath; + }); define("ember-metal/platform", ["ember-metal/core","exports"], function(__dependency1__, __exports__) { @@ -15791,44 +16211,6 @@ define("ember-metal/platform", // TODO remove this var platform = {}; - /** - Identical to `Object.create()`. Implements if not available natively. - - @method create - @for Ember - */ - var create = Object.create; - - // IE8 has Object.create but it couldn't treat property descriptors. - if (create) { - if (create({a: 1}, {a: {value: 2}}).a !== 2) { - create = null; - } - } - - // STUB_OBJECT_CREATE allows us to override other libraries that stub - // Object.create different than we would prefer - if (!create || Ember.ENV.STUB_OBJECT_CREATE) { - var K = function() {}; - - create = function(obj, props) { - K.prototype = obj; - obj = new K(); - if (props) { - K.prototype = obj; - for (var prop in props) { - K.prototype[prop] = props[prop].value; - } - obj = new K(); - } - K.prototype = null; - - return obj; - }; - - create.isSimulated = true; - } - var defineProperty = Object.defineProperty; var canRedefineProperties, canDefinePropertyOnDOM; @@ -15897,6 +16279,110 @@ define("ember-metal/platform", } } + // ES5 15.2.3.7 + // http://es5.github.com/#x15.2.3.7 + if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (properties.hasOwnProperty(property) && property !== "__proto__") { + defineProperty(object, property, properties[property]); + } + } + return object; + }; + } + + /** + Identical to `Object.create()`. Implements if not available natively. + + @method create + @for Ember + */ + var create; + // ES5 15.2.3.5 + // http://es5.github.com/#x15.2.3.5 + if (!(Object.create && !Object.create(null).hasOwnProperty)) { + /* jshint scripturl:true, proto:true */ + // Contributed by Brandon Benvie, October, 2012 + var createEmpty; + var supportsProto = !({'__proto__':null} instanceof Object); + // the following produces false positives + // in Opera Mini => not a reliable check + // Object.prototype.__proto__ === null + if (supportsProto || typeof document === 'undefined') { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + // In old IE __proto__ can't be used to manually set `null`, nor does + // any other method exist to make an object that inherits from nothing, + // aside from Object.prototype itself. Instead, create a new global + // object and *steal* its Object.prototype and strip it bare. This is + // used as the prototype to create nullary objects. + createEmpty = function () { + var iframe = document.createElement('iframe'); + var parent = document.body || document.documentElement; + iframe.style.display = 'none'; + parent.appendChild(iframe); + iframe.src = 'javascript:'; + var empty = iframe.contentWindow.Object.prototype; + parent.removeChild(iframe); + iframe = null; + delete empty.constructor; + delete empty.hasOwnProperty; + delete empty.propertyIsEnumerable; + delete empty.isPrototypeOf; + delete empty.toLocaleString; + delete empty.toString; + delete empty.valueOf; + empty.__proto__ = null; + + function Empty() {} + Empty.prototype = empty; + // short-circuit future calls + createEmpty = function () { + return new Empty(); + }; + return new Empty(); + }; + } + + create = Object.create = function create(prototype, properties) { + + var object; + function Type() {} // An empty constructor. + + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype !== "object" && typeof prototype !== "function") { + // In the native implementation `parent` can be `null` + // OR *any* `instanceof Object` (Object|Function|Array|RegExp|etc) + // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object` + // like they are in modern browsers. Using `Object.create` on DOM elements + // is...err...probably inappropriate, but the native version allows for it. + throw new TypeError("Object prototype may only be an Object or null"); // same msg as Chrome + } + Type.prototype = prototype; + object = new Type(); + // IE has no built-in implementation of `Object.getPrototypeOf` + // neither `__proto__`, but this manually setting `__proto__` will + // guarantee that `Object.getPrototypeOf` will work as expected with + // objects created using `Object.create` + object.__proto__ = prototype; + } + + if (properties !== void 0) { + Object.defineProperties(object, properties); + } + + return object; + }; + } else { + create = Object.create; + } + + /** @class platform @namespace Ember @@ -15948,15 +16434,14 @@ define("ember-metal/properties", */ var Ember = __dependency1__["default"]; - var META_KEY = __dependency2__.META_KEY; var meta = __dependency2__.meta; var platform = __dependency3__.platform; var overrideChains = __dependency4__.overrideChains; var get = __dependency5__.get; var set = __dependency6__.set; - var metaFor = meta, - objectDefineProperty = platform.defineProperty; + var metaFor = meta; + var objectDefineProperty = platform.defineProperty; var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER; @@ -15987,7 +16472,7 @@ define("ember-metal/properties", var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function DEFAULT_GETTER_FUNCTION(name) { return function() { - var meta = this[META_KEY]; + var meta = this['__ember_meta__']; return meta && meta.values[name]; }; }; @@ -16043,7 +16528,9 @@ define("ember-metal/properties", if (!meta) meta = metaFor(obj); descs = meta.descs; existingDesc = meta.descs[keyName]; - watching = meta.watching[keyName] > 0; + var watchEntry = meta.watching[keyName]; + + watching = watchEntry !== undefined && watchEntry > 0; if (existingDesc instanceof Descriptor) { existingDesc.teardown(obj, keyName); @@ -16063,6 +16550,7 @@ define("ember-metal/properties", } else { obj[keyName] = undefined; // make enumerable } + if (desc.setup) { desc.setup(obj, keyName); } } else { descs[keyName] = undefined; // shadow descriptor in proto if (desc == null) { @@ -16130,7 +16618,6 @@ define("ember-metal/property_events", ["ember-metal/utils","ember-metal/events","ember-metal/observer_set","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; - var META_KEY = __dependency1__.META_KEY; var guidFor = __dependency1__.guidFor; var tryFinally = __dependency1__.tryFinally; var sendEvent = __dependency2__.sendEvent; @@ -16162,10 +16649,10 @@ define("ember-metal/property_events", @return {void} */ function propertyWillChange(obj, keyName) { - var m = obj[META_KEY], - watching = (m && m.watching[keyName] > 0) || keyName === 'length', - proto = m && m.proto, - desc = m && m.descs[keyName]; + var m = obj['__ember_meta__']; + var watching = (m && m.watching[keyName] > 0) || keyName === 'length'; + var proto = m && m.proto; + var desc = m && m.descs[keyName]; if (!watching) { return; } if (proto === obj) { return; } @@ -16191,10 +16678,10 @@ define("ember-metal/property_events", @return {void} */ function propertyDidChange(obj, keyName) { - var m = obj[META_KEY], - watching = (m && m.watching[keyName] > 0) || keyName === 'length', - proto = m && m.proto, - desc = m && m.descs[keyName]; + var m = obj['__ember_meta__']; + var watching = (m && m.watching[keyName] > 0) || keyName === 'length'; + var proto = m && m.proto; + var desc = m && m.descs[keyName]; if (proto === obj) { return; } @@ -16202,44 +16689,61 @@ define("ember-metal/property_events", if (desc && desc.didChange) { desc.didChange(obj, keyName); } if (!watching && keyName !== 'length') { return; } - dependentKeysDidChange(obj, keyName, m); + if (m && m.deps && m.deps[keyName]) { + dependentKeysDidChange(obj, keyName, m); + } + chainsDidChange(obj, keyName, m, false); notifyObservers(obj, keyName); } var WILL_SEEN, DID_SEEN; - // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...) function dependentKeysWillChange(obj, depKey, meta) { if (obj.isDestroying) { return; } - var seen = WILL_SEEN, top = !seen; - if (top) { seen = WILL_SEEN = {}; } - iterDeps(propertyWillChange, obj, depKey, seen, meta); - if (top) { WILL_SEEN = null; } + var deps; + if (meta && meta.deps && (deps = meta.deps[depKey])) { + var seen = WILL_SEEN, top = !seen; + if (top) { seen = WILL_SEEN = {}; } + iterDeps(propertyWillChange, obj, deps, depKey, seen, meta); + if (top) { WILL_SEEN = null; } + } } // called whenever a property has just changed to update dependent keys function dependentKeysDidChange(obj, depKey, meta) { if (obj.isDestroying) { return; } - var seen = DID_SEEN, top = !seen; - if (top) { seen = DID_SEEN = {}; } - iterDeps(propertyDidChange, obj, depKey, seen, meta); - if (top) { DID_SEEN = null; } + var deps; + if (meta && meta.deps && (deps = meta.deps[depKey])) { + var seen = DID_SEEN, top = !seen; + if (top) { seen = DID_SEEN = {}; } + iterDeps(propertyDidChange, obj, deps, depKey, seen, meta); + if (top) { DID_SEEN = null; } + } } - function iterDeps(method, obj, depKey, seen, meta) { - var guid = guidFor(obj); - if (!seen[guid]) seen[guid] = {}; - if (seen[guid][depKey]) return; - seen[guid][depKey] = true; + function keysOf(obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; + } + + function iterDeps(method, obj, deps, depKey, seen, meta) { + var keys, key, i, desc; + var guid = guidFor(obj); + var current = seen[guid]; + if (!current) current = seen[guid] = {}; + if (current[depKey]) return; + current[depKey] = true; - var deps = meta.deps; - deps = deps && deps[depKey]; if (deps) { - for(var key in deps) { - var desc = meta.descs[key]; + keys = keysOf(deps); + var descs = meta.descs; + for (i=0; i Ember - if (root === null && path.indexOf('.') === -1) { return get(Ember.lookup, path); } + if (root === null && !isPath(path)) { + return get(Ember.lookup, path); + } // detect complicated paths and normalize them - hasThis = path.indexOf(HAS_THIS) === 0; + hasThis = pathHasThis(path); if (!root || hasThis) { tuple = normalizeTuple(root, path); @@ -16536,16 +17051,17 @@ define("ember-metal/property_get", __exports__._getPath = _getPath; }); define("ember-metal/property_set", - ["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/property_events","ember-metal/properties","ember-metal/error","exports"], + ["ember-metal/core","ember-metal/property_get","ember-metal/property_events","ember-metal/properties","ember-metal/error","ember-metal/path_cache","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; var getPath = __dependency2__._getPath; - var META_KEY = __dependency3__.META_KEY; - var propertyWillChange = __dependency4__.propertyWillChange; - var propertyDidChange = __dependency4__.propertyDidChange; - var defineProperty = __dependency5__.defineProperty; - var EmberError = __dependency6__["default"]; + var propertyWillChange = __dependency3__.propertyWillChange; + var propertyDidChange = __dependency3__.propertyDidChange; + var defineProperty = __dependency4__.defineProperty; + var EmberError = __dependency5__["default"]; + var isPath = __dependency6__.isPath; + var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER; var IS_GLOBAL = /^([A-Z$]|([0-9][A-Z$]))/; @@ -16577,10 +17093,10 @@ define("ember-metal/property_set", return setPath(obj, keyName, value, tolerant); } - var meta = obj[META_KEY], desc = meta && meta.descs[keyName], + var meta = obj['__ember_meta__'], desc = meta && meta.descs[keyName], isUnknown, currentValue; - if (desc === undefined && keyName.indexOf('.') !== -1) { + if (desc === undefined && isPath(keyName)) { return setPath(obj, keyName, value, tolerant); } @@ -16831,7 +17347,7 @@ define("ember-metal/run_loop", ``` @method bind - @namespace run + @namespace Ember @param {Object} [target] target of method to call @param {Function|String} method Method to invoke. May be a function or a string. If you pass a string @@ -17349,8 +17865,8 @@ define("ember-metal/set_properties", } }); define("ember-metal/utils", - ["ember-metal/core","ember-metal/platform","ember-metal/array","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { + ["ember-metal/core","ember-metal/platform","ember-metal/array","ember-metal/keys","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; var platform = __dependency2__.platform; @@ -17358,6 +17874,7 @@ define("ember-metal/utils", var forEach = __dependency3__.forEach; + var keys = __dependency4__["default"]; /** @module ember-metal */ @@ -17392,6 +17909,51 @@ define("ember-metal/utils", var stringCache = {}; var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER; + /** + Strongly hint runtimes to intern the provided string. + + When do I need to use this function? + + For the most part, never. Pre-mature optimization is bad, and often the + runtime does exactly what you need it to, and more often the trade-off isn't + worth it. + + Why? + + Runtimes store strings in at least 2 different representations: + Ropes and Symbols (interned strings). The Rope provides a memory efficient + data-structure for strings created from concatenation or some other string + manipulation like splitting. + + Unfortunately checking equality of different ropes can be quite costly as + runtimes must resort to clever string comparison algorithims. These + algorithims typically cost in proportion to the length of the string. + Luckily, this is where the Symbols (interned strings) shine. As Symbols are + unique by their string content, equality checks can be done by pointer + comparision. + + How do I know if my string is a rope or symbol? + + Typically (warning general sweeping statement, but truthy in runtimes at + present) static strings created as part of the JS source are interned. + Strings often used for comparisions can be interned at runtime if some + criteria are met. One of these criteria can be the size of the entire rope. + For example, in chrome 38 a rope longer then 12 characters will not + intern, nor will segments of that rope. + + Some numbers: http://jsperf.com/eval-vs-keys/8 + + Known Trick™ + + @private + @return {String} interned version of the provided string + */ + function intern(string) { + var obj = Object.create(null); + obj[string] = true; + return keys(obj)[0]; + } + /** A unique key used to assign guids and other private metadata to objects. If you inspect an object in your browser debugger you will often see these. @@ -17406,7 +17968,7 @@ define("ember-metal/utils", @type String @final */ - var GUID_KEY = '__ember' + (+ new Date()); + var GUID_KEY = intern('__ember' + (+ new Date())); var GUID_DESC = { writable: false, @@ -17488,7 +18050,7 @@ define("ember-metal/utils", if (obj[GUID_KEY]) return obj[GUID_KEY]; if (obj === Object) return '(Object)'; if (obj === Array) return '(Array)'; - ret = 'ember' + uuid(); + ret = GUID_PREFIX + uuid(); if (obj[GUID_KEY] === null) { obj[GUID_KEY] = ret; @@ -17511,17 +18073,6 @@ define("ember-metal/utils", value: null }; - /** - The key used to store meta information on object for property observing. - - @property META_KEY - @for Ember - @private - @final - @type String - */ - var META_KEY = '__ember_meta__'; - var isDefinePropertySimulated = platform.defineProperty.isSimulated; function Meta(obj) { @@ -17585,23 +18136,23 @@ define("ember-metal/utils", */ function meta(obj, writable) { - var ret = obj[META_KEY]; + var ret = obj['__ember_meta__']; if (writable===false) return ret || EMPTY_META; if (!ret) { - if (!isDefinePropertySimulated) o_defineProperty(obj, META_KEY, META_DESC); + if (!isDefinePropertySimulated) o_defineProperty(obj, '__ember_meta__', META_DESC); ret = new Meta(obj); if (MANDATORY_SETTER) { ret.values = {}; } - obj[META_KEY] = ret; + obj['__ember_meta__'] = ret; // make sure we don't accidentally try to create constructor like desc ret.descs.constructor = null; } else if (ret.source !== obj) { - if (!isDefinePropertySimulated) o_defineProperty(obj, META_KEY, META_DESC); + if (!isDefinePropertySimulated) o_defineProperty(obj, '__ember_meta__', META_DESC); ret = o_create(ret); ret.descs = o_create(ret.descs); @@ -17612,7 +18163,7 @@ define("ember-metal/utils", if (MANDATORY_SETTER) { ret.values = o_create(ret.values); } - obj[META_KEY] = ret; + obj['__ember_meta__'] = ret; } return ret; } @@ -17698,10 +18249,10 @@ define("ember-metal/utils", */ function wrap(func, superFunc) { function superWrapper() { - var ret, sup = this.__nextSuper; - this.__nextSuper = superFunc; + var ret, sup = this && this.__nextSuper; + if(this) { this.__nextSuper = superFunc; } ret = apply(this, func, arguments); - this.__nextSuper = sup; + if(this) { this.__nextSuper = sup; } return ret; } @@ -18145,10 +18696,8 @@ define("ember-metal/utils", } __exports__.applyStr = applyStr;__exports__.GUID_KEY = GUID_KEY; - __exports__.GUID_PREFIX = GUID_PREFIX; __exports__.META_DESC = META_DESC; __exports__.EMPTY_META = EMPTY_META; - __exports__.META_KEY = META_KEY; __exports__.meta = meta; __exports__.typeOf = typeOf; __exports__.tryCatchFinally = tryCatchFinally; @@ -18179,6 +18728,9 @@ define("ember-metal/watch_key", if (!watching[keyName]) { watching[keyName] = 1; + var desc = m.descs[keyName]; + if (desc && desc.willWatch) { desc.willWatch(obj, keyName); } + if ('function' === typeof obj.willWatchProperty) { obj.willWatchProperty(keyName); } @@ -18203,6 +18755,9 @@ define("ember-metal/watch_key", if (watching[keyName] === 1) { watching[keyName] = 0; + var desc = m.descs[keyName]; + if (desc && desc.didUnwatch) { desc.didUnwatch(obj, keyName); } + if ('function' === typeof obj.didUnwatchProperty) { obj.didUnwatchProperty(keyName); } @@ -18282,15 +18837,14 @@ define("ember-metal/watch_path", __exports__.unwatchPath = unwatchPath; }); define("ember-metal/watching", - ["ember-metal/utils","ember-metal/chains","ember-metal/watch_key","ember-metal/watch_path","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { + ["ember-metal/utils","ember-metal/chains","ember-metal/watch_key","ember-metal/watch_path","ember-metal/path_cache","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; /** @module ember-metal */ var meta = __dependency1__.meta; - var META_KEY = __dependency1__.META_KEY; var GUID_KEY = __dependency1__.GUID_KEY; var typeOf = __dependency1__.typeOf; var generateGuid = __dependency1__.generateGuid; @@ -18302,11 +18856,7 @@ define("ember-metal/watching", var unwatchPath = __dependency4__.unwatchPath; var metaFor = meta; // utils.js - - // returns true if the passed path is just a keyName - function isKeyName(path) { - return path.indexOf('.') === -1; - } + var isPath = __dependency5__.isPath; /** Starts watching a property on an object. Whenever the property changes, @@ -18325,7 +18875,7 @@ define("ember-metal/watching", // can't watch length on Array - it is special... if (_keyPath === 'length' && typeOf(obj) === 'array') { return; } - if (isKeyName(_keyPath)) { + if (!isPath(_keyPath)) { watchKey(obj, _keyPath, m); } else { watchPath(obj, _keyPath, m); @@ -18335,7 +18885,7 @@ define("ember-metal/watching", __exports__.watch = watch; function isWatching(obj, key) { - var meta = obj[META_KEY]; + var meta = obj['__ember_meta__']; return (meta && meta.watching[key]) > 0; } @@ -18345,7 +18895,7 @@ define("ember-metal/watching", // can't watch length on Array - it is special... if (_keyPath === 'length' && typeOf(obj) === 'array') { return; } - if (isKeyName(_keyPath)) { + if (!isPath(_keyPath)) { unwatchKey(obj, _keyPath, m); } else { unwatchPath(obj, _keyPath, m); @@ -18363,7 +18913,7 @@ define("ember-metal/watching", @param obj */ function rewatch(obj) { - var m = obj[META_KEY], chains = m && m.chains; + var m = obj['__ember_meta__'], chains = m && m.chains; // make sure the object has its own guid. if (GUID_KEY in obj && !obj.hasOwnProperty(GUID_KEY)) { @@ -18388,9 +18938,9 @@ define("ember-metal/watching", @return {void} */ function destroy(obj) { - var meta = obj[META_KEY], node, nodes, key, nodeObject; + var meta = obj['__ember_meta__'], node, nodes, key, nodeObject; if (meta) { - obj[META_KEY] = null; + obj['__ember_meta__'] = null; // remove chainWatchers to remove circular references that would prevent GC node = meta.chains; if (node) { @@ -18539,6 +19089,16 @@ define("ember-routing-handlebars/helpers/action", return allowed; }; + function isKeyEvent(eventName) { + return ['keyUp', 'keyPress', 'keyDown'].indexOf(eventName) !== -1; + } + + function ignoreKeyEvent(eventName, event, keyCode) { + var any = 'any'; + keyCode = keyCode || any; + return isKeyEvent(eventName) && keyCode !== any && keyCode !== event.which.toString(); + } + ActionHelper.registerAction = function(actionNameOrPath, options, allowedKeys) { var actionId = uuid(); @@ -18557,8 +19117,15 @@ define("ember-routing-handlebars/helpers/action", var target = options.target, parameters = options.parameters, + eventName = options.eventName, actionName; + if (Ember.FEATURES.isEnabled("ember-routing-handlebars-action-with-key-code")) { + if (ignoreKeyEvent(eventName, event, options.withKeyCode)) { + return; + } + } + if (target.target) { target = handlebarsGet(target.root, target.target, target.options); } else { @@ -18568,7 +19135,7 @@ define("ember-routing-handlebars/helpers/action", if (options.boundProperty) { actionName = resolveParams(parameters.context, [actionNameOrPath], { types: ['ID'], data: parameters.options.data })[0]; - if(typeof actionName === 'undefined' || typeof actionName === 'function') { + if (typeof actionName === 'undefined' || typeof actionName === 'function') { Ember.assert("You specified a quoteless path to the {{action}} helper '" + actionNameOrPath + "' which did not resolve to an actionName. Perhaps you meant to use a quoted actionName? (e.g. {{action '" + actionNameOrPath + "'}}).", true); actionName = actionNameOrPath; } @@ -18784,6 +19351,7 @@ define("ember-routing-handlebars/helpers/action", bubbles: hash.bubbles, preventDefault: hash.preventDefault, target: { options: options }, + withKeyCode: hash.withKeyCode, boundProperty: options.types[0] === "ID" }; @@ -18801,7 +19369,7 @@ define("ember-routing-handlebars/helpers/action", __exports__.actionHelper = actionHelper; }); define("ember-routing-handlebars/helpers/link_to", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-runtime/system/lazy_load","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/keys","ember-views/system/utils","ember-views/views/component","ember-handlebars","ember-handlebars/helpers/view","ember-routing/system/router","ember-routing-handlebars/helpers/shared","exports"], + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-runtime/system/lazy_load","ember-runtime/system/string","ember-runtime/system/object","ember-metal/keys","ember-views/system/utils","ember-views/views/component","ember-handlebars","ember-handlebars/helpers/view","ember-routing/system/router","ember-routing-handlebars/helpers/shared","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; @@ -19095,47 +19663,67 @@ define("ember-routing-handlebars/helpers/link_to", or the application's current route is the route the `LinkView` would trigger transitions into. + The `currentWhen` property can match against multiple routes by separating + route names using the `|` character. + @property active **/ active: computed('loadedParams', function computeLinkViewActive() { if (get(this, 'loading')) { return false; } - var router = get(this, 'router'), - loadedParams = get(this, 'loadedParams'), - contexts = loadedParams.models, - currentWhen = this.currentWhen || loadedParams.targetRouteName, - handlers = router.router.recognizer.handlersFor(currentWhen), - leafName = handlers[handlers.length-1].handler, - maximumContexts = numberOfContextsAcceptedByHandler(currentWhen, handlers); + var router = get(this, 'router'); + var loadedParams = get(this, 'loadedParams'); + var contexts = loadedParams.models; + var currentWhen = this.currentWhen; + var isCurrentWhenSpecified = Boolean(currentWhen); + currentWhen = currentWhen || loadedParams.targetRouteName; - // NOTE: any ugliness in the calculation of activeness is largely - // due to the fact that we support automatic normalizing of - // `resource` -> `resource.index`, even though there might be - // dynamic segments / query params defined on `resource.index` - // which complicates (and makes somewhat ambiguous) the calculation - // of activeness for links that link to `resource` instead of - // directly to `resource.index`. + function isActiveForRoute(routeName) { + var handlers = router.router.recognizer.handlersFor(routeName); + var leafName = handlers[handlers.length-1].handler; + var maximumContexts = numberOfContextsAcceptedByHandler(routeName, handlers); - // if we don't have enough contexts revert back to full route name - // this is because the leaf route will use one of the contexts - if (contexts.length > maximumContexts) { - currentWhen = leafName; + // NOTE: any ugliness in the calculation of activeness is largely + // due to the fact that we support automatic normalizing of + // `resource` -> `resource.index`, even though there might be + // dynamic segments / query params defined on `resource.index` + // which complicates (and makes somewhat ambiguous) the calculation + // of activeness for links that link to `resource` instead of + // directly to `resource.index`. + + // if we don't have enough contexts revert back to full route name + // this is because the leaf route will use one of the contexts + if (contexts.length > maximumContexts) { + routeName = leafName; + } + + var args = routeArgs(routeName, contexts, null); + var isActive = router.isActive.apply(router, args); + if (!isActive) { return false; } + + + if (!isCurrentWhenSpecified && leafName === loadedParams.targetRouteName) { + var visibleQueryParams = {}; + merge(visibleQueryParams, loadedParams.queryParams); + router._prepareQueryParams(loadedParams.targetRouteName, loadedParams.models, visibleQueryParams); + isActive = shallowEqual(visibleQueryParams, router.router.state.queryParams); + } + + return isActive; } - var args = routeArgs(currentWhen, contexts, null); - var isActive = router.isActive.apply(router, args); - if (!isActive) { return false; } - - - if (!this.currentWhen && leafName === loadedParams.targetRouteName) { - var visibleQueryParams = {}; - merge(visibleQueryParams, loadedParams.queryParams); - router._prepareQueryParams(loadedParams.targetRouteName, loadedParams.models, visibleQueryParams); - isActive = shallowEqual(visibleQueryParams, router.router.state.queryParams); + if (Ember.FEATURES.isEnabled("ember-routing-multi-current-when")) { + currentWhen = currentWhen.split('|'); + for (var i = 0, len = currentWhen.length; i < len; i++) { + if (isActiveForRoute(currentWhen[i])) { + return get(this, 'activeClass'); + } } - - - if (isActive) { return get(this, 'activeClass'); } + } else { + if (isActiveForRoute(currentWhen)) { + return get(this, 'activeClass'); + } + } }), /** @@ -19160,7 +19748,10 @@ define("ember-routing-handlebars/helpers/link_to", @property router **/ router: computed(function() { - return get(this, 'controller').container.lookup('router:main'); + var controller = get(this, 'controller'); + if (controller && controller.container) { + return controller.container.lookup('router:main'); + } }), /** @@ -19298,8 +19889,10 @@ define("ember-routing-handlebars/helpers/link_to", @return {Array} An array with the route name and any dynamic segments **/ loadedParams: computed('resolvedParams', function computeLinkViewRouteArgs() { + var router = get(this, 'router'); + if (!router) { return; } + var resolvedParams = get(this, 'resolvedParams'), - router = get(this, 'router'), namedRoute = resolvedParams.targetRouteName; if (!namedRoute) { return; } @@ -19893,7 +20486,7 @@ define("ember-routing-handlebars/helpers/render", var set = __dependency4__.set; var camelize = __dependency5__.camelize; var generateControllerFactory = __dependency6__.generateControllerFactory; - var generateController = __dependency6__.default; + var generateController = __dependency6__["default"]; var handlebarsGet = __dependency7__.handlebarsGet; var viewHelper = __dependency8__.viewHelper; @@ -20156,8 +20749,8 @@ define("ember-routing-handlebars/helpers/shared", __exports__.resolvePaths = resolvePaths; }); define("ember-routing", - ["ember-handlebars","ember-metal/core","ember-routing/ext/run_loop","ember-routing/ext/controller","ember-routing/ext/view","ember-routing/location/api","ember-routing/location/none_location","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/system/controller_for","ember-routing/system/dsl","ember-routing/system/router","ember-routing/system/route","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) { + ["ember-handlebars","ember-metal/core","ember-routing/ext/run_loop","ember-routing/ext/controller","ember-routing/ext/view","ember-routing/location/api","ember-routing/location/none_location","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/system/generate_controller","ember-routing/system/controller_for","ember-routing/system/dsl","ember-routing/system/router","ember-routing/system/route","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) { "use strict"; /** Ember Routing @@ -20178,12 +20771,12 @@ define("ember-routing", var HistoryLocation = __dependency9__["default"]; var AutoLocation = __dependency10__["default"]; - var controllerFor = __dependency11__.controllerFor; var generateControllerFactory = __dependency11__.generateControllerFactory; - var generateController = __dependency11__.generateController; - var RouterDSL = __dependency12__["default"]; - var Router = __dependency13__["default"]; - var Route = __dependency14__["default"]; + var generateController = __dependency11__["default"]; + var controllerFor = __dependency12__["default"]; + var RouterDSL = __dependency13__["default"]; + var Router = __dependency14__["default"]; + var Route = __dependency15__["default"]; Ember.Location = EmberLocation; Ember.AutoLocation = AutoLocation; @@ -20280,8 +20873,8 @@ define("ember-routing/ext/controller", */ transitionToRoute: function() { // target may be either another controller or a router - var target = get(this, 'target'), - method = target.transitionToRoute || target.transitionTo; + var target = get(this, 'target'); + var method = target.transitionToRoute || target.transitionTo; return method.apply(target, arguments); }, @@ -20352,8 +20945,8 @@ define("ember-routing/ext/controller", */ replaceRoute: function() { // target may be either another controller or a router - var target = get(this, 'target'), - method = target.replaceRoute || target.replaceWith; + var target = get(this, 'target'); + var method = target.replaceRoute || target.replaceWith; return method.apply(target, arguments); }, @@ -20387,7 +20980,7 @@ define("ember-routing/ext/controller", return get(m.proto, '_normalizedQueryParams'); } - var queryParams = this.queryParams; + var queryParams = get(this, 'queryParams'); if (queryParams._qpMap) { return queryParams._qpMap; } @@ -20407,14 +21000,14 @@ define("ember-routing/ext/controller", return get(m.proto, '_cacheMeta'); } - var cacheMeta = {}, - qpMap = get(this, '_normalizedQueryParams'); + var cacheMeta = {}; + var qpMap = get(this, '_normalizedQueryParams'); for (var prop in qpMap) { if (!qpMap.hasOwnProperty(prop)) { continue; } - var qp = qpMap[prop], - scope = qp.scope, - parts; + var qp = qpMap[prop]; + var scope = qp.scope; + var parts; if (scope === 'controller') { parts = []; @@ -20441,9 +21034,11 @@ define("ember-routing/ext/controller", var cacheKey = this._calculateCacheKey(propMeta.prefix, propMeta.parts, propMeta.values); var cache = this._bucketCache; - var value = cache.lookup(cacheKey, prop, propMeta.def); - set(this, prop, value); + if (cache) { + var value = cache.lookup(cacheKey, prop, propMeta.def); + set(this, prop, value); + } } }, @@ -20455,7 +21050,10 @@ define("ember-routing/ext/controller", var value = get(controller, prop); // 1. Update model-dep cache - controller._bucketCache.stash(cacheKey, prop, value); + var cache = this._bucketCache; + if (cache) { + controller._bucketCache.stash(cacheKey, prop, value); + } // 2. Notify a delegate (e.g. to fire a qp transition) var delegate = controller._qpDelegate; @@ -20594,10 +21192,10 @@ define("ember-routing/ext/view", return; } - var outlets = get(this, '_outlets'), - container = get(this, 'container'), - router = container && container.lookup('router:main'), - renderedName = get(view, 'renderedName'); + var outlets = get(this, '_outlets'); + var container = get(this, 'container'); + var router = container && container.lookup('router:main'); + var renderedName = get(view, 'renderedName'); set(outlets, outletName, view); @@ -20887,8 +21485,8 @@ define("ember-routing/location/api", _getHash: function () { // AutoLocation has it at _location, HashLocation at .location. // Being nice and not changing - var href = (this._location || this.location).href, - hashIndex = href.indexOf('#'); + var href = (this._location || this.location).href; + var hashIndex = href.indexOf('#'); if (hashIndex === -1) { return ''; @@ -21029,8 +21627,8 @@ define("ember-routing/location/auto_location", @method _getOrigin */ _getOrigin: function () { - var location = this._location, - origin = location.origin; + var location = this._location; + var origin = location.origin; // Older browsers, especially IE, don't have origin if (!origin) { @@ -21079,8 +21677,8 @@ define("ember-routing/location/auto_location", @method _getSupportsHashChange */ _getSupportsHashChange: function () { - var _window = this._window, - documentMode = _window.document.documentMode; + var _window = this._window; + var documentMode = _window.document.documentMode; return ('onhashchange' in _window && (documentMode === undefined || documentMode > 7 )); }, @@ -21166,12 +21764,12 @@ define("ember-routing/location/auto_location", @method _getHistoryPath */ _getHistoryPath: function () { - var rootURL = this._getRootURL(), - path = this._getPath(), - hash = this._getHash(), - query = this._getQuery(), - rootURLIndex = path.indexOf(rootURL), - routeHash, hashParts; + var rootURL = this._getRootURL(); + var path = this._getPath(); + var hash = this._getHash(); + var query = this._getQuery(); + var rootURLIndex = path.indexOf(rootURL); + var routeHash, hashParts; Ember.assert('Path ' + path + ' does not start with the provided rootURL ' + rootURL, rootURLIndex === 0); @@ -21214,10 +21812,10 @@ define("ember-routing/location/auto_location", @method _getHashPath */ _getHashPath: function () { - var rootURL = this._getRootURL(), - path = rootURL, - historyPath = this._getHistoryPath(), - routePath = historyPath.substr(rootURL.length); + var rootURL = this._getRootURL(); + var path = rootURL; + var historyPath = this._getHistoryPath(); + var routePath = historyPath.substr(rootURL.length); if (routePath !== '') { if (routePath.charAt(0) !== '/') { @@ -21243,10 +21841,10 @@ define("ember-routing/location/auto_location", this.rootURL = options.rootURL; } - var historyPath, hashPath, - cancelRouterSetup = false, - implementationClass = this._NoneLocation, - currentPath = this._getFullPath(); + var historyPath, hashPath; + var cancelRouterSetup = false; + var implementationClass = this._NoneLocation; + var currentPath = this._getFullPath(); if (this._getSupportsHistory()) { historyPath = this._getHistoryPath(); @@ -21256,8 +21854,18 @@ define("ember-routing/location/auto_location", if (currentPath === historyPath) { implementationClass = this._HistoryLocation; } else { - cancelRouterSetup = true; - this._replacePath(historyPath); + if (Ember.FEATURES.isEnabled("ember-routing-auto-location-uses-replace-state-for-history")) { + if (currentPath.substr(0, 2) === '/#') { + this._history.replaceState({ path: historyPath }, null, historyPath); + implementationClass = this._HistoryLocation; + } else { + cancelRouterSetup = true; + this._replacePath(historyPath); + } + } else { + cancelRouterSetup = true; + this._replacePath(historyPath); + } } } else if (this._getSupportsHashChange()) { @@ -21404,7 +22012,7 @@ define("ember-routing/location/hash_location", @param url {String} */ formatURL: function(url) { - return '#'+url; + return '#' + url; }, /** @@ -21484,13 +22092,14 @@ define("ember-routing/location/history_location", @return url {String} */ getURL: function() { - var rootURL = get(this, 'rootURL'), - location = get(this, 'location'), - path = location.pathname, - baseURL = get(this, 'baseURL'); + var rootURL = get(this, 'rootURL'); + var location = get(this, 'location'); + var path = location.pathname; + var baseURL = get(this, 'baseURL'); rootURL = rootURL.replace(/\/$/, ''); baseURL = baseURL.replace(/\/$/, ''); + var url = path.replace(baseURL, '').replace(rootURL, ''); @@ -21599,8 +22208,8 @@ define("ember-routing/location/history_location", @param callback {Function} */ onUpdateURL: function(callback) { - var guid = guidFor(this), - self = this; + var guid = guidFor(this); + var self = this; jQuery(window).on('popstate.ember-location-'+guid, function(e) { // Ignore initial page load popstate event in Chrome @@ -21621,8 +22230,8 @@ define("ember-routing/location/history_location", @return formatted url {String} */ formatURL: function(url) { - var rootURL = get(this, 'rootURL'), - baseURL = get(this, 'baseURL'); + var rootURL = get(this, 'rootURL'); + var baseURL = get(this, 'baseURL'); if (url !== '') { rootURL = rootURL.replace(/\/$/, ''); @@ -21817,9 +22426,7 @@ define("ember-routing/system/dsl", __exports__["default"] = DSL; DSL.prototype = { - resource: function(name, options, callback) { - Ember.assert("'basic' cannot be used as a resource name.", name !== 'basic'); - + route: function(name, options, callback) { if (arguments.length === 2 && typeof options === 'function') { callback = options; options = {}; @@ -21829,18 +22436,19 @@ define("ember-routing/system/dsl", options = {}; } + var type = options.resetNamespace === true ? 'resource' : 'route'; + Ember.assert("'basic' cannot be used as a " + type + " name.", name !== 'basic'); + + if (typeof options.path !== 'string') { options.path = "/" + name; } - var createSubRoutes = false; - if (Ember.FEATURES.isEnabled('ember-routing-consistent-resources')) { - createSubRoutes = true; - } else { - if (callback) { createSubRoutes = true; } + if (canNest(this) && options.resetNamespace !== true) { + name = this.parent + "." + name; } - if (createSubRoutes) { + if (callback) { var dsl = new DSL(name); route(dsl, 'loading'); route(dsl, 'error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" }); @@ -21852,14 +22460,9 @@ define("ember-routing/system/dsl", this.push(options.path, name, null); } - if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) { - // For namespace-preserving nested resource (e.g. resource('foo.bar') within - // resource('foo')) we only want to use the last route name segment to determine - // the names of the error/loading substates (e.g. 'bar_loading') - name = name.split('.').pop(); - route(this, name + '_loading'); - route(this, name + '_error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" }); + route(this, name + '_loading', {resetNamespace: options.resetNamespace}); + route(this, name + '_error', { path: "/_unused_dummy_error_path_route_" + name + "/:error"}); } }, @@ -21870,21 +22473,25 @@ define("ember-routing/system/dsl", this.matches.push([url, name, callback]); }, - route: function(name, options) { - Ember.assert("'basic' cannot be used as a route name.", name !== 'basic'); - - route(this, name, options); - if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) { - route(this, name + '_loading'); - route(this, name + '_error', { path: "/_unused_dummy_error_path_route_" + name + "/:error" }); + resource: function(name, options, callback) { + if (arguments.length === 2 && typeof options === 'function') { + callback = options; + options = {}; } + + if (arguments.length === 1) { + options = {}; + } + + options.resetNamespace = true; + this.route(name, options, callback); }, generate: function() { var dslMatches = this.matches; if (!this.explicitIndex) { - this.route("index", { path: "/" }); + route(this, "index", { path: "/" }); } return function(match) { @@ -21896,6 +22503,10 @@ define("ember-routing/system/dsl", } }; + function canNest(dsl) { + return dsl.parent && dsl.parent !== 'application'; + } + function route(dsl, name, options) { Ember.assert("You must use `this.resource` to nest", typeof options !== 'function'); @@ -21905,7 +22516,7 @@ define("ember-routing/system/dsl", options.path = "/" + name; } - if (dsl.parent && dsl.parent !== 'application') { + if (canNest(dsl) && options.resetNamespace !== true) { name = dsl.parent + "." + name; } @@ -22001,7 +22612,7 @@ define("ember-routing/system/generate_controller", } }); define("ember-routing/system/route", - ["ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/get_properties","ember-metal/enumerable_utils","ember-metal/is_none","ember-metal/computed","ember-metal/merge","ember-metal/utils","ember-metal/run_loop","ember-runtime/keys","ember-runtime/copy","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/mixins/action_handler","ember-routing/system/generate_controller","ember-routing-handlebars/helpers/shared","exports"], + ["ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/get_properties","ember-metal/enumerable_utils","ember-metal/is_none","ember-metal/computed","ember-metal/merge","ember-metal/utils","ember-metal/run_loop","ember-metal/keys","ember-runtime/copy","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/mixins/action_handler","ember-routing/system/generate_controller","ember-routing-handlebars/helpers/shared","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; @@ -22058,7 +22669,7 @@ define("ember-routing/system/route", @method reset */ - reset: function(isExiting, transition) { + _reset: function(isExiting, transition) { var controller = this.controller; controller._qpDelegate = get(this, '_qp.states.inactive'); @@ -22357,7 +22968,7 @@ define("ember-routing/system/route", // this controller. var value, svalue; if (changes && qp.urlKey in changes) { - // Controller overrode this value in setupController + // Value updated in/before setupController value = get(controller, qp.prop); svalue = route.serializeQueryParam(value, qp.urlKey, qp.type); } else { @@ -22367,10 +22978,7 @@ define("ember-routing/system/route", } else { // No QP provided; use default value. svalue = qp.sdef; - value = qp.def; - if (isArray(value)) { - value = Ember.A(value.slice()); - } + value = copyDefaultValue(qp.def); } } @@ -22695,8 +23303,9 @@ define("ember-routing/system/route", @method setup */ setup: function(context, transition) { - var controllerName = this.controllerName || this.routeName, - controller = this.controllerFor(controllerName, true); + var controllerName = this.controllerName || this.routeName; + var controller = this.controllerFor(controllerName, true); + if (!controller) { controller = this.generateController(controllerName, context); } @@ -22718,6 +23327,10 @@ define("ember-routing/system/route", } controller._qpDelegate = states.allowOverrides; + if (transition) { + controller.setProperties(getQueryParamsFor(this, transition.state)); + } + this.setupController(controller, context, transition); } @@ -22862,6 +23475,7 @@ define("ember-routing/system/route", @method redirect @param {Object} model the model for this route + @param {Transition} transition the transition object associated with the current transition */ redirect: Ember.K, @@ -23163,9 +23777,9 @@ define("ember-routing/system/route", @return {Ember.Controller} */ controllerFor: function(name, _skipAssert) { - var container = this.container, - route = container.lookup('route:'+name), - controller; + var container = this.container; + var route = container.lookup('route:'+name); + var controller; if (route && route.controllerName) { name = route.controllerName; @@ -23244,8 +23858,8 @@ define("ember-routing/system/route", @return {Object} the model object */ modelFor: function(name) { - var route = this.container.lookup('route:' + name), - transition = this.router ? this.router.router.activeTransition : null; + var route = this.container.lookup('route:' + name); + var transition = this.router ? this.router.router.activeTransition : null; // If we are mid-transition, we want to try and look up // resolved parent contexts on the current transitionEvent. @@ -23294,55 +23908,122 @@ define("ember-routing/system/route", }, /** - Renders a template into an outlet. + `render` is used to render a template into a region of another template + (indicated by an `{{outlet}}`). `render` is used both during the entry + phase of routing (via the `renderTemplate` hook) and later in response to + user interaction. - This method has a number of defaults, based on the name of the - route specified in the router. + For example, given the following minimal router and templates: + + ```js + Router.map(function() { + this.resource('photos'); + }); + ``` + + ```handlebars + +
+ {{outlet "anOutletName"}} +
+ ``` + + ```handlebars + +

Photos

+ ``` + + You can render `photos.hbs` into the `"anOutletName"` outlet of + `application.hbs` by calling `render`: + + ```js + // posts route + Ember.Route.extend({ + renderTemplate: function(){ + this.render('posts', { + into: 'application', + outlet: 'anOutletName' + }) + } + }); + ``` + + `render` additionally allows you to supply which `view`, `controller`, and + `model` objects should be loaded and associated with the rendered template. + + + ```js + // posts route + Ember.Route.extend({ + renderTemplate: function(controller, model){ + this.render('posts', { // the template to render, referenced by name + into: 'application', // the template to render into, referenced by name + outlet: 'anOutletName', // the outlet inside `options.template` to render into. + view: 'aViewName', // the view to use for this template, referenced by name + controller: 'someControllerName', // the controller to use for this template, referenced by name + model: model // the model to set on `options.controller`. + }) + } + }); + ``` + + The string values provided for the template name, view, and controller + will eventually pass through to the resolver for lookup. See + Ember.Resolver for how these are mapped to JavaScript objects in your + application. + + Not all options need to be passed to `render`. Default values will be used + based on the name of the route specified in the router or the Route's + `controllerName`, `viewName` and and `templateName` properties. For example: ```js - App.Router.map(function() { + // router + Router.map(function() { this.route('index'); this.resource('post', {path: '/posts/:post_id'}); }); - - App.PostRoute = App.Route.extend({ - renderTemplate: function() { - this.render(); - } - }); ``` - The name of the `PostRoute`, as defined by the router, is `post`. - - By default, render will: - - * render the `post` template - * with the `post` view (`PostView`) for event handling, if one exists - * and the `post` controller (`PostController`), if one exists - * into the `main` outlet of the `application` template - - You can override this behavior: - ```js - App.PostRoute = App.Route.extend({ + // post route + PostRoute = App.Route.extend({ renderTemplate: function() { - this.render('myPost', { // the template to render - into: 'index', // the template to render into - outlet: 'detail', // the name of the outlet in that template - controller: 'blogPost' // the controller to use for the template - }); + this.render(); // all defaults apply } }); ``` - Remember that the controller's `model` will be the route's model. In - this case, the default model will be `App.Post.find(params.post_id)`. + The name of the `PostRoute`, defined by the router, is `post`. + + The following equivalent default options will be applied when + the Route calls `render`: + + ```js + // + this.render('post', { // the template name associated with 'post' Route + into: 'application', // the parent route to 'post' Route + outlet: 'main', // {{outlet}} and {{outlet 'main' are synonymous}}, + view: 'post', // the view associated with the 'post' Route + controller: 'post', // the controller associated with the 'post' Route + }) + ``` + + By default the controller's `model` will be the route's model, so it does not + need to be passed unless you wish to change which model is being used. @method render @param {String} name the name of the template to render - @param {Object} options the options + @param {Object} [options] the options + @param {String} [options.into] the template to render into, + referenced by name. Defaults to the parent template + @param {String} [options.outlet] the outlet inside `options.template` to render into. + Defaults to 'main' + @param {String} [options.controller] the controller to use for this template, + referenced by name. Defaults to the Route's paired controller + @param {String} [options.model] the model object to set on `options.controller` + Defaults to the return value of the Route's model hook */ render: function(name, options) { Ember.assert("The name in the given arguments is undefined", arguments.length > 0 ? !isNone(arguments[0]) : true); @@ -23355,6 +24036,7 @@ define("ember-routing/system/route", } options = options || {}; + options.namePassed = namePassed; var templateName; @@ -23368,9 +24050,9 @@ define("ember-routing/system/route", var viewName = options.view || namePassed && name || this.viewName || name; - var container = this.container, - view = container.lookup('view:' + viewName), - template = view ? view.get('template') : null; + var container = this.container; + var view = container.lookup('view:' + viewName); + var template = view ? view.get('template') : null; if (!template) { template = container.lookup('template:' + templateName); @@ -23623,9 +24305,6 @@ define("ember-routing/system/route", run.once(this, this._fireQueryParamTransition); }, - //_inactiveQPChanged: function(controller, qp) { - //}, - _updatingQPChanged: function(controller, qp) { var router = this.router; if (!router._qpUpdates) { @@ -23643,37 +24322,12 @@ define("ember-routing/system/route", return {}; } - var transition = this.router.router.activeTransition, - state = transition ? transition.state : this.router.router.state, - params = {}; + var transition = this.router.router.activeTransition; + var state = transition ? transition.state : this.router.router.state; + var params = {}; merge(params, state.params[name]); - - if (!state.fullQueryParams) { - state.fullQueryParams = {}; - merge(state.fullQueryParams, state.queryParams); - - var targetRouteName = state.handlerInfos[state.handlerInfos.length-1].name; - this.router._deserializeQueryParams(targetRouteName, state.fullQueryParams); - } - - var qpMeta = get(route, '_qp'); - - if (!qpMeta) { - // No query params specified on the controller. - return params; - } - - // Copy over all the query params for this route/controller into params hash. - // TODO: is this correct? I think this won't do model dep state. - var qps = qpMeta.qps; - for (var i = 0, len = qps.length; i < len; ++i) { - // Put deserialized qp on params hash. - var qp = qps[i]; - if (!(qp.prop in params)) { - params[qp.prop] = state.fullQueryParams[qp.prop] || qp.def; - } - } + merge(params, getQueryParamsFor(route, state)); return params; }, @@ -23733,7 +24387,6 @@ define("ember-routing/system/route", @method resetController @param {Controller} controller instance - @param {Object} model @param {Boolean} isExiting @param {Object} transition */ @@ -23784,10 +24437,10 @@ define("ember-routing/system/route", if (options.controller) { controller = options.controller; - } else if (namedController = route.container.lookup('controller:' + name)) { - controller = namedController; + } else if (options.namePassed) { + controller = route.container.lookup('controller:' + name) || route.controllerName || route.routeName; } else { - controller = route.controllerName || route.routeName; + controller = route.controllerName || route.container.lookup('controller:' + name); } if (typeof controller === 'string') { @@ -23859,6 +24512,50 @@ define("ember-routing/system/route", return function() { parentView.disconnectOutlet(outlet); }; } + function getFullQueryParams(router, state) { + if (state.fullQueryParams) { return state.fullQueryParams; } + + state.fullQueryParams = {}; + merge(state.fullQueryParams, state.queryParams); + + var targetRouteName = state.handlerInfos[state.handlerInfos.length-1].name; + router._deserializeQueryParams(targetRouteName, state.fullQueryParams); + return state.fullQueryParams; + } + + function getQueryParamsFor(route, state) { + state.queryParamsFor = state.queryParamsFor || {}; + var name = route.routeName; + + if (state.queryParamsFor[name]) { return state.queryParamsFor[name]; } + + var fullQueryParams = getFullQueryParams(route.router, state); + + var params = state.queryParamsFor[name] = {}; + + // Copy over all the query params for this route/controller into params hash. + var qpMeta = get(route, '_qp'); + var qps = qpMeta.qps; + for (var i = 0, len = qps.length; i < len; ++i) { + // Put deserialized qp on params hash. + var qp = qps[i]; + + var qpValueWasPassedIn = (qp.prop in fullQueryParams); + params[qp.prop] = qpValueWasPassedIn ? + fullQueryParams[qp.prop] : + copyDefaultValue(qp.def); + } + + return params; + } + + function copyDefaultValue(value) { + if (isArray(value)) { + return Ember.A(value.slice()); + } + return value; + } + __exports__["default"] = Route; }); define("ember-routing/system/router", @@ -23975,11 +24672,11 @@ define("ember-routing/system/router", startRouting: function() { this.router = this.router || this.constructor.map(Ember.K); - var router = this.router, - location = get(this, 'location'), - container = this.container, - self = this, - initialURL = get(this, 'initialURL'); + var router = this.router; + var location = get(this, 'location'); + var container = this.container; + var self = this; + var initialURL = get(this, 'initialURL'); // Allow the Location class to cancel the router setup while it refreshes // the page @@ -24153,10 +24850,10 @@ define("ember-routing/system/router", }, _setupLocation: function() { - var location = get(this, 'location'), - rootURL = get(this, 'rootURL'); + var location = get(this, 'location'); + var rootURL = get(this, 'rootURL'); - if (rootURL && !this.container.has('-location-setting:root-url')) { + if (rootURL && this.container && !this.container.has('-location-setting:root-url')) { this.container.register('-location-setting:root-url', rootURL, { instantiate: false }); } @@ -24183,13 +24880,13 @@ define("ember-routing/system/router", }, _getHandlerFunction: function() { - var seen = {}, container = this.container, - DefaultRoute = container.lookupFactory('route:basic'), - self = this; + var seen = {}, container = this.container; + var DefaultRoute = container.lookupFactory('route:basic'); + var self = this; return function(name) { - var routeName = 'route:' + name, - handler = container.lookup(routeName); + var routeName = 'route:' + name; + var handler = container.lookup(routeName); if (seen[name]) { return handler; } @@ -24324,9 +25021,9 @@ define("ember-routing/system/router", recogHandlerInfos = routerjs.recognizer.handlersFor(leafRouteName); for (var i = 0, len = recogHandlerInfos.length; i < len; ++i) { - var recogHandler = recogHandlerInfos[i], - route = routerjs.getHandler(recogHandler.handler), - qpMeta = get(route, '_qp'); + var recogHandler = recogHandlerInfos[i]; + var route = routerjs.getHandler(recogHandler.handler); + var qpMeta = get(route, '_qp'); if (!qpMeta) { continue; } @@ -24424,12 +25121,13 @@ define("ember-routing/system/router", @private */ function forEachRouteAbove(originRoute, transition, callback) { - var handlerInfos = transition.state.handlerInfos, - originRouteFound = false; + var handlerInfos = transition.state.handlerInfos; + var originRouteFound = false; + var handlerInfo, route; for (var i = handlerInfos.length - 1; i >= 0; --i) { - var handlerInfo = handlerInfos[i], - route = handlerInfo.handler; + handlerInfo = handlerInfos[i]; + route = handlerInfo.handler; if (!originRouteFound) { if (originRoute === route) { @@ -24472,21 +25170,9 @@ define("ember-routing/system/router", router.intermediateTransitionTo('application_error', error); return; } - } else { - // Don't fire an assertion if we found an error substate. - return; } - var errorArgs = ['Error while processing route: ' + transition.targetName]; - - if (error) { - if (error.message) { errorArgs.push(error.message); } - if (error.stack) { errorArgs.push(error.stack); } - - if (typeof error === "string") { errorArgs.push(error); } - } - - Ember.Logger.error.apply(this, errorArgs); + logError(error, 'Error while processing route: ' + transition.targetName); }, loading: function(transition, originRoute) { @@ -24517,11 +25203,26 @@ define("ember-routing/system/router", } }; + function logError(error, initialMessage) { + var errorArgs = []; + + if (initialMessage) { errorArgs.push(initialMessage); } + + if (error) { + if (error.message) { errorArgs.push(error.message); } + if (error.stack) { errorArgs.push(error.stack); } + + if (typeof error === "string") { errorArgs.push(error); } + } + + Ember.Logger.error.apply(this, errorArgs); + } + function findChildRouteName(parentRoute, originatingChildRoute, name) { - var router = parentRoute.router, - childName, - targetChildRouteName = originatingChildRoute.routeName.split('.').pop(), - namespace = parentRoute.routeName === 'application' ? '' : parentRoute.routeName + '.'; + var router = parentRoute.router; + var childName; + var targetChildRouteName = originatingChildRoute.routeName.split('.').pop(); + var namespace = parentRoute.routeName === 'application' ? '' : parentRoute.routeName + '.'; if (Ember.FEATURES.isEnabled("ember-routing-named-substates")) { // First, try a named loading state, e.g. 'foo_loading' @@ -24553,10 +25254,11 @@ define("ember-routing/system/router", } var eventWasHandled = false; + var handlerInfo, handler; for (var i = handlerInfos.length - 1; i >= 0; i--) { - var handlerInfo = handlerInfos[i], - handler = handlerInfo.handler; + handlerInfo = handlerInfos[i]; + handler = handlerInfo.handler; if (handler._actions && handler._actions[name]) { if (handler._actions[name].apply(handler, args) === true) { @@ -24668,10 +25370,11 @@ define("ember-routing/system/router", return true; } + var name, nameParts, oldNameParts; for (var i=1, l=handlerInfos.length; i 0) - (diff < 0); + } /** This will compare two javascript values of possibly different types. @@ -24941,74 +25647,52 @@ define("ember-runtime/compare", @return {Number} -1 if v < w, 0 if v = w and 1 if v > w. */ __exports__["default"] = function compare(v, w) { - if (v === w) { return 0; } + if (v === w) { + return 0; + } var type1 = typeOf(v); var type2 = typeOf(w); if (Comparable) { - if (type1==='instance' && Comparable.detect(v.constructor)) { + if (type1 ==='instance' && Comparable.detect(v.constructor)) { return v.constructor.compare(v, w); } if (type2 === 'instance' && Comparable.detect(w.constructor)) { - return 1-w.constructor.compare(w, v); + return 1 - w.constructor.compare(w, v); } } - // If we haven't yet generated a reverse-mapping of Ember.ORDER_DEFINITION, - // do so now. - var mapping = Ember.ORDER_DEFINITION_MAPPING; - if (!mapping) { - var order = Ember.ORDER_DEFINITION; - mapping = Ember.ORDER_DEFINITION_MAPPING = {}; - var idx, len; - for (idx = 0, len = order.length; idx < len; ++idx) { - mapping[order[idx]] = idx; - } - - // We no longer need Ember.ORDER_DEFINITION. - delete Ember.ORDER_DEFINITION; + var res = spaceship(TYPE_ORDER[type1], TYPE_ORDER[type2]); + if (res !== 0) { + return res; } - var type1Index = mapping[type1]; - var type2Index = mapping[type2]; - - if (type1Index < type2Index) { return -1; } - if (type1Index > type2Index) { return 1; } - // types are equal - so we have to check values now switch (type1) { case 'boolean': case 'number': - if (v < w) { return -1; } - if (v > w) { return 1; } - return 0; + return spaceship(v,w); case 'string': - var comp = v.localeCompare(w); - if (comp < 0) { return -1; } - if (comp > 0) { return 1; } - return 0; + return spaceship(v.localeCompare(w), 0); case 'array': var vLen = v.length; var wLen = w.length; - var l = Math.min(vLen, wLen); - var r = 0; - var i = 0; - while (r === 0 && i < l) { - r = compare(v[i],w[i]); - i++; + var len = Math.min(vLen, wLen); + + for (var i = 0; i < len; i++) { + var r = compare(v[i], w[i]); + if (r !== 0) { + return r; + } } - if (r !== 0) { return r; } // all elements are equal now // shorter array should be ordered first - if (vLen < wLen) { return -1; } - if (vLen > wLen) { return 1; } - // arrays are equal now - return 0; + return spaceship(vLen, wLen); case 'instance': if (Comparable && Comparable.detect(v)) { @@ -25017,11 +25701,7 @@ define("ember-runtime/compare", return 0; case 'date': - var vNum = v.getTime(); - var wNum = w.getTime(); - if (vNum < wNum) { return -1; } - if (vNum > wNum) { return 1; } - return 0; + return spaceship(v.getTime(), w.getTime()); default: return 0; @@ -25068,9 +25748,11 @@ define("ember-runtime/computed/array_computed", } ArrayComputedProperty.prototype = o_create(ReduceComputedProperty.prototype); + ArrayComputedProperty.prototype.initialValue = function () { return Ember.A(); }; + ArrayComputedProperty.prototype.resetValue = function (array) { array.clear(); return array; @@ -25203,8 +25885,8 @@ define("ember-runtime/computed/array_computed", options = a_slice.call(arguments, -1)[0]; } - if (typeof options !== "object") { - throw new EmberError("Array Computed Property declared without an options hash"); + if (typeof options !== 'object') { + throw new EmberError('Array Computed Property declared without an options hash'); } var cp = new ArrayComputedProperty(options); @@ -25220,8 +25902,8 @@ define("ember-runtime/computed/array_computed", __exports__.ArrayComputedProperty = ArrayComputedProperty; }); define("ember-runtime/computed/reduce_computed", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/property_events","ember-metal/expand_properties","ember-metal/observer","ember-metal/computed","ember-metal/platform","ember-metal/enumerable_utils","ember-runtime/system/tracked_array","ember-runtime/mixins/array","ember-metal/run_loop","ember-runtime/system/set","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/property_events","ember-metal/expand_properties","ember-metal/observer","ember-metal/computed","ember-metal/platform","ember-metal/enumerable_utils","ember-runtime/system/tracked_array","ember-runtime/mixins/array","ember-metal/run_loop","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; // Ember.assert @@ -25245,7 +25927,6 @@ define("ember-runtime/computed/reduce_computed", var TrackedArray = __dependency12__["default"]; var EmberArray = __dependency13__["default"]; var run = __dependency14__["default"]; - var Set = __dependency15__["default"]; var isArray = __dependency4__.isArray; var cacheSet = cacheFor.set; @@ -25308,7 +25989,7 @@ define("ember-runtime/computed/reduce_computed", } function ItemPropertyObserverContext (dependentArray, index, trackedArray) { - Ember.assert("Internal error: trackedArray is null or undefined", trackedArray); + Ember.assert('Internal error: trackedArray is null or undefined', trackedArray); this.dependentArray = dependentArray; this.index = index; @@ -25316,7 +25997,6 @@ define("ember-runtime/computed/reduce_computed", this.trackedArray = trackedArray; this.beforeObserver = null; this.observer = null; - this.destroyed = false; } @@ -25324,6 +26004,7 @@ define("ember-runtime/computed/reduce_computed", setValue: function (newValue) { this.instanceMeta.setValue(newValue, true); }, + getValue: function () { return this.instanceMeta.getValue(); }, @@ -25380,11 +26061,9 @@ define("ember-runtime/computed/reduce_computed", }, teardownPropertyObservers: function (dependentKey, itemPropertyKeys) { - var dependentArrayObserver = this, - trackedArray = this.trackedArraysByGuid[dependentKey], - beforeObserver, - observer, - item; + var dependentArrayObserver = this; + var trackedArray = this.trackedArraysByGuid[dependentKey]; + var beforeObserver, observer, item; if (!trackedArray) { return; } @@ -25419,6 +26098,7 @@ define("ember-runtime/computed/reduce_computed", observerContext.beforeObserver = function (obj, keyName) { return dependentArrayObserver.itemPropertyWillChange(obj, keyName, observerContext.dependentArray, observerContext); }; + observerContext.observer = function (obj, keyName) { return dependentArrayObserver.itemPropertyDidChange(obj, keyName, observerContext.dependentArray, observerContext); }; @@ -25430,6 +26110,7 @@ define("ember-runtime/computed/reduce_computed", trackAdd: function (dependentKey, index, newItems) { var trackedArray = this.trackedArraysByGuid[dependentKey]; + if (trackedArray) { trackedArray.addItems(index, newItems); } @@ -25495,7 +26176,7 @@ define("ember-runtime/computed/reduce_computed", forEach(itemPropertyKeys, removeObservers, this); changeMeta = new ChangeMeta(dependentArray, item, itemIndex, this.instanceMeta.propertyName, this.cp, normalizedRemoveCount); - this.setValue( removedItem.call( + this.setValue(removedItem.call( this.instanceMeta.context, this.getValue(), item, changeMeta, this.instanceMeta.sugarMeta)); } }, @@ -25510,13 +26191,15 @@ define("ember-runtime/computed/reduce_computed", var itemPropertyKeys = this.cp._itemPropertyKeys[dependentKey]; var length = get(dependentArray, 'length'); var normalizedIndex = normalizeIndex(index, length, addedCount); + var endIndex = normalizedIndex + addedCount; var changeMeta, observerContext; - forEach(dependentArray.slice(normalizedIndex, normalizedIndex + addedCount), function (item, sliceIndex) { + forEach(dependentArray.slice(normalizedIndex, endIndex), function (item, sliceIndex) { if (itemPropertyKeys) { - observerContext = - observerContexts[sliceIndex] = - this.createPropertyObserverContext(dependentArray, normalizedIndex + sliceIndex, this.trackedArraysByGuid[dependentKey]); + observerContext = this.createPropertyObserverContext(dependentArray, normalizedIndex + sliceIndex, + this.trackedArraysByGuid[dependentKey]); + observerContexts[sliceIndex] = observerContext; + forEach(itemPropertyKeys, function (propertyKey) { addBeforeObserver(item, propertyKey, this, observerContext.beforeObserver); addObserver(item, propertyKey, this, observerContext.observer); @@ -25524,7 +26207,7 @@ define("ember-runtime/computed/reduce_computed", } changeMeta = new ChangeMeta(dependentArray, item, normalizedIndex + sliceIndex, this.instanceMeta.propertyName, this.cp, addedCount); - this.setValue( addedItem.call( + this.setValue(addedItem.call( this.instanceMeta.context, this.getValue(), item, changeMeta, this.instanceMeta.sugarMeta)); }, this); @@ -25536,24 +26219,24 @@ define("ember-runtime/computed/reduce_computed", if (!this.changedItems[guid]) { this.changedItems[guid] = { - array: array, - observerContext: observerContext, - obj: obj, - previousValues: {} + array: array, + observerContext: observerContext, + obj: obj, + previousValues: {} }; } - ++this.changedItemCount; + ++this.changedItemCount; this.changedItems[guid].previousValues[keyName] = get(obj, keyName); }, - itemPropertyDidChange: function(obj, keyName, array, observerContext) { + itemPropertyDidChange: function (obj, keyName, array, observerContext) { if (--this.changedItemCount === 0) { this.flushChanges(); } }, - flushChanges: function() { + flushChanges: function () { var changedItems = this.changedItems, key, c, changeMeta; for (key in changedItems) { @@ -25568,6 +26251,7 @@ define("ember-runtime/computed/reduce_computed", this.setValue( this.callbacks.addedItem.call(this.instanceMeta.context, this.getValue(), c.obj, changeMeta, this.instanceMeta.sugarMeta)); } + this.changedItems = {}; } }; @@ -25600,7 +26284,7 @@ define("ember-runtime/computed/reduce_computed", } } - function addItems (dependentArray, callbacks, cp, propertyName, meta) { + function addItems(dependentArray, callbacks, cp, propertyName, meta) { forEach(dependentArray, function (item, index) { meta.setValue( callbacks.addedItem.call( this, meta.getValue(), item, new ChangeMeta(dependentArray, item, index, propertyName, cp, dependentArray.length), meta.sugarMeta)); @@ -25619,7 +26303,10 @@ define("ember-runtime/computed/reduce_computed", } if (cp.options.initialize) { - cp.options.initialize.call(this, meta.getValue(), { property: cp, propertyName: propertyName }, meta.sugarMeta); + cp.options.initialize.call(this, meta.getValue(), { + property: cp, + propertyName: propertyName + }, meta.sugarMeta); } } @@ -25636,16 +26323,15 @@ define("ember-runtime/computed/reduce_computed", this.context = context; this.propertyName = propertyName; this.cache = metaFor(context).cache; - this.dependentArrays = {}; this.sugarMeta = {}; - this.initialValue = initialValue; } ReduceComputedPropertyInstanceMeta.prototype = { getValue: function () { var value = cacheGet(this.cache, this.propertyName); + if (value !== undefined) { return value; } else { @@ -25688,11 +26374,11 @@ define("ember-runtime/computed/reduce_computed", __exports__.ReduceComputedProperty = ReduceComputedProperty; // TODO: default export + function ReduceComputedProperty(options) { var cp = this; this.options = options; - this._dependentKeys = null; // A map of dependentKey -> [itemProperty, ...] that tracks what properties of // items in the array we must track to update this property. @@ -25708,24 +26394,25 @@ define("ember-runtime/computed/reduce_computed", // coalesce by, in addition to the target and method. run.once(this, recompute, propertyName); }; + var recompute = function(propertyName) { - var dependentKeys = cp._dependentKeys, - meta = cp._instanceMeta(this, propertyName), - callbacks = cp._callbacks(); + var dependentKeys = cp._dependentKeys; + var meta = cp._instanceMeta(this, propertyName); + var callbacks = cp._callbacks(); reset.call(this, cp, propertyName); meta.dependentArraysObserver.suspendArrayObservers(function () { forEach(cp._dependentKeys, function (dependentKey) { Ember.assert( - "dependent array " + dependentKey + " must be an `Ember.Array`. " + - "If you are not extending arrays, you will need to wrap native arrays with `Ember.A`", + 'dependent array ' + dependentKey + ' must be an `Ember.Array`. ' + + 'If you are not extending arrays, you will need to wrap native arrays with `Ember.A`', !(isArray(get(this, dependentKey)) && !EmberArray.detect(get(this, dependentKey)))); if (!partiallyRecomputeFor(this, dependentKey)) { return; } - var dependentArray = get(this, dependentKey), - previousDependentArray = meta.dependentArrays[dependentKey]; + var dependentArray = get(this, dependentKey); + var previousDependentArray = meta.dependentArrays[dependentKey]; if (dependentArray === previousDependentArray) { // The array may be the same, but our item property keys may have @@ -25754,6 +26441,7 @@ define("ember-runtime/computed/reduce_computed", if (!partiallyRecomputeFor(this, dependentKey)) { return; } var dependentArray = get(this, dependentKey); + if (dependentArray) { addItems.call(this, dependentArray, callbacks, cp, propertyName, meta); } @@ -25762,7 +26450,7 @@ define("ember-runtime/computed/reduce_computed", this.func = function (propertyName) { - Ember.assert("Computed reduce values require at least one dependent key", cp._dependentKeys); + Ember.assert('Computed reduce values require at least one dependent key', cp._dependentKeys); recompute.call(this, propertyName); @@ -25779,11 +26467,13 @@ define("ember-runtime/computed/reduce_computed", ReduceComputedProperty.prototype._callbacks = function () { if (!this.callbacks) { var options = this.options; + this.callbacks = { removedItem: options.removedItem || defaultCallback, addedItem: options.addedItem || defaultCallback }; } + return this.callbacks; }; @@ -25792,8 +26482,8 @@ define("ember-runtime/computed/reduce_computed", }; ReduceComputedProperty.prototype._instanceMeta = function (context, propertyName) { - var cacheMeta = metaFor(context).cacheMeta, - meta = cacheMeta[propertyName]; + var cacheMeta = metaFor(context).cacheMeta; + var meta = cacheMeta[propertyName]; if (!meta) { meta = cacheMeta[propertyName] = new ReduceComputedPropertyInstanceMeta(context, propertyName, this.initialValue()); @@ -25829,33 +26519,35 @@ define("ember-runtime/computed/reduce_computed", }; ReduceComputedProperty.prototype.property = function () { - var cp = this, - args = a_slice.call(arguments), - propertyArgs = new Set(), - match, - dependentArrayKey, - itemPropertyKey; + var cp = this; + var args = a_slice.call(arguments); + var propertyArgs = {}; + var match, dependentArrayKey, itemPropertyKey; forEach(args, function (dependentKey) { if (doubleEachPropertyPattern.test(dependentKey)) { - throw new EmberError("Nested @each properties not supported: " + dependentKey); + throw new EmberError('Nested @each properties not supported: ' + dependentKey); } else if (match = eachPropertyPattern.exec(dependentKey)) { dependentArrayKey = match[1]; - var itemPropertyKeyPattern = match[2], - addItemPropertyKey = function (itemPropertyKey) { - cp.itemPropertyKey(dependentArrayKey, itemPropertyKey); - }; + var itemPropertyKeyPattern = match[2]; + var addItemPropertyKey = function (itemPropertyKey) { + cp.itemPropertyKey(dependentArrayKey, itemPropertyKey); + }; expandProperties(itemPropertyKeyPattern, addItemPropertyKey); - propertyArgs.add(dependentArrayKey); + propertyArgs[guidFor(dependentArrayKey)] = dependentArrayKey; } else { - propertyArgs.add(dependentKey); + propertyArgs[guidFor(dependentKey)] = dependentKey; } }); - return ComputedProperty.prototype.property.apply(this, propertyArgs.toArray()); + var propertyArgsToArray = []; + for (var guid in propertyArgs) { + propertyArgsToArray.push(propertyArgs[guid]); + } + return ComputedProperty.prototype.property.apply(this, propertyArgsToArray); }; /** @@ -25991,8 +26683,8 @@ define("ember-runtime/computed/reduce_computed", // `content.@each.reversedName` above, we would be getting the objects // directly and not have access to `reversedName`. // - var reversedNameA = get(personA, 'reversedName'), - reversedNameB = get(personB, 'reversedName'); + var reversedNameA = get(personA, 'reversedName'); + var reversedNameB = get(personB, 'reversedName'); return Ember.compare(reversedNameA, reversedNameB); }) @@ -26051,12 +26743,12 @@ define("ember-runtime/computed/reduce_computed", options = a_slice.call(arguments, -1)[0]; } - if (typeof options !== "object") { - throw new EmberError("Reduce Computed Property declared without an options hash"); + if (typeof options !== 'object') { + throw new EmberError('Reduce Computed Property declared without an options hash'); } if (!('initialValue' in options)) { - throw new EmberError("Reduce Computed Property declared without an initial value"); + throw new EmberError('Reduce Computed Property declared without an initial value'); } var cp = new ReduceComputedProperty(options); @@ -26071,7 +26763,7 @@ define("ember-runtime/computed/reduce_computed", __exports__.reduceComputed = reduceComputed; }); define("ember-runtime/computed/reduce_computed_macros", - ["ember-metal/core","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/run_loop","ember-metal/observer","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/system/object_proxy","ember-runtime/system/subarray","ember-runtime/keys","ember-runtime/compare","exports"], + ["ember-metal/core","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/run_loop","ember-metal/observer","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/system/object_proxy","ember-runtime/system/subarray","ember-metal/keys","ember-runtime/compare","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __exports__) { "use strict"; /** @@ -26157,7 +26849,7 @@ define("ember-runtime/computed/reduce_computed_macros", @param {String} dependentKey @return {Ember.ComputedProperty} computes the largest value in the dependentKey's array */ - function max (dependentKey) { + function max(dependentKey) { return reduceComputed(dependentKey, { initialValue: -Infinity, @@ -26330,12 +27022,12 @@ define("ember-runtime/computed/reduce_computed_macros", }) }); - var hamster = Hamster.create({ + var hamster = Hamster.create({ chores: [ { name: 'cook', done: true }, { name: 'clean', done: true }, { name: 'write more unit tests', done: false } - ] + ] }); hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}] @@ -26353,9 +27045,9 @@ define("ember-runtime/computed/reduce_computed_macros", instanceMeta.filteredArrayIndexes = new SubArray(); }, - addedItem: function(array, item, changeMeta, instanceMeta) { - var match = !!callback.call(this, item), - filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match); + addedItem: function (array, item, changeMeta, instanceMeta) { + var match = !!callback.call(this, item); + var filterIndex = instanceMeta.filteredArrayIndexes.addItem(changeMeta.index, match); if (match) { array.insertAt(filterIndex, item); @@ -26461,6 +27153,7 @@ define("ember-runtime/computed/reduce_computed_macros", */ function uniq() { var args = a_slice.call(arguments); + args.push({ initialize: function(array, changeMeta, instanceMeta) { instanceMeta.itemCounts = {}; @@ -26471,22 +27164,25 @@ define("ember-runtime/computed/reduce_computed_macros", if (!instanceMeta.itemCounts[guid]) { instanceMeta.itemCounts[guid] = 1; + array.pushObject(item); } else { ++instanceMeta.itemCounts[guid]; } - array.addObject(item); return array; }, + removedItem: function(array, item, _, instanceMeta) { - var guid = guidFor(item), - itemCounts = instanceMeta.itemCounts; + var guid = guidFor(item); + var itemCounts = instanceMeta.itemCounts; if (--itemCounts[guid] === 0) { array.removeObject(item); } + return array; } }); + return arrayComputed.apply(null, args); } @@ -26531,37 +27227,47 @@ define("ember-runtime/computed/reduce_computed_macros", }; var args = a_slice.call(arguments); + args.push({ initialize: function (array, changeMeta, instanceMeta) { instanceMeta.itemCounts = {}; }, addedItem: function(array, item, changeMeta, instanceMeta) { - var itemGuid = guidFor(item), - dependentGuids = getDependentKeyGuids(changeMeta), - dependentGuid = guidFor(changeMeta.arrayChanged), - numberOfDependentArrays = changeMeta.property._dependentKeys.length, - itemCounts = instanceMeta.itemCounts; + var itemGuid = guidFor(item); + var dependentGuids = getDependentKeyGuids(changeMeta); + var dependentGuid = guidFor(changeMeta.arrayChanged); + var numberOfDependentArrays = changeMeta.property._dependentKeys.length; + var itemCounts = instanceMeta.itemCounts; - if (!itemCounts[itemGuid]) { itemCounts[itemGuid] = {}; } - if (itemCounts[itemGuid][dependentGuid] === undefined) { itemCounts[itemGuid][dependentGuid] = 0; } + if (!itemCounts[itemGuid]) { + itemCounts[itemGuid] = {}; + } + + if (itemCounts[itemGuid][dependentGuid] === undefined) { + itemCounts[itemGuid][dependentGuid] = 0; + } if (++itemCounts[itemGuid][dependentGuid] === 1 && numberOfDependentArrays === keys(itemCounts[itemGuid]).length) { - array.addObject(item); } + return array; }, - removedItem: function(array, item, changeMeta, instanceMeta) { - var itemGuid = guidFor(item), - dependentGuids = getDependentKeyGuids(changeMeta), - dependentGuid = guidFor(changeMeta.arrayChanged), - numberOfDependentArrays = changeMeta.property._dependentKeys.length, - numberOfArraysItemAppearsIn, - itemCounts = instanceMeta.itemCounts; - if (itemCounts[itemGuid][dependentGuid] === undefined) { itemCounts[itemGuid][dependentGuid] = 0; } + removedItem: function(array, item, changeMeta, instanceMeta) { + var itemGuid = guidFor(item); + var dependentGuids = getDependentKeyGuids(changeMeta); + var dependentGuid = guidFor(changeMeta.arrayChanged); + var numberOfDependentArrays = changeMeta.property._dependentKeys.length; + var numberOfArraysItemAppearsIn; + var itemCounts = instanceMeta.itemCounts; + + if (itemCounts[itemGuid][dependentGuid] === undefined) { + itemCounts[itemGuid][dependentGuid] = 0; + } + if (--itemCounts[itemGuid][dependentGuid] === 0) { delete itemCounts[itemGuid][dependentGuid]; numberOfArraysItemAppearsIn = keys(itemCounts[itemGuid]).length; @@ -26569,11 +27275,14 @@ define("ember-runtime/computed/reduce_computed_macros", if (numberOfArraysItemAppearsIn === 0) { delete itemCounts[itemGuid]; } + array.removeObject(item); } + return array; } }); + return arrayComputed.apply(null, args); } @@ -26610,12 +27319,13 @@ define("ember-runtime/computed/reduce_computed_macros", */ function setDiff(setAProperty, setBProperty) { if (arguments.length !== 2) { - throw new EmberError("setDiff requires exactly two dependent arrays."); + throw new EmberError('setDiff requires exactly two dependent arrays.'); } + return arrayComputed(setAProperty, setBProperty, { addedItem: function (array, item, changeMeta, instanceMeta) { - var setA = get(this, setAProperty), - setB = get(this, setBProperty); + var setA = get(this, setAProperty); + var setB = get(this, setBProperty); if (changeMeta.arrayChanged === setA) { if (!setB.contains(item)) { @@ -26624,12 +27334,13 @@ define("ember-runtime/computed/reduce_computed_macros", } else { array.removeObject(item); } + return array; }, removedItem: function (array, item, changeMeta, instanceMeta) { - var setA = get(this, setAProperty), - setB = get(this, setBProperty); + var setA = get(this, setAProperty); + var setB = get(this, setBProperty); if (changeMeta.arrayChanged === setB) { if (setA.contains(item)) { @@ -26638,6 +27349,7 @@ define("ember-runtime/computed/reduce_computed_macros", } else { array.removeObject(item); } + return array; } }); @@ -26646,8 +27358,13 @@ define("ember-runtime/computed/reduce_computed_macros", __exports__.setDiff = setDiff;function binarySearch(array, item, low, high) { var mid, midItem, res, guidMid, guidItem; - if (arguments.length < 4) { high = get(array, 'length'); } - if (arguments.length < 3) { low = 0; } + if (arguments.length < 4) { + high = get(array, 'length'); + } + + if (arguments.length < 3) { + low = 0; + } if (low === high) { return low; @@ -26664,6 +27381,7 @@ define("ember-runtime/computed/reduce_computed_macros", } res = this.order(midItem, item); + if (res === 0) { res = guidMid < guidItem ? -1 : 1; } @@ -26681,6 +27399,7 @@ define("ember-runtime/computed/reduce_computed_macros", if (SearchProxy.detectInstance(item)) { return guidFor(get(item, 'content')); } + return guidFor(item); } } @@ -26753,7 +27472,8 @@ define("ember-runtime/computed/reduce_computed_macros", on the sort property array or callback function */ function sort(itemsKey, sortDefinition) { - Ember.assert("Ember.computed.sort requires two arguments: an array key to sort and either a sort properties key or sort function", arguments.length === 2); + Ember.assert('Ember.computed.sort requires two arguments: an array key to sort and ' + + 'either a sort properties key or sort function', arguments.length === 2); var initFn, sortPropertiesKey; @@ -26764,16 +27484,16 @@ define("ember-runtime/computed/reduce_computed_macros", }; } else { sortPropertiesKey = sortDefinition; + initFn = function (array, changeMeta, instanceMeta) { function setupSortProperties() { - var sortPropertyDefinitions = get(this, sortPropertiesKey), - sortProperty, - sortProperties = instanceMeta.sortProperties = [], - sortPropertyAscending = instanceMeta.sortPropertyAscending = {}, - idx, - asc; + var sortPropertyDefinitions = get(this, sortPropertiesKey); + var sortProperties = instanceMeta.sortProperties = []; + var sortPropertyAscending = instanceMeta.sortPropertyAscending = {}; + var sortProperty, idx, asc; - Ember.assert("Cannot sort: '" + sortPropertiesKey + "' is not an array.", isArray(sortPropertyDefinitions)); + Ember.assert('Cannot sort: \'' + sortPropertiesKey + '\' is not an array.', + isArray(sortPropertyDefinitions)); changeMeta.property.clearItemPropertyKeys(itemsKey); @@ -26804,13 +27524,11 @@ define("ember-runtime/computed/reduce_computed_macros", } addObserver(this, sortPropertiesKey, updateSortPropertiesOnce); - setupSortProperties.call(this); - instanceMeta.order = function (itemA, itemB) { - var isProxy = itemB instanceof SearchProxy, - sortProperty, result, asc; + var isProxy = itemB instanceof SearchProxy; + var sortProperty, result, asc; for (var i = 0; i < this.sortProperties.length; ++i) { sortProperty = this.sortProperties[i]; @@ -26835,6 +27553,7 @@ define("ember-runtime/computed/reduce_computed_macros", addedItem: function (array, item, changeMeta, instanceMeta) { var index = instanceMeta.binarySearch(array, item); array.insertAt(index, item); + return array; }, @@ -26851,6 +27570,7 @@ define("ember-runtime/computed/reduce_computed_macros", index = instanceMeta.binarySearch(array, searchItem); array.removeAt(index); + return array; } }); @@ -26919,9 +27639,9 @@ define("ember-runtime/controllers/array_controller", For example: ```handlebars - {{#each post in controller}} -
  • {{post.title}} ({{post.titleLength}} characters)
  • - {{/each}} + {{#each post in controller}} +
  • {{post.title}} ({{post.titleLength}} characters)
  • + {{/each}} ``` ```javascript @@ -26931,7 +27651,6 @@ define("ember-runtime/controllers/array_controller", App.PostController = Ember.ObjectController.extend({ // the `title` property will be proxied to the underlying post. - titleLength: function() { return this.get('title').length; }.property('title') @@ -26969,10 +27688,22 @@ define("ember-runtime/controllers/array_controller", __exports__["default"] = ArrayProxy.extend(ControllerMixin, SortableMixin, { /** - The controller used to wrap items, if any. + The controller used to wrap items, if any. If the value is a string, it will + be used to lookup the container for the controller. As an alternative, you + can also provide a controller class as the value. + + For example: + + ```javascript + App.MyArrayController = Ember.ArrayController.extend({ + itemController: Ember.ObjectController.extend({ + //Item Controller Implementation + }) + }); + ``` @property itemController - @type String + @type String | Ember.Controller @default null */ itemController: null, @@ -27013,6 +27744,7 @@ define("ember-runtime/controllers/array_controller", if (idx >= 0 && idx < length) { controllerClass = this.lookupItemController(object); + if (controllerClass) { return this.controllerAt(idx, object, controllerClass); } @@ -27073,10 +27805,9 @@ define("ember-runtime/controllers/array_controller", _isVirtual: false, controllerAt: function(idx, object, controllerClass) { - var fullName, subController, parentController; - var container = get(this, 'container'); var subControllers = this._subControllers; + var fullName, subController, subControllerFactory, parentController, options; if (subControllers.length > idx) { subController = subControllers[idx]; @@ -27086,23 +27817,46 @@ define("ember-runtime/controllers/array_controller", } } - fullName = 'controller:' + controllerClass; - - if (!container.has(fullName)) { - throw new EmberError('Could not resolve itemController: "' + controllerClass + '"'); - } - if (this._isVirtual) { parentController = get(this, 'parentController'); } else { parentController = this; } - subController = container.lookupFactory(fullName).create({ - target: parentController, - parentController: parentController, - model: object - }); + if (Ember.FEATURES.isEnabled("ember-runtime-item-controller-inline-class")) { + options = { + target: parentController, + parentController: parentController, + model: object + }; + + if (typeof controllerClass === 'string') { + fullName = 'controller:' + controllerClass; + + if (!container.has(fullName)) { + throw new EmberError('Could not resolve itemController: "' + controllerClass + '"'); + } + + subControllerFactory = container.lookupFactory(fullName); + } else { + subControllerFactory = controllerClass; + options.container = container; + } + + subController = subControllerFactory.create(options); + } else { + fullName = 'controller:' + controllerClass; + + if (!container.has(fullName)) { + throw new EmberError('Could not resolve itemController: "' + controllerClass + '"'); + } + + subController = container.lookupFactory(fullName).create({ + target: parentController, + parentController: parentController, + model: object + }); + } subControllers[idx] = subController; @@ -27118,6 +27872,7 @@ define("ember-runtime/controllers/array_controller", if (subControllers.length) { for (var i = 0, length = subControllers.length; length > i; i++) { controller = subControllers[i]; + if (controller) { controller.destroy(); } @@ -27181,33 +27936,41 @@ define("ember-runtime/controllers/object_controller", __exports__["default"] = ObjectProxy.extend(ControllerMixin); }); define("ember-runtime/copy", - ["ember-metal/enumerable_utils","ember-metal/utils","ember-runtime/system/object","ember-runtime/mixins/copyable","ember-metal/platform","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { + ["ember-metal/enumerable_utils","ember-metal/utils","ember-runtime/system/object","ember-runtime/mixins/copyable","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; var indexOf = __dependency1__.indexOf; var typeOf = __dependency2__.typeOf; var EmberObject = __dependency3__["default"]; var Copyable = __dependency4__["default"]; - var create = __dependency5__.create; function _copy(obj, deep, seen, copies) { var ret, loc, key; // primitive data types are immutable, just return them. - if ('object' !== typeof obj || obj===null) return obj; + if (typeof obj !== 'object' || obj === null) { + return obj; + } // avoid cyclical loops - if (deep && (loc=indexOf(seen, obj))>=0) return copies[loc]; + if (deep && (loc = indexOf(seen, obj)) >= 0) { + return copies[loc]; + } - Ember.assert('Cannot clone an Ember.Object that does not implement Ember.Copyable', !(obj instanceof EmberObject) || (Copyable && Copyable.detect(obj))); + Ember.assert('Cannot clone an Ember.Object that does not implement Ember.Copyable', + !(obj instanceof EmberObject) || (Copyable && Copyable.detect(obj))); // IMPORTANT: this specific test will detect a native array only. Any other // object will need to implement Copyable. if (typeOf(obj) === 'array') { ret = obj.slice(); + if (deep) { loc = ret.length; - while(--loc>=0) ret[loc] = _copy(ret[loc], deep, seen, copies); + + while (--loc >= 0) { + ret[loc] = _copy(ret[loc], deep, seen, copies); + } } } else if (Copyable && Copyable.detect(obj)) { ret = obj.copy(deep, seen, copies); @@ -27215,12 +27978,17 @@ define("ember-runtime/copy", ret = new Date(obj.getTime()); } else { ret = {}; - for(key in obj) { - if (!obj.hasOwnProperty(key)) continue; + + for (key in obj) { + if (obj.hasOwnProperty && !obj.hasOwnProperty(key)) { + continue; + } // Prevents browsers that don't respect non-enumerability from // copying internal Ember properties - if (key.substring(0,2) === '__') continue; + if (key.substring(0, 2) === '__') { + continue; + } ret[key] = deep ? _copy(obj[key], deep, seen, copies) : obj[key]; } @@ -27250,8 +28018,14 @@ define("ember-runtime/copy", */ __exports__["default"] = function copy(obj, deep) { // fast paths - if ('object' !== typeof obj || obj === null) return obj; // can't copy primitives - if (Copyable && Copyable.detect(obj)) return obj.copy(deep); + if ('object' !== typeof obj || obj === null) { + return obj; // can't copy primitives + } + + if (Copyable && Copyable.detect(obj)) { + return obj.copy(deep); + } + return _copy(obj, deep, deep ? [] : null, deep ? [] : null); } }); @@ -27283,10 +28057,14 @@ define("ember-runtime/core", @return {Boolean} */ var isEqual = function isEqual(a, b) { - if (a && 'function'===typeof a.isEqual) return a.isEqual(b); + if (a && typeof a.isEqual === 'function') { + return a.isEqual(b); + } + if (a instanceof Date && b instanceof Date) { return a.getTime() === b.getTime(); } + return a === b; }; __exports__.isEqual = isEqual; @@ -27324,17 +28102,15 @@ define("ember-runtime/ext/function", fullName: function() { return this.get('firstName') + ' ' + this.get('lastName'); - - // Call this flag to mark the function as a property - }.property() + }.property() // Call this flag to mark the function as a property }); var president = MyApp.President.create({ - firstName: "Barack", - lastName: "Obama" + firstName: 'Barack', + lastName: 'Obama' }); - president.get('fullName'); // "Barack Obama" + president.get('fullName'); // 'Barack Obama' ``` Treating a function like a property is useful because they can work with @@ -27370,7 +28146,7 @@ define("ember-runtime/ext/function", @method property @for Function */ - FunctionPrototype.property = function() { + FunctionPrototype.property = function () { var ret = computed(this); // ComputedProperty.prototype.property expands properties; no need for us to // do so here. @@ -27402,11 +28178,13 @@ define("ember-runtime/ext/function", @method observes @for Function */ - FunctionPrototype.observes = function() { - var addWatchedProperty = function (obs) { watched.push(obs); }; + FunctionPrototype.observes = function () { var watched = []; + var addWatchedProperty = function (obs) { + watched.push(obs); + }; - for (var i=0; i= 0) return; - if (typeof obj.hasOwnProperty === 'function' && !obj.hasOwnProperty(key)) return; + if (key.substring(0, 2) === '__') { + return; + } + + if (key === '_super') { + return; + } + + if (EnumerableUtils.indexOf(array, key) >= 0) { + return; + } + + if (typeof obj.hasOwnProperty === 'function' && !obj.hasOwnProperty(key)) { + return; + } array.push(key); }; keys = function keys(obj) { - var ret = [], key; + var ret = []; + var key; + for (key in obj) { pushPropertyName(obj, ret, key); } @@ -27994,6 +28819,24 @@ define("ember-runtime/mixins/array", var hasListeners = __dependency10__.hasListeners; var isWatching = __dependency11__.isWatching; + function arrayObserversHelper(obj, target, opts, operation, notify) { + var willChange = (opts && opts.willChange) || 'arrayWillChange'; + var didChange = (opts && opts.didChange) || 'arrayDidChange'; + var hasObservers = get(obj, 'hasArrayObservers'); + + if (hasObservers === notify) { + propertyWillChange(obj, 'hasArrayObservers'); + } + + operation(obj, '@array:before', target, willChange); + operation(obj, '@array:change', target, didChange); + + if (hasObservers === notify) { + propertyDidChange(obj, 'hasArrayObservers'); + } + return obj; + } + // .......................................................... // ARRAY // @@ -28066,7 +28909,7 @@ define("ember-runtime/mixins/array", @return {*} item at index or undefined */ objectAt: function(idx) { - if ((idx < 0) || (idx >= get(this, 'length'))) return undefined; + if (idx < 0 || idx >= get(this, 'length')) return undefined; return get(this, idx); }, @@ -28095,7 +28938,7 @@ define("ember-runtime/mixins/array", /** This is the handler for the special array content property. If you get - this property, it will return this. If you set this property it a new + this property, it will return this. If you set this property to a new array, it will replace the current content. This property overrides the default property defined in `Ember.Enumerable`. @@ -28105,7 +28948,7 @@ define("ember-runtime/mixins/array", */ '[]': computed(function(key, value) { if (value !== undefined) this.replace(0, get(this, 'length'), value) ; - return this ; + return this; }), firstObject: computed(function() { @@ -28248,16 +29091,9 @@ define("ember-runtime/mixins/array", `willChange` and `didChange` option. @return {Ember.Array} receiver */ - addArrayObserver: function(target, opts) { - var willChange = (opts && opts.willChange) || 'arrayWillChange', - didChange = (opts && opts.didChange) || 'arrayDidChange'; - var hasObservers = get(this, 'hasArrayObservers'); - if (!hasObservers) propertyWillChange(this, 'hasArrayObservers'); - addListener(this, '@array:before', target, willChange); - addListener(this, '@array:change', target, didChange); - if (!hasObservers) propertyDidChange(this, 'hasArrayObservers'); - return this; + addArrayObserver: function(target, opts) { + return arrayObserversHelper(this, target, opts, addListener, false); }, /** @@ -28272,15 +29108,7 @@ define("ember-runtime/mixins/array", @return {Ember.Array} receiver */ removeArrayObserver: function(target, opts) { - var willChange = (opts && opts.willChange) || 'arrayWillChange', - didChange = (opts && opts.didChange) || 'arrayDidChange'; - - var hasObservers = get(this, 'hasArrayObservers'); - if (hasObservers) propertyWillChange(this, 'hasArrayObservers'); - removeListener(this, '@array:before', target, willChange); - removeListener(this, '@array:change', target, didChange); - if (hasObservers) propertyDidChange(this, 'hasArrayObservers'); - return this; + return arrayObserversHelper(this, target, opts, removeListener, true); }, /** @@ -28652,44 +29480,15 @@ define("ember-runtime/mixins/copyable", }); }); define("ember-runtime/mixins/deferred", - ["ember-metal/core","ember-metal/property_get","ember-metal/mixin","ember-metal/computed","ember-metal/run_loop","ember-runtime/ext/rsvp","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/mixin","ember-metal/computed","ember-runtime/ext/rsvp","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; var Ember = __dependency1__["default"]; // Ember.FEATURES, Ember.Test var get = __dependency2__.get; var Mixin = __dependency3__.Mixin; var computed = __dependency4__.computed; - var run = __dependency5__["default"]; - var RSVP = __dependency6__["default"]; - - var asyncStart = function() { - if (Ember.Test && Ember.Test.adapter) { - Ember.Test.adapter.asyncStart(); - } - }; - - var asyncEnd = function() { - if (Ember.Test && Ember.Test.adapter) { - Ember.Test.adapter.asyncEnd(); - } - }; - - RSVP.configure('async', function(callback, promise) { - var async = !run.currentRunLoop; - - if (Ember.testing && async) { asyncStart(); } - - run.backburner.schedule('actions', function(){ - if (Ember.testing && async) { asyncEnd(); } - callback(promise); - }); - }); - - RSVP.Promise.prototype.fail = function(callback, label){ - Ember.deprecate('RSVP.Promise.fail has been renamed as RSVP.Promise.catch'); - return this['catch'](callback, label); - }; + var RSVP = __dependency5__["default"]; /** @module ember @@ -28755,6 +29554,8 @@ define("ember-runtime/mixins/deferred", }, _deferred: computed(function() { + Ember.deprecate('Usage of Ember.DeferredMixin or Ember.Deferred is deprecated.', this._suppressDeferredDeprecation); + return RSVP.defer('Ember: DeferredMixin - ' + this); }) }); @@ -29737,7 +30538,7 @@ define("ember-runtime/mixins/enumerable", /** Invoke this method when the contents of your enumerable has changed. - This will notify any observers watching for content changes. If your are + This will notify any observers watching for content changes. If you are implementing an ordered enumerable (such as an array), also pass the start and end values where the content changed so that it can be used to notify range observers. @@ -30675,13 +31476,15 @@ define("ember-runtime/mixins/observable", with a list of strings or an array: ```javascript - record.getProperties('firstName', 'lastName', 'zipCode'); // { firstName: 'John', lastName: 'Doe', zipCode: '10011' } + record.getProperties('firstName', 'lastName', 'zipCode'); + // { firstName: 'John', lastName: 'Doe', zipCode: '10011' } ``` is equivalent to: ```javascript - record.getProperties(['firstName', 'lastName', 'zipCode']); // { firstName: 'John', lastName: 'Doe', zipCode: '10011' } + record.getProperties(['firstName', 'lastName', 'zipCode']); + // { firstName: 'John', lastName: 'Doe', zipCode: '10011' } ``` @method getProperties @@ -31038,11 +31841,11 @@ define("ember-runtime/mixins/observable", }); }); define("ember-runtime/mixins/promise_proxy", - ["ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/mixin","ember-metal/error","exports"], + ["ember-metal/property_get","ember-metal/set_properties","ember-metal/computed","ember-metal/mixin","ember-metal/error","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) { "use strict"; var get = __dependency1__.get; - var set = __dependency2__.set; + var setProperties = __dependency2__["default"]; var computed = __dependency3__.computed; var Mixin = __dependency4__.Mixin; var EmberError = __dependency5__["default"]; @@ -31056,16 +31859,22 @@ define("ember-runtime/mixins/promise_proxy", */ function tap(proxy, promise) { - set(proxy, 'isFulfilled', false); - set(proxy, 'isRejected', false); + setProperties(proxy, { + isFulfilled: false, + isRejected: false + }); return promise.then(function(value) { - set(proxy, 'isFulfilled', true); - set(proxy, 'content', value); + setProperties(proxy, { + content: value, + isFulfilled: true + }); return value; }, function(reason) { - set(proxy, 'isRejected', true); - set(proxy, 'reason', reason); + setProperties(proxy, { + reason: reason, + isRejected: true + }); throw reason; }, "Ember: PromiseProxy"); } @@ -31245,6 +32054,104 @@ define("ember-runtime/mixins/promise_proxy", }; } }); +define("ember-runtime/mixins/proxy", + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/observer","ember-metal/property_events","ember-metal/computed","ember-metal/properties","ember-metal/mixin","ember-runtime/system/string","ember-runtime/system/object","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) { + "use strict"; + /** + @module ember + @submodule ember-runtime + */ + + var Ember = __dependency1__["default"]; + // Ember.assert + var get = __dependency2__.get; + var set = __dependency3__.set; + var meta = __dependency4__.meta; + var addObserver = __dependency5__.addObserver; + var removeObserver = __dependency5__.removeObserver; + var addBeforeObserver = __dependency5__.addBeforeObserver; + var removeBeforeObserver = __dependency5__.removeBeforeObserver; + var propertyWillChange = __dependency6__.propertyWillChange; + var propertyDidChange = __dependency6__.propertyDidChange; + var computed = __dependency7__.computed; + var defineProperty = __dependency8__.defineProperty; + var Mixin = __dependency9__.Mixin; + var observer = __dependency9__.observer; + var fmt = __dependency10__.fmt; + var EmberObject = __dependency11__["default"]; + + function contentPropertyWillChange(content, contentKey) { + var key = contentKey.slice(8); // remove "content." + if (key in this) { return; } // if shadowed in proxy + propertyWillChange(this, key); + } + + function contentPropertyDidChange(content, contentKey) { + var key = contentKey.slice(8); // remove "content." + if (key in this) { return; } // if shadowed in proxy + propertyDidChange(this, key); + } + + /** + `Ember.ProxyMixin` forwards all properties not defined by the proxy itself + to a proxied `content` object. See Ember.ObjectProxy for more details. + + @class ProxyMixin + @namespace Ember + */ + __exports__["default"] = Mixin.create({ + /** + The object whose properties will be forwarded. + + @property content + @type Ember.Object + @default null + */ + content: null, + _contentDidChange: observer('content', function() { + Ember.assert("Can't set Proxy's content to itself", get(this, 'content') !== this); + }), + + isTruthy: computed.bool('content'), + + _debugContainerKey: null, + + willWatchProperty: function (key) { + var contentKey = 'content.' + key; + addBeforeObserver(this, contentKey, null, contentPropertyWillChange); + addObserver(this, contentKey, null, contentPropertyDidChange); + }, + + didUnwatchProperty: function (key) { + var contentKey = 'content.' + key; + removeBeforeObserver(this, contentKey, null, contentPropertyWillChange); + removeObserver(this, contentKey, null, contentPropertyDidChange); + }, + + unknownProperty: function (key) { + var content = get(this, 'content'); + if (content) { + return get(content, key); + } + }, + + setUnknownProperty: function (key, value) { + var m = meta(this); + if (m.proto === this) { + // if marked as prototype then just defineProperty + // rather than delegate + defineProperty(this, key, null, value); + return value; + } + + var content = get(this, 'content'); + Ember.assert(fmt("Cannot delegate set('%@', %@) to the 'content' property of object proxy %@: its 'content' is undefined.", [key, value, this]), content); + return set(content, key, value); + } + + }); + }); define("ember-runtime/mixins/sortable", ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/mutable_enumerable","ember-runtime/compare","ember-metal/observer","ember-metal/computed","exports"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) { @@ -31853,7 +32760,28 @@ define("ember-runtime/system/array_proxy", } }, + /** + Override to implement content array `willChange` observer. + + @method contentArrayWillChange + + @param {Ember.Array} contentArray the content array + @param {Number} start starting index of the change + @param {Number} removeCount count of items removed + @param {Number} addCount count of items added + + */ contentArrayWillChange: K, + /** + Override to implement content array `didChange` observer. + + @method contentArrayDidChange + + @param {Ember.Array} contentArray the content array + @param {Number} start starting index of the change + @param {Number} removeCount count of items removed + @param {Number} addCount count of items added + */ contentArrayDidChange: K, /** @@ -32098,7 +33026,6 @@ define("ember-runtime/system/core_object", var generateGuid = __dependency4__.generateGuid; var GUID_KEY = __dependency4__.GUID_KEY; var meta = __dependency4__.meta; - var META_KEY = __dependency4__.META_KEY; var makeArray = __dependency4__.makeArray; var rewatch = __dependency6__.rewatch; var finishChains = __dependency7__.finishChains; @@ -32124,6 +33051,7 @@ define("ember-runtime/system/core_object", var finishPartial = Mixin.finishPartial; var reopen = Mixin.prototype.reopen; var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER; + var hasCachedComputedProperties = false; var undefinedDescriptor = { configurable: true, @@ -32234,7 +33162,12 @@ define("ember-runtime/system/core_object", } } finishPartial(this, m); - apply(this, this.init, arguments); + var length = arguments.length; + var args = new Array(length); + for (var x = 0; x < length; x++) { + args[x] = arguments[x]; + } + apply(this, this.init, args); m.proto = proto; finishChains(this); sendEvent(this, "init"); @@ -32277,7 +33210,12 @@ define("ember-runtime/system/core_object", CoreObject.PrototypeMixin = Mixin.create({ reopen: function() { - applyMixin(this, arguments, true); + var length = arguments.length; + var args = new Array(length); + for (var i = 0; i < length; i++) { + args[i] = arguments[i]; + } + applyMixin(this, args, true); return this; }, @@ -32486,9 +33424,10 @@ define("ember-runtime/system/core_object", @return {String} string representation */ toString: function toString() { - var hasToStringExtension = typeof this.toStringExtension === 'function', - extension = hasToStringExtension ? ":" + this.toStringExtension() : ''; + var hasToStringExtension = typeof this.toStringExtension === 'function'; + var extension = hasToStringExtension ? ":" + this.toStringExtension() : ''; var ret = '<'+this.constructor.toString()+':'+guidFor(this)+extension+'>'; + this.toString = makeToString(ret); return ret; } @@ -32628,7 +33567,14 @@ define("ember-runtime/system/core_object", */ createWithMixins: function() { var C = this; - if (arguments.length>0) { this._initMixins(arguments); } + var l= arguments.length; + if (l > 0) { + var args = new Array(l); + for (var i = 0; i < l; i++) { + args[i] = arguments[i]; + } + this._initMixins(args); + } return new C(); }, @@ -32671,7 +33617,14 @@ define("ember-runtime/system/core_object", */ create: function() { var C = this; - if (arguments.length>0) { this._initProperties(arguments); } + var l = arguments.length; + if (l > 0) { + var args = new Array(l); + for (var i = 0; i < l; i++) { + args[i] = arguments[i]; + } + this._initProperties(args); + } return new C(); }, @@ -32706,7 +33659,16 @@ define("ember-runtime/system/core_object", */ reopen: function() { this.willReopen(); - apply(this.PrototypeMixin, reopen, arguments); + + var l = arguments.length; + var args = new Array(l); + if (l > 0) { + for (var i = 0; i < l; i++) { + args[i] = arguments[i]; + } + } + + apply(this.PrototypeMixin, reopen, args); return this; }, @@ -32766,7 +33728,15 @@ define("ember-runtime/system/core_object", @method reopenClass */ reopenClass: function() { - apply(this.ClassMixin, reopen, arguments); + var l = arguments.length; + var args = new Array(l); + if (l > 0) { + for (var i = 0; i < l; i++) { + args[i] = arguments[i]; + } + } + + apply(this.ClassMixin, reopen, args); applyMixin(this, arguments, false); return this; }, @@ -32812,13 +33782,33 @@ define("ember-runtime/system/core_object", @param key {String} property name */ metaForProperty: function(key) { - var meta = this.proto()[META_KEY], - desc = meta && meta.descs[key]; + var meta = this.proto()['__ember_meta__']; + var desc = meta && meta.descs[key]; Ember.assert("metaForProperty() could not find a computed property with key '"+key+"'.", !!desc && desc instanceof ComputedProperty); return desc._meta || {}; }, + _computedProperties: Ember.computed(function() { + hasCachedComputedProperties = true; + var proto = this.proto(); + var descs = meta(proto).descs; + var property; + var properties = []; + + for (var name in descs) { + property = descs[name]; + + if (property instanceof ComputedProperty) { + properties.push({ + name: name, + meta: property._meta + }); + } + } + return properties; + }).readOnly(), + /** Iterate over each computed property for the class, passing its name and any associated metadata (see `metaForProperty`) to the callback. @@ -32828,17 +33818,15 @@ define("ember-runtime/system/core_object", @param {Object} binding */ eachComputedProperty: function(callback, binding) { - var proto = this.proto(), - descs = meta(proto).descs, - empty = {}, - property; + var property, name; + var empty = {}; - for (var name in descs) { - property = descs[name]; + var properties = get(this, '_computedProperties'); - if (property instanceof ComputedProperty) { - callback.call(binding || this, name, property._meta || empty); - } + for (var i = 0, length = properties.length; i < length; i++) { + property = properties[i]; + name = property.name; + callback.call(binding || this, property.name, property.meta || empty); } } }); @@ -32850,19 +33838,42 @@ define("ember-runtime/system/core_object", } CoreObject.ClassMixin = ClassMixin; + ClassMixin.apply(CoreObject); + CoreObject.reopen({ + didDefineProperty: function(proto, key, value) { + if (hasCachedComputedProperties === false) { return; } + if (value instanceof Ember.ComputedProperty) { + var cache = Ember.meta(this.constructor).cache; + + if (cache._computedProperties !== undefined) { + cache._computedProperties = undefined; + } + } + + this._super(); + } + }); + + __exports__["default"] = CoreObject; }); define("ember-runtime/system/deferred", - ["ember-runtime/mixins/deferred","ember-metal/property_get","ember-runtime/system/object","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __exports__) { + ["ember-metal/core","ember-runtime/mixins/deferred","ember-metal/property_get","ember-runtime/system/object","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __exports__) { "use strict"; - var DeferredMixin = __dependency1__["default"]; - var get = __dependency2__.get; - var EmberObject = __dependency3__["default"]; + var Ember = __dependency1__["default"]; + var DeferredMixin = __dependency2__["default"]; + var get = __dependency3__.get; + var EmberObject = __dependency4__["default"]; - var Deferred = EmberObject.extend(DeferredMixin); + var Deferred = EmberObject.extend(DeferredMixin, { + init: function() { + Ember.deprecate('Usage of Ember.Deferred is deprecated.'); + this._super(); + } + }); Deferred.reopenClass({ promise: function(callback, binding) { @@ -33303,6 +34314,15 @@ define("ember-runtime/system/namespace", var STARTS_WITH_UPPERCASE = /^[A-Z]/; + function tryIsNamespace(lookup, prop) { + try { + var obj = lookup[prop]; + return obj && obj.isNamespace && obj; + } catch (e) { + // continue + } + } + function findNamespaces() { var lookup = Ember.lookup, obj, isNamespace; @@ -33317,14 +34337,8 @@ define("ember-runtime/system/namespace", // At times we are not allowed to access certain properties for security reasons. // There are also times where even if we can access them, we are not allowed to access their properties. - try { - obj = lookup[prop]; - isNamespace = obj && obj.isNamespace; - } catch (e) { - continue; - } - - if (isNamespace) { + obj = tryIsNamespace(lookup, prop); + if (obj) { obj[NAME_KEY] = prop; } } @@ -33395,8 +34409,8 @@ define("ember-runtime/system/namespace", __exports__["default"] = Namespace; }); define("ember-runtime/system/native_array", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/array","ember-runtime/mixins/mutable_array","ember-runtime/mixins/observable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-runtime/copy","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) { + ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-metal/array","ember-runtime/mixins/array","ember-runtime/mixins/mutable_array","ember-runtime/mixins/observable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-runtime/copy","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __exports__) { "use strict"; /** @module ember @@ -33411,12 +34425,14 @@ define("ember-runtime/system/native_array", var replace = __dependency4__._replace; var forEach = __dependency4__.forEach; var Mixin = __dependency5__.Mixin; - var EmberArray = __dependency6__["default"]; - var MutableArray = __dependency7__["default"]; - var Observable = __dependency8__["default"]; - var Copyable = __dependency9__["default"]; - var FROZEN_ERROR = __dependency10__.FROZEN_ERROR; - var copy = __dependency11__["default"]; + var indexOf = __dependency6__.indexOf; + var lastIndexOf = __dependency6__.lastIndexOf; + var EmberArray = __dependency7__["default"]; + var MutableArray = __dependency8__["default"]; + var Observable = __dependency9__["default"]; + var Copyable = __dependency10__["default"]; + var FROZEN_ERROR = __dependency11__.FROZEN_ERROR; + var copy = __dependency12__["default"]; // Add Ember.Array to Array.prototype. Remove methods with native // implementations and supply some more optimized versions of generic methods @@ -33474,39 +34490,15 @@ define("ember-runtime/system/native_array", // from member items. unknownProperty: function(key, value) { var ret;// = this.reducedProperty(key, value) ; - if ((value !== undefined) && ret === undefined) { + if (value !== undefined && ret === undefined) { ret = this[key] = value; } - return ret ; + return ret; }, - // If browser did not implement indexOf natively, then override with - // specialized version - indexOf: function(object, startAt) { - var idx, len = this.length; + indexOf: indexOf, - if (startAt === undefined) startAt = 0; - else startAt = (startAt < 0) ? Math.ceil(startAt) : Math.floor(startAt); - if (startAt < 0) startAt += len; - - for(idx=startAt;idx=0;idx--) { - if (this[idx] === object) return idx ; - } - return -1; - }, + lastIndexOf: lastIndexOf, copy: function(deep) { if (deep) { @@ -33523,7 +34515,7 @@ define("ember-runtime/system/native_array", if (Array.prototype[methodName]) ignore.push(methodName); }); - if (ignore.length>0) { + if (ignore.length > 0) { NativeArray = NativeArray.without.apply(NativeArray, ignore); } @@ -33624,41 +34616,11 @@ define("ember-runtime/system/object", __exports__["default"] = EmberObject; }); define("ember-runtime/system/object_proxy", - ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/observer","ember-metal/property_events","ember-metal/computed","ember-metal/properties","ember-metal/mixin","ember-runtime/system/string","ember-runtime/system/object","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) { + ["ember-runtime/system/object","ember-runtime/mixins/proxy","exports"], + function(__dependency1__, __dependency2__, __exports__) { "use strict"; - /** - @module ember - @submodule ember-runtime - */ - var Ember = __dependency1__["default"]; - // Ember.assert - var get = __dependency2__.get; - var set = __dependency3__.set; - var meta = __dependency4__.meta; - var addObserver = __dependency5__.addObserver; - var removeObserver = __dependency5__.removeObserver; - var addBeforeObserver = __dependency5__.addBeforeObserver; - var removeBeforeObserver = __dependency5__.removeBeforeObserver; - var propertyWillChange = __dependency6__.propertyWillChange; - var propertyDidChange = __dependency6__.propertyDidChange; - var computed = __dependency7__.computed; - var defineProperty = __dependency8__.defineProperty; - var observer = __dependency9__.observer; - var fmt = __dependency10__.fmt; - var EmberObject = __dependency11__["default"]; - - function contentPropertyWillChange(content, contentKey) { - var key = contentKey.slice(8); // remove "content." - if (key in this) { return; } // if shadowed in proxy - propertyWillChange(this, key); - } - - function contentPropertyDidChange(content, contentKey) { - var key = contentKey.slice(8); // remove "content." - if (key in this) { return; } // if shadowed in proxy - propertyDidChange(this, key); - } + var EmberObject = __dependency1__["default"]; + var ProxyMixin = __dependency2__["default"]; /** `Ember.ObjectProxy` forwards all properties not defined by the proxy itself @@ -33726,60 +34688,10 @@ define("ember-runtime/system/object_proxy", @class ObjectProxy @namespace Ember @extends Ember.Object + @extends Ember.ProxyMixin */ - var ObjectProxy = EmberObject.extend({ - /** - The object whose properties will be forwarded. - @property content - @type Ember.Object - @default null - */ - content: null, - _contentDidChange: observer('content', function() { - Ember.assert("Can't set ObjectProxy's content to itself", get(this, 'content') !== this); - }), - - isTruthy: computed.bool('content'), - - _debugContainerKey: null, - - willWatchProperty: function (key) { - var contentKey = 'content.' + key; - addBeforeObserver(this, contentKey, null, contentPropertyWillChange); - addObserver(this, contentKey, null, contentPropertyDidChange); - }, - - didUnwatchProperty: function (key) { - var contentKey = 'content.' + key; - removeBeforeObserver(this, contentKey, null, contentPropertyWillChange); - removeObserver(this, contentKey, null, contentPropertyDidChange); - }, - - unknownProperty: function (key) { - var content = get(this, 'content'); - if (content) { - return get(content, key); - } - }, - - setUnknownProperty: function (key, value) { - var m = meta(this); - if (m.proto === this) { - // if marked as prototype then just defineProperty - // rather than delegate - defineProperty(this, key, null, value); - return value; - } - - var content = get(this, 'content'); - Ember.assert(fmt("Cannot delegate set('%@', %@) to the 'content' property of object proxy %@: its 'content' is undefined.", [key, value, this]), content); - return set(content, key, value); - } - - }); - - __exports__["default"] = ObjectProxy; + __exports__["default"] = EmberObject.extend(ProxyMixin); }); define("ember-runtime/system/set", ["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/is_none","ember-runtime/system/string","ember-runtime/system/core_object","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/enumerable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-metal/error","ember-metal/property_events","ember-metal/mixin","ember-metal/computed","exports"], @@ -33790,7 +34702,7 @@ define("ember-runtime/system/set", @submodule ember-runtime */ var Ember = __dependency1__["default"]; - // Ember.isNone + // Ember.isNone, Ember.A var get = __dependency2__.get; var set = __dependency3__.set; @@ -34142,6 +35054,7 @@ define("ember-runtime/system/set", // init: function(items) { + Ember.deprecate('Ember.Set is deprecated and will be removed in a future release.'); this._super(); if (items) this.addObjects(items); }, @@ -34253,8 +35166,8 @@ define("ember-runtime/system/set", }); }); define("ember-runtime/system/string", - ["ember-metal/core","ember-metal/utils","exports"], - function(__dependency1__, __dependency2__, __exports__) { + ["ember-metal/core","ember-metal/utils","ember-metal/cache","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; /** @module ember @@ -34265,8 +35178,47 @@ define("ember-runtime/system/string", var isArray = __dependency2__.isArray; var emberInspect = __dependency2__.inspect; + var Cache = __dependency3__["default"]; + var STRING_DASHERIZE_REGEXP = (/[ _]/g); - var STRING_DASHERIZE_CACHE = {}; + + var STRING_DASHERIZE_CACHE = new Cache(1000, function(key) { + return decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-'); + }); + + var CAMELIZE_CACHE = new Cache(1000, function(key) { + return key.replace(STRING_CAMELIZE_REGEXP, function(match, separator, chr) { + return chr ? chr.toUpperCase() : ''; + }).replace(/^([A-Z])/, function(match, separator, chr) { + return match.toLowerCase(); + }); + }); + + var CLASSIFY_CACHE = new Cache(1000, function(str) { + var parts = str.split("."), + out = []; + + for (var i=0, l=parts.length; iContent'); + return el.firstChild instanceof ChildConstructor; + }; + } - var innerHTMLTags = {}; - var canSetInnerHTML = function(tagName) { - if (innerHTMLTags[tagName] !== undefined) { - return innerHTMLTags[tagName]; - } - - var canSet = true; + var innerHTMLTags = { // IE 8 and earlier don't allow us to do innerHTML on select - if (tagName.toLowerCase() === 'select') { + select: function() { var el = document.createElement('select'); setInnerHTMLWithoutFix(el, ''); - canSet = el.options.length === 1; + return el.options.length === 1; + }, + + // IE 9 and earlier don't allow us to set innerHTML on col, colgroup, frameset, + // html, style, table, tbody, tfoot, thead, title, tr. + col: setInnerHTMLTestFactory('col', 'span', window.HTMLSpanElement), + colgroup: setInnerHTMLTestFactory('colgroup', 'col', window.HTMLTableColElement), + frameset: setInnerHTMLTestFactory('frameset', 'frame', window.HTMLFrameElement), + table: setInnerHTMLTestFactory('table', 'tbody', window.HTMLTableSectionElement), + tbody: setInnerHTMLTestFactory('tbody', 'tr', window.HTMLTableRowElement), + tfoot: setInnerHTMLTestFactory('tfoot', 'tr', window.HTMLTableRowElement), + thead: setInnerHTMLTestFactory('thead', 'tr', window.HTMLTableRowElement), + tr: setInnerHTMLTestFactory('tr', 'td', window.HTMLTableCellElement) + }; + + var canSetInnerHTML = function(tagName) { + tagName = tagName.toLowerCase(); + var canSet = innerHTMLTags[tagName]; + + if (typeof canSet === 'function') { + canSet = innerHTMLTags[tagName] = canSet(); } - innerHTMLTags[tagName] = canSet; - - return canSet; + return canSet === undefined ? true : canSet; }; function setInnerHTML(element, html) { @@ -37398,7 +38398,7 @@ define("ember-views/system/utils", endTag = ''; var wrapper = document.createElement('div'); - setInnerHTMLWithoutFix(wrapper, startTag + html + endTag); + jQuery(startTag + html + endTag).appendTo(wrapper); element = wrapper.firstChild; while (element.tagName !== tagName) { element = element.nextSibling; @@ -38367,6 +39367,13 @@ define("ember-views/views/container_view", var ContainerView = View.extend(MutableArray, { _states: states, + willWatchProperty: function(prop){ + Ember.deprecate( + "ContainerViews should not be observed as arrays. This behavior will change in future implementations of ContainerView.", + !prop.match(/\[]/) && prop.indexOf('@') !== 0 + ); + }, + init: function() { this._super(); @@ -38426,7 +39433,7 @@ define("ember-views/views/container_view", length: computed(function () { return this._childViews.length; - }).volatile(), + })["volatile"](), /** Instructs each child view to render to the passed render buffer. @@ -39193,6 +40200,8 @@ define("ember-views/views/states/pre_render", ["ember-views/views/states/default","ember-metal/platform","ember-metal/merge","exports"], function(__dependency1__, __dependency2__, __dependency3__, __exports__) { "use strict"; + /* global Node */ + var _default = __dependency1__["default"]; var create = __dependency2__.create; var merge = __dependency3__["default"]; @@ -39203,6 +40212,23 @@ define("ember-views/views/states/pre_render", */ var preRender = create(_default); + var containsElement; + if (typeof Node === 'object') { + containsElement = Node.prototype.contains; + + if (!containsElement && Node.prototype.compareDocumentPosition) { + // polyfill for older Firefox. + // http://compatibility.shwups-cms.ch/en/polyfills/?&id=52 + containsElement = function(node){ + return !!(this.compareDocumentPosition(node) & 16); + }; + } + } else { + containsElement = function(element) { + return this.contains(element); + }; + } + merge(preRender, { // a view leaves the preRender state once its element has been // created (createElement). @@ -39216,7 +40242,7 @@ define("ember-views/views/states/pre_render", // We transition to `inDOM` if the element exists in the DOM var element = view.get('element'); - if (document.body.contains(element)) { + if (containsElement.call(document.body, element)) { viewCollection.transitionTo('inDOM', false); viewCollection.trigger('didInsertElement'); } @@ -39240,8 +40266,8 @@ define("ember-views/views/states/pre_render", __exports__["default"] = preRender; }); define("ember-views/views/view", - ["ember-metal/core","ember-runtime/mixins/evented","ember-runtime/system/object","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/set_properties","ember-metal/run_loop","ember-metal/observer","ember-metal/properties","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/is_none","container/container","ember-runtime/system/native_array","ember-runtime/system/string","ember-metal/enumerable_utils","ember-runtime/copy","ember-metal/binding","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","ember-views/views/view_collection","exports"], - function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __dependency25__, __exports__) { + ["ember-metal/core","ember-runtime/mixins/evented","ember-runtime/system/object","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/set_properties","ember-metal/run_loop","ember-metal/observer","ember-metal/properties","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/is_none","ember-runtime/system/native_array","ember-runtime/system/string","ember-metal/enumerable_utils","ember-runtime/copy","ember-metal/binding","ember-metal/property_events","ember-views/system/jquery","ember-views/system/ext","ember-views/views/core_view","ember-views/views/view_collection","exports"], + function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __dependency17__, __dependency18__, __dependency19__, __dependency20__, __dependency21__, __dependency22__, __dependency23__, __dependency24__, __exports__) { "use strict"; // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES, // Ember.K, jQuery, Ember.lookup, @@ -39270,28 +40296,27 @@ define("ember-views/views/view", var isArray = __dependency11__.isArray; var isNone = __dependency14__.isNone; var Mixin = __dependency13__.Mixin; - var Container = __dependency15__["default"]; - var emberA = __dependency16__.A; + var emberA = __dependency15__.A; - var dasherize = __dependency17__.dasherize; + var dasherize = __dependency16__.dasherize; // ES6TODO: functions on EnumerableUtils should get their own export - var forEach = __dependency18__.forEach; - var addObject = __dependency18__.addObject; - var removeObject = __dependency18__.removeObject; + var forEach = __dependency17__.forEach; + var addObject = __dependency17__.addObject; + var removeObject = __dependency17__.removeObject; var beforeObserver = __dependency13__.beforeObserver; - var copy = __dependency19__["default"]; - var isGlobalPath = __dependency20__.isGlobalPath; + var copy = __dependency18__["default"]; + var isGlobalPath = __dependency19__.isGlobalPath; - var propertyWillChange = __dependency21__.propertyWillChange; - var propertyDidChange = __dependency21__.propertyDidChange; + var propertyWillChange = __dependency20__.propertyWillChange; + var propertyDidChange = __dependency20__.propertyDidChange; - var jQuery = __dependency22__["default"]; + var jQuery = __dependency21__["default"]; // for the side effect of extending Ember.run.queues - var CoreView = __dependency24__["default"]; - var ViewCollection = __dependency25__["default"]; + var CoreView = __dependency23__["default"]; + var ViewCollection = __dependency24__["default"]; /** @module ember @@ -39324,12 +40349,6 @@ define("ember-views/views/view", }); ret.replace = function (idx, removedCount, addedViews) { - if (!ContainerView) { ContainerView = requireModule('ember-views/views/container_view')['default']; } // ES6TODO: stupid circular dep - - if (view instanceof ContainerView) { - Ember.deprecate("Manipulating an Ember.ContainerView through its childViews property is deprecated. Please use the ContainerView instance itself as an Ember.MutableArray."); - return view.replace(idx, removedCount, addedViews); - } throw new EmberError("childViews is immutable"); }; @@ -40055,9 +41074,13 @@ define("ember-views/views/view", if (!name) { return; } Ember.assert("templateNames are not allowed to contain periods: "+name, name.indexOf('.') === -1); - // the defaultContainer is deprecated - var container = this.container || (Container && Container.defaultContainer); - return container && container.lookup('template:' + name); + if (!this.container) { + throw new EmberError('Container was not found when looking up a views template. ' + + 'This is most likely due to manually instantiating an Ember.View. ' + + 'See: http://git.io/EKPpnA'); + } + + return this.container.lookup('template:' + name); }, /** @@ -40079,7 +41102,7 @@ define("ember-views/views/view", } else { return get(this, '_context'); } - }).volatile(), + })["volatile"](), /** Private copy of the view's template context. This can be set directly @@ -40740,10 +41763,10 @@ define("ember-views/views/view", }, /** - Creates a DOM representation of the view and all of its - child views by recursively calling the `render()` method. + Creates a DOM representation of the view and all of its child views by + recursively calling the `render()` method. - After the element has been created, `didInsertElement` will + After the element has been inserted into the DOM, `didInsertElement` will be called on this view and all of its child views. @method createElement @@ -40869,6 +41892,9 @@ define("ember-views/views/view", this function to do any teardown that requires an element, like removing event listeners. + Please note: any property changes made during this event will have no + effect on object observers. + @event willDestroyElement */ willDestroyElement: Ember.K, @@ -41633,7 +42659,12 @@ define("ember-views/views/view", if (isNone(value) || value === false) { // `null`, `undefined` or `false` should remove attribute elem.removeAttr(name); - elem.prop(name, ''); + // In IE8 `prop` couldn't remove attribute when name is `required`. + if (name === 'required') { + elem.removeProp(name); + } else { + elem.prop(name, ''); + } } else if (value !== elem.prop(name)) { // value should always be properties elem.prop(name, value); @@ -41717,6 +42748,7 @@ define("ember", ["ember-metal","ember-runtime","ember-handlebars","ember-views","ember-routing","ember-routing-handlebars","ember-application","ember-extension-support"], function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__) { "use strict"; + /* global navigator */ // require the main entry points for each of these packages // this is so that the global exports occur properly @@ -41732,38 +42764,7 @@ define("ember", @module ember */ - function throwWithMessage(msg) { - return function() { - throw new Ember.Error(msg); - }; - } - - function generateRemovedClass(className) { - var msg = " has been moved into a plugin: https://github.com/emberjs/ember-states"; - - return { - extend: throwWithMessage(className + msg), - create: throwWithMessage(className + msg) - }; - } - - Ember.StateManager = generateRemovedClass("Ember.StateManager"); - - /** - This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states - - @class StateManager - @namespace Ember - */ - - Ember.State = generateRemovedClass("Ember.State"); - - /** - This was exported to ember-states plugin for v 1.0.0 release. See: https://github.com/emberjs/ember-states - - @class State - @namespace Ember - */ + Ember.deprecate('Usage of Ember is deprecated for Internet Explorer 6 and 7, support will be removed in the next major version.', !navigator.userAgent.match(/MSIE [67]/)); }); define("metamorph", [], @@ -42247,9 +43248,11 @@ define("metamorph", }); define("route-recognizer", - ["exports"], - function(__exports__) { + ["route-recognizer/dsl","exports"], + function(__dependency1__, __exports__) { "use strict"; + var map = __dependency1__["default"]; + var specials = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\' @@ -42675,7 +43678,7 @@ define("route-recognizer", if (value == null) { continue; } - var pair = key; + var pair = encodeURIComponent(key); if (isArray(value)) { for (var j = 0, l = value.length; j < l; j++) { var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]); @@ -42716,7 +43719,7 @@ define("route-recognizer", if (isArray) { queryParams[key].push(value); } else { - queryParams[key] = decodeURIComponent(value); + queryParams[key] = value; } } return queryParams; @@ -42773,8 +43776,14 @@ define("route-recognizer", } }; - __exports__["default"] = RouteRecognizer; + RouteRecognizer.prototype.map = map; + __exports__["default"] = RouteRecognizer; + }); +define("route-recognizer/dsl", + ["exports"], + function(__exports__) { + "use strict"; function Target(path, matcher, delegate) { this.path = path; this.matcher = matcher; @@ -42864,7 +43873,7 @@ define("route-recognizer", } } - RouteRecognizer.prototype.map = function(callback, addRouteCallback) { + __exports__["default"] = function(callback, addRouteCallback) { var matcher = new Matcher(); callback(generateMatch("", matcher, this.delegate)); @@ -42873,9 +43882,16 @@ define("route-recognizer", if (addRouteCallback) { addRouteCallback(this, route); } else { this.add(route); } }, this); - }; + } }); +define("router", + ["./router/router","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Router = __dependency1__["default"]; + __exports__["default"] = Router; + }); define("router/handler-info", ["./utils","rsvp/promise","exports"], function(__dependency1__, __dependency2__, __exports__) { @@ -42884,6 +43900,7 @@ define("router/handler-info", var merge = __dependency1__.merge; var serialize = __dependency1__.serialize; var promiseLabel = __dependency1__.promiseLabel; + var applyHook = __dependency1__.applyHook; var Promise = __dependency2__["default"]; function HandlerInfo(_props) { @@ -42970,14 +43987,13 @@ define("router/handler-info", } args.push(payload); - var handler = this.handler; - var result = handler[hookName] && handler[hookName].apply(handler, args); + var result = applyHook(this.handler, hookName, args); if (result && result.isTransition) { result = null; } - return Promise.resolve(result, null, this.promiseLabel("Resolve value returned from one of the model hooks")); + return Promise.resolve(result, this.promiseLabel("Resolve value returned from one of the model hooks")); }, // overridden by subclasses @@ -43174,6 +44190,7 @@ define("router/handler-info/unresolved-handler-info-by-param", function(__dependency1__, __dependency2__, __exports__) { "use strict"; var HandlerInfo = __dependency1__["default"]; + var resolveHook = __dependency2__.resolveHook; var merge = __dependency2__.merge; var subclass = __dependency2__.subclass; var promiseLabel = __dependency2__.promiseLabel; @@ -43192,8 +44209,9 @@ define("router/handler-info/unresolved-handler-info-by-param", fullParams.queryParams = payload.queryParams; } - var hookName = typeof this.handler.deserialize === 'function' ? - 'deserialize' : 'model'; + var handler = this.handler; + var hookName = resolveHook(handler, 'deserialize') || + resolveHook(handler, 'model'); return this.runSharedModelHook(payload, hookName, [fullParams]); } @@ -43216,6 +44234,7 @@ define("router/router", var extractQueryParams = __dependency3__.extractQueryParams; var getChangelist = __dependency3__.getChangelist; var promiseLabel = __dependency3__.promiseLabel; + var callHook = __dependency3__.callHook; var TransitionState = __dependency4__["default"]; var logAbort = __dependency5__.logAbort; var Transition = __dependency5__.Transition; @@ -43359,11 +44378,9 @@ define("router/router", */ reset: function() { if (this.state) { - forEach(this.state.handlerInfos, function(handlerInfo) { + forEach(this.state.handlerInfos.slice().reverse(), function(handlerInfo) { var handler = handlerInfo.handler; - if (handler.exit) { - handler.exit(); - } + callHook(handler, 'exit'); }); } @@ -43427,7 +44444,7 @@ define("router/router", }, intermediateTransitionTo: function(name) { - doTransition(this, arguments, true); + return doTransition(this, arguments, true); }, refresh: function(pivotHandler) { @@ -43647,8 +44664,9 @@ define("router/router", forEach(partition.exited, function(handlerInfo) { var handler = handlerInfo.handler; delete handler.context; - if (handler.reset) { handler.reset(true, transition); } - if (handler.exit) { handler.exit(transition); } + + callHook(handler, 'reset', true, transition); + callHook(handler, 'exit', transition); }); var oldState = router.oldState = router.state; @@ -43658,7 +44676,7 @@ define("router/router", try { forEach(partition.reset, function(handlerInfo) { var handler = handlerInfo.handler; - if (handler.reset) { handler.reset(false, transition); } + callHook(handler, 'reset', false, transition); }); forEach(partition.updatedContext, function(handlerInfo) { @@ -43689,15 +44707,15 @@ define("router/router", var handler = handlerInfo.handler, context = handlerInfo.context; - if (enter && handler.enter) { handler.enter(transition); } + callHook(handler, 'enter', transition); if (transition && transition.isAborted) { throw new TransitionAborted(); } handler.context = context; - if (handler.contextDidChange) { handler.contextDidChange(); } + callHook(handler, 'contextDidChange'); - if (handler.setup) { handler.setup(context, transition); } + callHook(handler, 'setup', context, transition); if (transition && transition.isAborted) { throw new TransitionAborted(); } @@ -43760,7 +44778,7 @@ define("router/router", unchanged: [] }; - var handlerChanged, contextChanged, i, l; + var handlerChanged, contextChanged = false, i, l; for (i=0, l=newHandlers.length; i 0.5) { + throw new Error(); + } + return new Author(); + } + + try { + return findAuthor(); // succeed or fail + } catch(error) { + return findOtherAuther(); + } finally { + // always runs + // doesn't affect the return value + } + ``` + + Asynchronous example: + + ```js + findAuthor().catch(function(reason){ + return findOtherAuther(); + }).finally(function(){ + // author was either found, or not + }); + ``` + + @method finally + @param {Function} callback + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} + */ + 'finally': function(callback, label) { + var constructor = this.constructor; + + return this.then(function(value) { + return constructor.resolve(callback()).then(function(){ + return value; + }); + }, function(reason) { + return constructor.resolve(callback()).then(function(){ + throw reason; + }); + }, label); + } }; -}); -define('rsvp/promise/all', [ - '../enumerator', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; - var Enumerator = __dependency1__['default']; + }); +define("rsvp/promise/all", + ["../enumerator","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Enumerator = __dependency1__["default"]; + /** `RSVP.Promise.all` accepts an array of promises, and returns a new promise which is fulfilled with an array of fulfillment values for the passed promises, or @@ -46536,100 +48276,22 @@ define('rsvp/promise/all', [ fulfilled, or rejected if any of them become rejected. @static */ - __exports__['default'] = function all(entries, label) { - return new Enumerator(this, entries, true, label).promise; - }; -}); -define('rsvp/promise/cast', [ - './resolve', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; - var resolve = __dependency1__['default']; - /** - @deprecated - - `RSVP.Promise.cast` coerces its argument to a promise, or returns the - argument if it is already a promise which shares a constructor with the caster. - - Example: - - ```javascript - var promise = RSVP.Promise.resolve(1); - var casted = RSVP.Promise.cast(promise); - - console.log(promise === casted); // true - ``` - - In the case of a promise whose constructor does not match, it is assimilated. - The resulting promise will fulfill or reject based on the outcome of the - promise being casted. - - Example: - - ```javascript - var thennable = $.getJSON('/api/foo'); - var casted = RSVP.Promise.cast(thennable); - - console.log(thennable === casted); // false - console.log(casted instanceof RSVP.Promise) // true - - casted.then(function(data) { - // data is the value getJSON fulfills with - }); - ``` - - In the case of a non-promise, a promise which will fulfill with that value is - returned. - - Example: - - ```javascript - var value = 1; // could be a number, boolean, string, undefined... - var casted = RSVP.Promise.cast(value); - - console.log(value === casted); // false - console.log(casted instanceof RSVP.Promise) // true - - casted.then(function(val) { - val === value // => true - }); - ``` - - `RSVP.Promise.cast` is similar to `RSVP.Promise.resolve`, but `RSVP.Promise.cast` differs in the - following ways: - - * `RSVP.Promise.cast` serves as a memory-efficient way of getting a promise, when you - have something that could either be a promise or a value. RSVP.resolve - will have the same effect but will create a new promise wrapper if the - argument is a promise. - * `RSVP.Promise.cast` is a way of casting incoming thenables or promise subclasses to - promises of the exact class specified, so that the resulting object's `then` is - ensured to have the behavior of the constructor you are calling cast on (i.e., RSVP.Promise). - - @method cast - @static - @param {Object} object to be casted - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise - */ - __exports__['default'] = resolve; -}); -define('rsvp/promise/race', [ - '../utils', - '../-internal', - 'exports' -], function (__dependency1__, __dependency2__, __exports__) { - 'use strict'; + __exports__["default"] = function all(entries, label) { + return new Enumerator(this, entries, true /* abort on reject */, label).promise; + } + }); +define("rsvp/promise/race", + ["../utils","../-internal","exports"], + function(__dependency1__, __dependency2__, __exports__) { + "use strict"; var isArray = __dependency1__.isArray; - var isFunction = __dependency1__.isFunction; - var isMaybeThenable = __dependency1__.isMaybeThenable; + var noop = __dependency2__.noop; var resolve = __dependency2__.resolve; var reject = __dependency2__.reject; var subscribe = __dependency2__.subscribe; var PENDING = __dependency2__.PENDING; + /** `RSVP.Promise.race` returns a new promise which is settled in the same way as the first passed promise to settle. @@ -46639,18 +48301,18 @@ define('rsvp/promise/race', [ ```javascript var promise1 = new RSVP.Promise(function(resolve, reject){ setTimeout(function(){ - resolve("promise 1"); + resolve('promise 1'); }, 200); }); var promise2 = new RSVP.Promise(function(resolve, reject){ setTimeout(function(){ - resolve("promise 2"); + resolve('promise 2'); }, 100); }); RSVP.Promise.race([promise1, promise2]).then(function(result){ - // result === "promise 2" because it was resolved before promise1 + // result === 'promise 2' because it was resolved before promise1 // was resolved. }); ``` @@ -46664,20 +48326,20 @@ define('rsvp/promise/race', [ ```javascript var promise1 = new RSVP.Promise(function(resolve, reject){ setTimeout(function(){ - resolve("promise 1"); + resolve('promise 1'); }, 200); }); var promise2 = new RSVP.Promise(function(resolve, reject){ setTimeout(function(){ - reject(new Error("promise 2")); + reject(new Error('promise 2')); }, 100); }); RSVP.Promise.race([promise1, promise2]).then(function(result){ // Code here never runs }, function(reason){ - // reason.message === "promise 2" because promise 2 became rejected before + // reason.message === 'promise 2' because promise 2 became rejected before // promise 1 became fulfilled }); ``` @@ -46696,34 +48358,41 @@ define('rsvp/promise/race', [ @return {Promise} a promise which settles in the same way as the first passed promise to settle. */ - __exports__['default'] = function race(entries, label) { - /*jshint validthis:true */ - var Constructor = this, entry; - var promise = new Constructor(noop, label); - if (!isArray(entries)) { - reject(promise, new TypeError('You must pass an array to race.')); - return promise; - } - var length = entries.length; - function onFulfillment(value) { - resolve(promise, value); - } - function onRejection(reason) { - reject(promise, reason); - } - for (var i = 0; promise._state === PENDING && i < length; i++) { - subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); - } + __exports__["default"] = function race(entries, label) { + /*jshint validthis:true */ + var Constructor = this; + + var promise = new Constructor(noop, label); + + if (!isArray(entries)) { + reject(promise, new TypeError('You must pass an array to race.')); return promise; - }; -}); -define('rsvp/promise/reject', [ - '../-internal', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; + } + + var length = entries.length; + + function onFulfillment(value) { + resolve(promise, value); + } + + function onRejection(reason) { + reject(promise, reason); + } + + for (var i = 0; promise._state === PENDING && i < length; i++) { + subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); + } + + return promise; + } + }); +define("rsvp/promise/reject", + ["../-internal","exports"], + function(__dependency1__, __exports__) { + "use strict"; var noop = __dependency1__.noop; var _reject = __dependency1__.reject; + /** `RSVP.Promise.reject` returns a promise rejected with the passed `reason`. It is shorthand for the following: @@ -46759,21 +48428,21 @@ define('rsvp/promise/reject', [ Useful for tooling. @return {Promise} a promise rejected with the given `reason`. */ - __exports__['default'] = function reject(reason, label) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop, label); - _reject(promise, reason); - return promise; - }; -}); -define('rsvp/promise/resolve', [ - '../-internal', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; + __exports__["default"] = function reject(reason, label) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop, label); + _reject(promise, reason); + return promise; + } + }); +define("rsvp/promise/resolve", + ["../-internal","exports"], + function(__dependency1__, __exports__) { + "use strict"; var noop = __dependency1__.noop; var _resolve = __dependency1__.resolve; + /** `RSVP.Promise.resolve` returns a promise that will become resolved with the passed `value`. It is shorthand for the following: @@ -46806,23 +48475,25 @@ define('rsvp/promise/resolve', [ @return {Promise} a promise that will become fulfilled with the given `value` */ - __exports__['default'] = function resolve(object, label) { - /*jshint validthis:true */ - var Constructor = this; - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - var promise = new Constructor(noop, label); - _resolve(promise, object); - return promise; - }; -}); -define('rsvp/race', [ - './promise', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; - var Promise = __dependency1__['default']; + __exports__["default"] = function resolve(object, label) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop, label); + _resolve(promise, object); + return promise; + } + }); +define("rsvp/race", + ["./promise","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Promise = __dependency1__["default"]; + /** This is a convenient alias for `RSVP.Promise.race`. @@ -46833,16 +48504,16 @@ define('rsvp/race', [ @param {String} label An optional label. This is useful for tooling. */ - __exports__['default'] = function race(array, label) { - return Promise.race(array, label); - }; -}); -define('rsvp/reject', [ - './promise', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; - var Promise = __dependency1__['default']; + __exports__["default"] = function race(array, label) { + return Promise.race(array, label); + } + }); +define("rsvp/reject", + ["./promise","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Promise = __dependency1__["default"]; + /** This is a convenient alias for `RSVP.Promise.reject`. @@ -46854,16 +48525,16 @@ define('rsvp/reject', [ Useful for tooling. @return {Promise} a promise rejected with the given `reason`. */ - __exports__['default'] = function reject(reason, label) { - return Promise.reject(reason, label); - }; -}); -define('rsvp/resolve', [ - './promise', - 'exports' -], function (__dependency1__, __exports__) { - 'use strict'; - var Promise = __dependency1__['default']; + __exports__["default"] = function reject(reason, label) { + return Promise.reject(reason, label); + } + }); +define("rsvp/resolve", + ["./promise","exports"], + function(__dependency1__, __exports__) { + "use strict"; + var Promise = __dependency1__["default"]; + /** This is a convenient alias for `RSVP.Promise.resolve`. @@ -46876,12 +48547,14 @@ define('rsvp/resolve', [ @return {Promise} a promise that will become fulfilled with the given `value` */ - __exports__['default'] = function resolve(value, label) { - return Promise.resolve(value, label); - }; -}); -define('rsvp/rethrow', ['exports'], function (__exports__) { - 'use strict'; + __exports__["default"] = function resolve(value, label) { + return Promise.resolve(value, label); + } + }); +define("rsvp/rethrow", + ["exports"], + function(__exports__) { + "use strict"; /** `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event loop in order to aid debugging. @@ -46922,129 +48595,51 @@ define('rsvp/rethrow', ['exports'], function (__exports__) { @throws Error @static */ - __exports__['default'] = function rethrow(reason) { - setTimeout(function () { - throw reason; - }); + __exports__["default"] = function rethrow(reason) { + setTimeout(function() { throw reason; - }; -}); -define('rsvp/utils', ['exports'], function (__exports__) { - 'use strict'; + }); + throw reason; + } + }); +define("rsvp/utils", + ["exports"], + function(__exports__) { + "use strict"; function objectOrFunction(x) { - return typeof x === 'function' || typeof x === 'object' && x !== null; + return typeof x === 'function' || (typeof x === 'object' && x !== null); } - __exports__.objectOrFunction = objectOrFunction; - function isFunction(x) { - return typeof x === 'function'; + + __exports__.objectOrFunction = objectOrFunction;function isFunction(x) { + return typeof x === 'function'; } - __exports__.isFunction = isFunction; - function isMaybeThenable(x) { - return typeof x === 'object' && x !== null; + + __exports__.isFunction = isFunction;function isMaybeThenable(x) { + return typeof x === 'object' && x !== null; } - __exports__.isMaybeThenable = isMaybeThenable; - var _isArray; + + __exports__.isMaybeThenable = isMaybeThenable;var _isArray; if (!Array.isArray) { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; } else { - _isArray = Array.isArray; + _isArray = Array.isArray; } + var isArray = _isArray; __exports__.isArray = isArray; // Date.now is not available in browsers < IE9 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility - var now = Date.now || function () { - return new Date().getTime(); - }; + var now = Date.now || function() { return new Date().getTime(); }; __exports__.now = now; - var o_create = Object.create || function (object) { - var o = function () { - }; - o.prototype = object; - return o; - }; + var o_create = (Object.create || function(object) { + var o = function() { }; + o.prototype = object; + return o; + }); __exports__.o_create = o_create; -}); -define('rsvp', [ - './rsvp/promise', - './rsvp/events', - './rsvp/node', - './rsvp/all', - './rsvp/all-settled', - './rsvp/race', - './rsvp/hash', - './rsvp/hash-settled', - './rsvp/rethrow', - './rsvp/defer', - './rsvp/config', - './rsvp/map', - './rsvp/resolve', - './rsvp/reject', - './rsvp/filter', - './rsvp/asap', - 'exports' -], function (__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __dependency15__, __dependency16__, __exports__) { - 'use strict'; - var Promise = __dependency1__['default']; - var EventTarget = __dependency2__['default']; - var denodeify = __dependency3__['default']; - var all = __dependency4__['default']; - var allSettled = __dependency5__['default']; - var race = __dependency6__['default']; - var hash = __dependency7__['default']; - var hashSettled = __dependency8__['default']; - var rethrow = __dependency9__['default']; - var defer = __dependency10__['default']; - var config = __dependency11__.config; - var configure = __dependency11__.configure; - var map = __dependency12__['default']; - var resolve = __dependency13__['default']; - var reject = __dependency14__['default']; - var filter = __dependency15__['default']; - var asap = __dependency16__['default']; - config.async = asap; - // default async is asap; - function async(callback, arg) { - config.async(callback, arg); - } - function on() { - config.on.apply(config, arguments); - } - function off() { - config.off.apply(config, arguments); - } - // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` - if (typeof window !== 'undefined' && typeof window.__PROMISE_INSTRUMENTATION__ === 'object') { - var callbacks = window.__PROMISE_INSTRUMENTATION__; - configure('instrument', true); - for (var eventName in callbacks) { - if (callbacks.hasOwnProperty(eventName)) { - on(eventName, callbacks[eventName]); - } - } - } - __exports__.Promise = Promise; - __exports__.EventTarget = EventTarget; - __exports__.all = all; - __exports__.allSettled = allSettled; - __exports__.race = race; - __exports__.hash = hash; - __exports__.hashSettled = hashSettled; - __exports__.rethrow = rethrow; - __exports__.defer = defer; - __exports__.denodeify = denodeify; - __exports__.configure = configure; - __exports__.on = on; - __exports__.off = off; - __exports__.resolve = resolve; - __exports__.reject = reject; - __exports__.async = async; - __exports__.map = map; - __exports__.filter = filter; -}); - + }); requireModule("ember"); })(); diff --git a/vendor/assets/ember/production/ember-data.js b/vendor/assets/ember/production/ember-data.js index d3a53927..7aff86bd 100644 --- a/vendor/assets/ember/production/ember-data.js +++ b/vendor/assets/ember/production/ember-data.js @@ -1,12 +1,5 @@ // Fetched from channel: canary, with url http://builds.emberjs.com/canary/ember-data.min.js -// Fetched on: 2014-07-01T13:19:32Z -/*! - * @overview Ember Data - * @copyright Copyright 2011-2014 Tilde Inc. and contributors. - * Portions Copyright 2011 LivingSocial Inc. - * @license Licensed under MIT license (see license.js) - * @version 1.0.0-beta.9+canary.9a5cc255 - */ -!function(a){var b,c,d,e;!function(){var a={},f={};b=function(b,c,d){a[b]={deps:c,callback:d}},e=d=c=function(b){function d(a){if("."!==a.charAt(0))return a;for(var c=a.split("/"),d=b.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(e._eak_seen=a,f[b])return f[b];if(f[b]={},!a[b])throw new Error("Could not find module "+b);for(var g,h=a[b],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:c(d(i[l])));var n=j.apply(this,k);return f[b]=g||n}}(),b("activemodel-adapter/lib/main",["./system","exports"],function(a,b){"use strict";var c=a.ActiveModelAdapter,d=a.ActiveModelSerializer,e=a.EmbeddedRecordsMixin;b.ActiveModelAdapter=c,b.ActiveModelSerializer=d,b.EmbeddedRecordsMixin=e}),b("activemodel-adapter/lib/setup-container",["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d["default"]=function(a){var b=new e(a);b.registerDeprecations([{deprecated:"serializer:_ams",valid:"serializer:-active-model"},{deprecated:"adapter:_ams",valid:"adapter:-active-model"}]),a.register("serializer:-active-model",f),a.register("adapter:-active-model",g)}}),b("activemodel-adapter/lib/system",["./system/embedded_records_mixin","./system/active_model_adapter","./system/active_model_serializer","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d.EmbeddedRecordsMixin=e,d.ActiveModelAdapter=f,d.ActiveModelSerializer=g}),b("activemodel-adapter/lib/system/active_model_adapter",["../../../ember-data/lib/adapters","../../../ember-data/lib/system/adapter","../../../ember-inflector/lib/main","./active_model_serializer","./embedded_records_mixin","exports"],function(a,b,c,d,e,f){"use strict";var g=a.RESTAdapter,h=b.InvalidError,i=c.pluralize,j=(d["default"],e["default"],Ember.EnumerableUtils.forEach),k=Ember.String.decamelize,l=Ember.String.underscore,m=g.extend({defaultSerializer:"-active-model",pathForType:function(a){var b=k(a),c=l(b);return i(c)},ajaxError:function(a){var b=this._super(a);if(a&&422===a.status){var c=Ember.$.parseJSON(a.responseText),d={};if(void 0!==c.errors){var e=c.errors;j(Ember.keys(e),function(a){d[Ember.String.camelize(a)]=e[a]})}return new h(d)}return b}});f["default"]=m}),b("activemodel-adapter/lib/system/active_model_serializer",["../../../ember-inflector/lib/main","../../../ember-data/lib/serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a.singularize,e=b["default"],f=Ember.get,g=Ember.EnumerableUtils.forEach,h=Ember.String.camelize,i=Ember.String.capitalize,j=Ember.String.decamelize,k=Ember.String.underscore,l=e.extend({keyForAttribute:function(a){return j(a)},keyForRelationship:function(a,b){return a=j(a),"belongsTo"===b?a+"_id":"hasMany"===b?d(a)+"_ids":a},serializeHasMany:Ember.K,serializeIntoHash:function(a,b,c,d){var e=k(j(b.typeKey));a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);e&&(d=this.keyForAttribute(d),b[d+"_type"]=i(e.constructor.typeKey))},normalize:function(a,b,c){return this.normalizeLinks(b),this._super(a,b,c)},normalizeLinks:function(a){if(a.links){var b=a.links;for(var c in b){var d=h(c);d!==c&&(b[d]=b[c],delete b[c])}}},normalizeRelationships:function(a,b){this.keyForRelationship&&a.eachRelationship(function(a,c){var d,e;if(c.options.polymorphic){if(d=this.keyForAttribute(a),e=b[d],e&&e.type)e.type=this.typeForRoot(e.type);else if(e&&"hasMany"===c.kind){var f=this;g(e,function(a){a.type=f.typeForRoot(a.type)})}}else d=this.keyForRelationship(a,c.kind),e=b[d];b[a]=e,a!==d&&delete b[d]},this)}});c["default"]=l}),b("activemodel-adapter/lib/system/embedded_records_mixin",["../../../ember-inflector/lib/main","exports"],function(a,b){"use strict";function c(a,b){var c=h(a,b);return c&&"always"===c.embedded}function d(a,b){var d=c(a,b),e=h(a,b);return d||e&&"records"===e.serialize}function e(a,b){var c=h(a,b);return c&&("ids"===c.serialize||"id"===c.serialize)}function f(a,b){{var c=h(a,b);d(a,b),e(a,b)}return!(c&&(c.serialize||c.embedded))}function g(a,b){var d=c(a,b),e=h(a,b),f=e&&(e.deserialize||e.serialize);return d||f}function h(a,b){return a&&(a[Ember.String.camelize(b)]||a[b])}function i(a,b,c,d,e){var f=l(a,"attrs");f&&c.eachRelationship(function(c,h){g(f,c)&&("hasMany"===h.kind&&j(a,b,c,h,d,e),"belongsTo"===h.kind&&k(a,b,c,h,d,e))})}function j(a,b,c,d,e,f){var g=b.serializerFor(d.type.typeKey),h=l(a,"primaryKey"),j=d.type.typeKey,k="_"+a.typeForRoot(d.type.typeKey),n=a.keyForRelationship(c,d.kind),o=p.call(a,c),q=[];f[o]&&(e[k]=e[k]||[],m(f[o],function(a){var c=b.modelFor(j);i(g,b,c,e,a),q.push(a[h]),e[k].push(a)}),f[n]=q,delete f[o])}function k(a,b,c,d,e,f){var h=a.get("attrs");if(h&&(g(h,Ember.String.camelize(c))||g(h,c))){var j=d.type.typeKey,k=b.serializerFor(d.type.typeKey),m=(l(k,"primaryKey"),Ember.String.pluralize(j)),n=k.keyForRelationship(c,d.kind),o=p.call(k,c);if(f[o]){e[m]=e[m]||[];var q=b.modelFor(d.type.typeKey);i(k,b,q,e,f[o]),f[n]=f[o].id,e[m].push(f[o]),f[o][d.parentType.typeKey+"_id"]=f.id,delete f[o]}}}var l=Ember.get,m=Ember.EnumerableUtils.forEach,n=(Ember.String.camelize,a.pluralize),o=Ember.Mixin.create({serializeBelongsTo:function(a,b,c){var g=c.key,h=this.get("attrs");if(f(h,g))return void this._super(a,b,c);var i=e(h,g),j=d(h,g),k=a.get(g);if(i)m=this.keyForRelationship(g,c.kind),b[m]=k?l(k,"id"):null;else if(j){var m=this.keyForRelationship(g);k?(b[m]=k.serialize({includeId:!0}),this.removeEmbeddedForeignKey(a,k,c,b[m])):b[m]=null}},serializeHasMany:function(a,b,c){var g=c.key,h=this.get("attrs");if(f(h,g))return void this._super(a,b,c);var i,j=e(h,g),k=d(h,g);j?(i=this.keyForRelationship(g,c.kind),b[i]=l(a,g).mapBy("id")):k&&(i=p.call(this,g),b[i]=l(a,g).map(function(b){var d=b.serialize({includeId:!0});return this.removeEmbeddedForeignKey(a,b,c,d),d},this))},removeEmbeddedForeignKey:function(a,b,c,d){if("hasMany"!==c.kind&&"belongsTo"===c.kind){var e=a.constructor.inverseFor(c.key);if(e){var f=e.name,g=this.store.serializerFor(b.constructor),h=g.keyForRelationship(f,e.kind);h&&delete d[h]}}},extractSingle:function(a,b,c,d){var e=b.typeKey,f=p.call(this,e),g=c[f];return i(this,a,b,c,g),this._super(a,b,c,d)},extractArray:function(a,b,c){var d=b.typeKey,e=p.call(this,d),f=c[n(e)];return m(f,function(d){i(this,a,b,c,d)},this),this._super(a,b,c)}}),p=function(a){return this.keyForAttribute?this.keyForAttribute(a):a};b["default"]=o}),b("ember-data/lib/adapters",["./adapters/fixture_adapter","./adapters/rest_adapter","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.RESTAdapter=e,c.FixtureAdapter=d}),b("ember-data/lib/adapters/fixture_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=Ember.get,d=Ember.String.fmt,e=Ember.EnumerableUtils.indexOf,f=0,g=a["default"];b["default"]=g.extend({serializer:null,simulateRemoteResponse:!0,latency:50,fixturesForType:function(a){if(a.FIXTURES){var b=Ember.A(a.FIXTURES);return b.map(function(a){var b=typeof a.id;if("number"!==b&&"string"!==b)throw new Error(d("the id property must be defined as a number or string for fixture %@",[a]));return a.id=a.id+"",a})}return null},queryFixtures:function(){},updateFixtures:function(a,b){a.FIXTURES||(a.FIXTURES=[]);var c=a.FIXTURES;this.deleteLoadedFixture(a,b),c.push(b)},mockJSON:function(a,b,c){return a.serializerFor(b).serialize(c,{includeId:!0})},generateIdForRecord:function(){return"fixture-"+f++},find:function(a,b,c){var d,e=this.fixturesForType(b);return e&&(d=Ember.A(e).findBy("id",c)),d?this.simulateRemoteCall(function(){return d},this):void 0},findMany:function(a,b,c){var d=this.fixturesForType(b);return d&&(d=d.filter(function(a){return-1!==e(c,a.id)})),d?this.simulateRemoteCall(function(){return d},this):void 0},findAll:function(a,b){var c=this.fixturesForType(b);return this.simulateRemoteCall(function(){return c},this)},findQuery:function(a,b,c){var d=this.fixturesForType(b);return d=this.queryFixtures(d,c,b),d?this.simulateRemoteCall(function(){return d},this):void 0},createRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},updateRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},deleteRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.deleteLoadedFixture(b,d),this.simulateRemoteCall(function(){return null})},deleteLoadedFixture:function(a,b){var c=this.findExistingFixture(a,b);if(c){var d=e(a.FIXTURES,c);return a.FIXTURES.splice(d,1),!0}},findExistingFixture:function(a,b){var d=this.fixturesForType(a),e=c(b,"id");return this.findFixtureById(d,e)},findFixtureById:function(a,b){return Ember.A(a).find(function(a){return""+c(a,"id")==""+b?!0:!1})},simulateRemoteCall:function(a,b){var d=this;return new Ember.RSVP.Promise(function(e){c(d,"simulateRemoteResponse")?Ember.run.later(function(){e(a.call(b))},c(d,"latency")):Ember.run.schedule("actions",null,function(){e(a.call(b))})},"DS: FixtureAdapter#simulateRemoteCall")}})}),b("ember-data/lib/adapters/rest_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=Ember.ArrayPolyfills.forEach;b["default"]=c.extend({defaultSerializer:"-rest",find:function(a,b,c){return this.ajax(this.buildURL(b.typeKey,c),"GET")},findAll:function(a,b,c){var d;return c&&(d={since:c}),this.ajax(this.buildURL(b.typeKey),"GET",{data:d})},findQuery:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:c})},findMany:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:{ids:c}})},findHasMany:function(a,b,c){var e=d(this,"host"),f=d(b,"id"),g=b.constructor.typeKey;return e&&"/"===c.charAt(0)&&"/"!==c.charAt(1)&&(c=e+c),this.ajax(this.urlPrefix(c,this.buildURL(g,f)),"GET")},findBelongsTo:function(a,b,c){var e=d(b,"id"),f=b.constructor.typeKey;return this.ajax(this.urlPrefix(c,this.buildURL(f,e)),"GET")},createRecord:function(a,b,c){var d={},e=a.serializerFor(b.typeKey);return e.serializeIntoHash(d,b,c,{includeId:!0}),this.ajax(this.buildURL(b.typeKey),"POST",{data:d})},updateRecord:function(a,b,c){var e={},f=a.serializerFor(b.typeKey);f.serializeIntoHash(e,b,c);var g=d(c,"id");return this.ajax(this.buildURL(b.typeKey,g),"PUT",{data:e})},deleteRecord:function(a,b,c){var e=d(c,"id");return this.ajax(this.buildURL(b.typeKey,e),"DELETE")},buildURL:function(a,b){var c=[],e=d(this,"host"),f=this.urlPrefix();return a&&c.push(this.pathForType(a)),b&&c.push(b),f&&c.unshift(f),c=c.join("/"),!e&&c&&(c="/"+c),c},urlPrefix:function(a,b){var c=d(this,"host"),e=d(this,"namespace"),f=[];return a?"/"===a.charAt(0)?c&&(a=a.slice(1),f.push(c)):/^http(s)?:\/\//.test(a)||f.push(b):(c&&f.push(c),e&&f.push(e)),a&&f.push(a),f.join("/")},pathForType:function(a){var b=Ember.String.camelize(a);return Ember.String.pluralize(b)},ajaxError:function(a){return a&&"object"==typeof a&&(a.then=null),a},ajax:function(a,b,c){var d=this;return new Ember.RSVP.Promise(function(e,f){c=d.ajaxOptions(a,b,c),c.success=function(a){Ember.run(null,e,a)},c.error=function(a){Ember.run(null,f,d.ajaxError(a))},Ember.$.ajax(c)},"DS: RESTAdapter#ajax "+b+" to "+a)},ajaxOptions:function(a,b,c){c=c||{},c.url=a,c.type=b,c.dataType="json",c.context=this,c.data&&"GET"!==b&&(c.contentType="application/json; charset=utf-8",c.data=JSON.stringify(c.data));var f=d(this,"headers");return void 0!==f&&(c.beforeSend=function(a){e.call(Ember.keys(f),function(b){a.setRequestHeader(b,f[b])})}),c}})}),b("ember-data/lib/core",["exports"],function(a){"use strict";var b;"undefined"==typeof b&&(b=Ember.Namespace.create({VERSION:"1.0.0-beta.9+canary.9a5cc255"}),Ember.libraries&&Ember.libraries.registerCoreLibrary("Ember Data",b.VERSION)),a["default"]=b}),b("ember-data/lib/ember-initializer",["./setup-container"],function(a){"use strict";var b=a["default"],c=Ember.K;Ember.onLoad("Ember.Application",function(a){a.initializer({name:"ember-data",initialize:b}),a.initializer({name:"store",after:"ember-data",initialize:c}),a.initializer({name:"activeModelAdapter",before:"store",initialize:c}),a.initializer({name:"transforms",before:"store",initialize:c}),a.initializer({name:"data-adapter",before:"store",initialize:c}),a.initializer({name:"injectStore",before:"store",initialize:c})})}),b("ember-data/lib/ext/date",[],function(){"use strict";Ember.Date=Ember.Date||{};var a=Date.parse,b=[1,4,5,6,7,10,11];Ember.Date.parse=function(c){var d,e,f=0;if(e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(c)){for(var g,h=0;g=b[h];++h)e[g]=+e[g]||0;e[2]=(+e[2]||1)-1,e[3]=+e[3]||1,"Z"!==e[8]&&void 0!==e[9]&&(f=60*e[10]+e[11],"+"===e[9]&&(f=0-f)),d=Date.UTC(e[1],e[2],e[3],e[4],e[5]+f,e[6],e[7])}else d=a?a(c):0/0;return d},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Date)&&(Date.parse=Ember.Date.parse)}),b("ember-data/lib/initializers/data_adapter",["../system/debug/debug_adapter","exports"],function(a,b){"use strict";var c=a["default"];b["default"]=function(a){a.register("data-adapter:main",c)}}),b("ember-data/lib/initializers/store",["../serializers","../adapters","../system/container_proxy","../system/store","exports"],function(a,b,c,d,e){"use strict";var f=a.JSONSerializer,g=a.RESTSerializer,h=b.RESTAdapter,i=c["default"],j=d["default"];e["default"]=function(a,b){a.register("store:main",a.lookupFactory("store:application")||b&&b.Store||j);var c=new i(a);c.registerDeprecations([{deprecated:"serializer:_default",valid:"serializer:-default"},{deprecated:"serializer:_rest",valid:"serializer:-rest"},{deprecated:"adapter:_rest",valid:"adapter:-rest"}]),a.register("serializer:-default",f),a.register("serializer:-rest",g),a.register("adapter:-rest",h),a.lookup("store:main")}}),b("ember-data/lib/initializers/store_injections",["exports"],function(a){"use strict";a["default"]=function(a){a.injection("controller","store","store:main"),a.injection("route","store","store:main"),a.injection("serializer","store","store:main"),a.injection("data-adapter","store","store:main")}}),b("ember-data/lib/initializers/transforms",["../transforms","exports"],function(a,b){"use strict";var c=a.BooleanTransform,d=a.DateTransform,e=a.StringTransform,f=a.NumberTransform;b["default"]=function(a){a.register("transform:boolean",c),a.register("transform:date",d),a.register("transform:number",f),a.register("transform:string",e)}}),b("ember-data/lib/main",["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./ember-initializer","./setup-container","./system/container_proxy","exports"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){"use strict";Ember.RSVP.Promise.cast=Ember.RSVP.Promise.cast||Ember.RSVP.resolve;var u=a["default"],v=c.Store,w=c.PromiseArray,x=c.PromiseObject,y=d.Model,z=d.Errors,A=d.RootState,B=d.attr,C=e.AttributeChange,D=e.RelationshipChange,E=e.RelationshipChangeAdd,F=(e.RelationshipChangeRemove,e.OneToManyChange),G=(e.ManyToNoneChange,e.OneToOneChange),H=e.ManyToManyChange,I=f.InvalidError,J=f.Adapter,K=g["default"],L=h.RecordArray,M=h.FilteredRecordArray,N=h.AdapterPopulatedRecordArray,O=h.ManyArray,P=i["default"],Q=j.RESTAdapter,R=j.FixtureAdapter,S=k["default"],T=l["default"],U=n.ActiveModelAdapter,V=n.ActiveModelSerializer,W=n.EmbeddedRecordsMixin,X=o.Transform,Y=o.DateTransform,Z=o.NumberTransform,$=o.StringTransform,_=o.BooleanTransform,ab=p.hasMany,bb=p.belongsTo,cb=r["default"],db=s["default"];u.Store=v,u.PromiseArray=w,u.PromiseObject=x,u.Model=y,u.RootState=A,u.attr=B,u.Errors=z,u.AttributeChange=C,u.RelationshipChange=D,u.RelationshipChangeAdd=E,u.OneToManyChange=F,u.ManyToNoneChange=F,u.OneToOneChange=G,u.ManyToManyChange=H,u.Adapter=J,u.InvalidError=I,u.DebugAdapter=K,u.RecordArray=L,u.FilteredRecordArray=M,u.AdapterPopulatedRecordArray=N,u.ManyArray=O,u.RecordArrayManager=P,u.RESTAdapter=Q,u.FixtureAdapter=R,u.RESTSerializer=T,u.JSONSerializer=S,u.Transform=X,u.DateTransform=Y,u.StringTransform=$,u.NumberTransform=Z,u.BooleanTransform=_,u.ActiveModelAdapter=U,u.ActiveModelSerializer=V,u.EmbeddedRecordsMixin=W,u.belongsTo=bb,u.hasMany=ab,u.ContainerProxy=db,u._setupContainer=cb,Ember.lookup.DS=u,t["default"]=u}),b("ember-data/lib/serializers",["./serializers/json_serializer","./serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.JSONSerializer=d,c.RESTSerializer=e}),b("ember-data/lib/serializers/json_serializer",["../system/changes","exports"],function(a,b){"use strict";var c=a.RelationshipChange,d=Ember.get,e=(Ember.set,Ember.isNone),f=Ember.ArrayPolyfills.map;b["default"]=Ember.Object.extend({primaryKey:"id",applyTransforms:function(a,b){return a.eachTransformedAttribute(function(a,c){var d=this.transformFor(c);b[a]=d.deserialize(b[a])},this),b},normalize:function(a,b){return b?(this.normalizeId(b),this.normalizeUsingDeclaredMapping(a,b),this.applyTransforms(a,b),b):b},normalizeUsingDeclaredMapping:function(a,b){var c,e,f=d(this,"attrs");if(f)for(e in f)c=f[e],c&&c.key&&(c=c.key),"string"==typeof c&&(b[e]=b[c],delete b[c])},normalizeId:function(a){var b=d(this,"primaryKey");"id"!==b&&(a.id=a[b],delete a[b])},serialize:function(a,b){var c={};if(b&&b.includeId){var e=d(a,"id");e&&(c[d(this,"primaryKey")]=e)}return a.eachAttribute(function(b,d){this.serializeAttribute(a,c,b,d)},this),a.eachRelationship(function(b,d){"belongsTo"===d.kind?this.serializeBelongsTo(a,c,d):"hasMany"===d.kind&&this.serializeHasMany(a,c,d)},this),c},serializeAttribute:function(a,b,c,e){var f=d(this,"attrs"),g=d(a,c),h=e.type;if(h){var i=this.transformFor(h);g=i.serialize(g)}c=f&&f[c]||(this.keyForAttribute?this.keyForAttribute(c):c),b[c]=g},serializeBelongsTo:function(a,b,c){var f=c.key,g=d(a,f);f=this.keyForRelationship?this.keyForRelationship(f,"belongsTo"):f,b[f]=e(g)?g:d(g,"id"),c.options.polymorphic&&this.serializePolymorphicType(a,b,c)},serializeHasMany:function(a,b,e){var f=e.key,g=this.keyForRelationship?this.keyForRelationship(f,"hasMany"):f,h=c.determineRelationshipType(a.constructor,e);("manyToNone"===h||"manyToMany"===h)&&(b[g]=d(a,f).mapBy("id"))},serializePolymorphicType:Ember.K,extract:function(a,b,c,d,e){this.extractMeta(a,b,c);var f="extract"+e.charAt(0).toUpperCase()+e.substr(1);return this[f](a,b,c,d,e)},extractFindAll:function(a,b,c){return this.extractArray(a,b,c)},extractFindQuery:function(a,b,c){return this.extractArray(a,b,c)},extractFindMany:function(a,b,c){return this.extractArray(a,b,c)},extractFindHasMany:function(a,b,c){return this.extractArray(a,b,c)},extractCreateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractUpdateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractDeleteRecord:function(a,b,c){return this.extractSave(a,b,c)},extractFind:function(a,b,c){return this.extractSingle(a,b,c)},extractFindBelongsTo:function(a,b,c){return this.extractSingle(a,b,c)},extractSave:function(a,b,c){return this.extractSingle(a,b,c)},extractSingle:function(a,b,c){return this.normalize(b,c)},extractArray:function(a,b,c){var d=this;return f.call(c,function(a){return d.normalize(b,a)})},extractMeta:function(a,b,c){c&&c.meta&&(a.metaForType(b,c.meta),delete c.meta)},transformFor:function(a){var b=this.container.lookup("transform:"+a);return b}})}),b("ember-data/lib/serializers/rest_serializer",["./json_serializer","ember-inflector/lib/system/string","exports"],function(a,b,c){"use strict";function d(a){return null==a?null:a+""}var e=a["default"],f=Ember.get,g=(Ember.set,Ember.ArrayPolyfills.forEach),h=Ember.ArrayPolyfills.map,i=Ember.String.camelize,j=b.singularize;c["default"]=e.extend({normalize:function(a,b,c){return this.normalizeId(b),this.normalizeAttributes(a,b),this.normalizeRelationships(a,b),this.normalizeUsingDeclaredMapping(a,b),this.normalizeHash&&this.normalizeHash[c]&&this.normalizeHash[c](b),this.applyTransforms(a,b),b},normalizePayload:function(a){return a},normalizeAttributes:function(a,b){var c;this.keyForAttribute&&a.eachAttribute(function(a){c=this.keyForAttribute(a),a!==c&&(b[a]=b[c],delete b[c])},this)},normalizeRelationships:function(a,b){var c;this.keyForRelationship&&a.eachRelationship(function(a,d){c=this.keyForRelationship(a,d.kind),a!==c&&(b[a]=b[c],delete b[c])},this)},extractSingle:function(a,b,c,e){var f,h=this.normalizePayload(c),i=b.typeKey;for(var j in h){var k=this.typeForRoot(j),l=a.modelFor(k),m=l.typeKey===i,n=h[j];m&&"array"!==Ember.typeOf(n)?f=this.normalize(b,n,j):g.call(n,function(b){var c=this.typeForRoot(j),g=a.modelFor(c),h=a.serializerFor(g);b=h.normalize(g,b,j);var i=m&&!e&&!f,k=m&&d(b.id)===e;i||k?f=b:a.push(c,b)},this)}return f},extractArray:function(a,b,c){var d,e=this.normalizePayload(c),f=b.typeKey;for(var g in e){var i=g,j=!1;"_"===g.charAt(0)&&(j=!0,i=g.substr(1));var k=this.typeForRoot(i),l=a.modelFor(k),m=a.serializerFor(l),n=!j&&l.typeKey===f,o=h.call(e[g],function(a){return m.normalize(l,a,g)},this);n?d=o:a.pushMany(k,o)}return d},pushPayload:function(a,b){var c=this.normalizePayload(b);for(var d in c){var e=this.typeForRoot(d),f=a.modelFor(e),g=a.serializerFor(f),i=h.call(Ember.makeArray(c[d]),function(a){return g.normalize(f,a,d)},this);a.pushMany(e,i)}},typeForRoot:function(a){return i(j(a))},serialize:function(){return this._super.apply(this,arguments)},serializeIntoHash:function(a,b,c,d){a[b.typeKey]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);d=this.keyForAttribute?this.keyForAttribute(d):d,b[d+"Type"]=e.constructor.typeKey}})}),b("ember-data/lib/setup-container",["./initializers/store","./initializers/transforms","./initializers/store_injections","./initializers/data_adapter","../../../activemodel-adapter/lib/setup-container","exports"],function(a,b,c,d,e,f){"use strict";var g=a["default"],h=b["default"],i=c["default"],j=d["default"],k=e["default"];f["default"]=function(a,b){j(a,b),h(a,b),i(a,b),g(a,b),k(a,b)}}),b("ember-data/lib/system/adapter",["exports"],function(a){"use strict";function b(a){var b=Error.prototype.constructor.call(this,"The backend rejected the commit because it was invalid: "+Ember.inspect(a));this.errors=a;for(var c=0,d=e.length;d>c;c++)this[e[c]]=b[e[c]]}var c=Ember.get,d=(Ember.set,Ember.ArrayPolyfills.map),e=["description","fileName","lineNumber","message","name","number","stack"];b.prototype=Ember.create(Error.prototype);var f=Ember.Object.extend({find:Ember.required(Function),findAll:null,findQuery:null,generateIdForRecord:null,serialize:function(a,b){return c(a,"store").serializerFor(a.constructor.typeKey).serialize(a,b)},createRecord:Ember.required(Function),updateRecord:Ember.required(Function),deleteRecord:Ember.required(Function),findMany:function(a,b,c){var e=d.call(c,function(c){return this.find(a,b,c)},this);return Ember.RSVP.all(e)}});a.InvalidError=b,a.Adapter=f,a["default"]=f}),b("ember-data/lib/system/changes",["./changes/relationship_change","exports"],function(a,b){"use strict";var c=a.RelationshipChange,d=a.RelationshipChangeAdd,e=a.RelationshipChangeRemove,f=a.OneToManyChange,g=a.ManyToNoneChange,h=a.OneToOneChange,i=a.ManyToManyChange;b.RelationshipChange=c,b.RelationshipChangeAdd=d,b.RelationshipChangeRemove=e,b.OneToManyChange=f,b.ManyToNoneChange=g,b.OneToOneChange=h,b.ManyToManyChange=i}),b("ember-data/lib/system/changes/relationship_change",["../model","exports"],function(a,b){"use strict";function c(a){j.call(this,a)}function d(a){j.call(this,a)}function e(a){return"object"==typeof a&&(!a.then||"function"!=typeof a.then)}var f=a.Model,g=Ember.get,h=Ember.set,i=Ember.EnumerableUtils.forEach,j=function(a){this.parentRecord=a.parentRecord,this.childRecord=a.childRecord,this.firstRecord=a.firstRecord,this.firstRecordKind=a.firstRecordKind,this.firstRecordName=a.firstRecordName,this.secondRecord=a.secondRecord,this.secondRecordKind=a.secondRecordKind,this.secondRecordName=a.secondRecordName,this.changeType=a.changeType,this.store=a.store,this.committed={}};j.create=function(a){return new j(a)},c.create=function(a){return new c(a)},d.create=function(a){return new d(a)};var k={},l={},m={},n={},o={};j._createChange=function(a){return"add"===a.changeType?c.create(a):"remove"===a.changeType?d.create(a):void 0},j.determineRelationshipType=function(a,b){var c,d,e=b.key,f=b.kind,g=a.inverseFor(e);return g&&(c=g.name,d=g.kind),g?"belongsTo"===d?"belongsTo"===f?"oneToOne":"manyToOne":"belongsTo"===f?"oneToMany":"manyToMany":"belongsTo"===f?"oneToNone":"manyToNone"},j.createChange=function(a,b,c,d){var e,f=a.constructor;return e=j.determineRelationshipType(f,d),"oneToMany"===e?k.createChange(a,b,c,d):"manyToOne"===e?k.createChange(b,a,c,d):"oneToNone"===e?l.createChange(a,b,c,d):"manyToNone"===e?m.createChange(a,b,c,d):"oneToOne"===e?n.createChange(a,b,c,d):"manyToMany"===e?o.createChange(a,b,c,d):void 0},l.createChange=function(a,b,c,d){var e=d.key,f=j._createChange({parentRecord:b,childRecord:a,firstRecord:a,store:c,changeType:d.changeType,firstRecordName:e,firstRecordKind:"belongsTo"});return c.addRelationshipChangeFor(a,e,b,null,f),f},m.createChange=function(a,b,c,d){var e=d.key,f=j._createChange({parentRecord:a,childRecord:b,secondRecord:a,store:c,changeType:d.changeType,secondRecordName:d.key,secondRecordKind:"hasMany"});return c.addRelationshipChangeFor(a,e,b,null,f),f},o.createChange=function(a,b,c,d){var e=d.key,f=j._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"hasMany",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.createChange=function(a,b,c,d){var e;d.parentType?e=d.parentType.inverseFor(d.key).name:d.key&&(e=d.key);var f=j._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"belongsTo",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&b.recordIsMaterialized(c)){var e=g(c,d);if(e){var f=n.createChange(c,e,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,null,f),f.sync()}}},k.createChange=function(a,b,c,d){var e;d.parentType?(e=d.parentType.inverseFor(d.key).name,k.maintainInvariant(d,c,a,e)):d.key&&(e=d.key);var f=j._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,f.getSecondRecordName(),f),f},k.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&c){var e=g(c,d);if(e){var f=k.createChange(c,e,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,f.getSecondRecordName(),f),f.sync()}}},j.prototype={getSecondRecordName:function(){var a,b=this.secondRecordName;if(!b){if(a=this.secondRecord,!a)return;var c=this.firstRecord.constructor,d=c.inverseFor(this.firstRecordName);this.secondRecordName=d.name}return this.secondRecordName},getFirstRecordName:function(){var a=this.firstRecordName;return a},destroy:function(){var a=this.childRecord,b=this.getFirstRecordName(),c=this.getSecondRecordName(),d=this.store;d.removeRelationshipChangeFor(a,b,this.parentRecord,c,this.changeType)},getSecondRecord:function(){return this.secondRecord},getFirstRecord:function(){return this.firstRecord},coalesce:function(){var a=this.store.relationshipChangePairsFor(this.firstRecord);i(a,function(a){var b=a.add,c=a.remove;b&&c&&(b.destroy(),c.destroy())})}},c.prototype=Ember.create(j.create({})),d.prototype=Ember.create(j.create({})),c.prototype.changeType="add",c.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),c=this.getFirstRecord(),d=this.getSecondRecord();d instanceof f&&c instanceof f&&("belongsTo"===this.secondRecordKind?d.suspendRelationshipObservers(function(){h(d,a,c)}):"hasMany"===this.secondRecordKind&&d.suspendRelationshipObservers(function(){var b=g(d,a);e(b)&&b.addObject(c)})),c instanceof f&&d instanceof f&&g(c,b)!==d&&("belongsTo"===this.firstRecordKind?c.suspendRelationshipObservers(function(){h(c,b,d)}):"hasMany"===this.firstRecordKind&&c.suspendRelationshipObservers(function(){var a=g(c,b);e(a)&&a.addObject(d)})),this.coalesce()},d.prototype.changeType="remove",d.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),c=this.getFirstRecord(),d=this.getSecondRecord();d instanceof f&&c instanceof f&&("belongsTo"===this.secondRecordKind?d.suspendRelationshipObservers(function(){h(d,a,null)}):"hasMany"===this.secondRecordKind&&d.suspendRelationshipObservers(function(){var b=g(d,a);e(b)&&b.removeObject(c)})),c instanceof f&&g(c,b)&&("belongsTo"===this.firstRecordKind?c.suspendRelationshipObservers(function(){h(c,b,null)}):"hasMany"===this.firstRecordKind&&c.suspendRelationshipObservers(function(){var a=g(c,b);e(a)&&a.removeObject(d)})),this.coalesce()},b.RelationshipChange=j,b.RelationshipChangeAdd=c,b.RelationshipChangeRemove=d,b.OneToManyChange=k,b.ManyToNoneChange=m,b.OneToOneChange=n,b.ManyToManyChange=o}),b("ember-data/lib/system/container_proxy",["exports"],function(a){"use strict";function b(a){this.container=a}b.prototype.aliasedFactory=function(a,b){var c=this;return{create:function(){return b&&b(),c.container.lookup(a)}}},b.prototype.registerAlias=function(a,b,c){var d=this.aliasedFactory(b,c);return this.container.register(a,d)},b.prototype.registerDeprecation=function(a,b){var c=function(){};return this.registerAlias(a,b,c)},b.prototype.registerDeprecations=function(a){for(var b=a.length;b>0;b--){var c=a[b-1],d=c.deprecated,e=c.valid;this.registerDeprecation(d,e)}},a["default"]=b}),b("ember-data/lib/system/debug",["./debug/debug_info","./debug/debug_adapter","exports"],function(a,b,c){"use strict";var d=b["default"];c["default"]=d}),b("ember-data/lib/system/debug/debug_adapter",["../model","exports"],function(a,b){"use strict";var c=a.Model,d=Ember.get,e=Ember.String.capitalize,f=Ember.String.underscore;b["default"]=Ember.DataAdapter.extend({getFilters:function(){return[{name:"isNew",desc:"New"},{name:"isModified",desc:"Modified"},{name:"isClean",desc:"Clean"}]},detect:function(a){return a!==c&&c.detect(a)},columnsForType:function(a){var b=[{name:"id",desc:"Id"}],c=0,g=this;return d(a,"attributes").forEach(function(a){if(c++>g.attributeLimit)return!1;var d=e(f(a).replace("_"," "));b.push({name:a,desc:d})}),b},getRecords:function(a){return this.get("store").all(a)},getRecordColumnValues:function(a){var b=this,c=0,e={id:d(a,"id")};return a.eachAttribute(function(f){if(c++>b.attributeLimit)return!1;var g=d(a,f);e[f]=g}),e},getRecordKeywords:function(a){var b=[],c=Ember.A(["id"]);return a.eachAttribute(function(a){c.push(a)}),c.forEach(function(c){b.push(d(a,c))}),b},getRecordFilterValues:function(a){return{isNew:a.get("isNew"),isModified:a.get("isDirty")&&!a.get("isNew"),isClean:!a.get("isDirty")}},getRecordColor:function(a){var b="black";return a.get("isNew")?b="green":a.get("isDirty")&&(b="blue"),b},observeRecord:function(a,b){var c=Ember.A(),d=this,e=Ember.A(["id","isNew","isDirty"]);a.eachAttribute(function(a){e.push(a)}),e.forEach(function(e){var f=function(){b(d.wrapRecord(a))};Ember.addObserver(a,e,f),c.push(function(){Ember.removeObserver(a,e,f)})});var f=function(){c.forEach(function(a){a()})};return f}})}),b("ember-data/lib/system/debug/debug_info",["../model","exports"],function(a,b){"use strict";var c=a.Model;c.reopen({_debugInfo:function(){var a=["id"],b={belongsTo:[],hasMany:[]},c=[]; -this.eachAttribute(function(b){a.push(b)},this),this.eachRelationship(function(a,d){b[d.kind].push(a),c.push(a)});var d=[{name:"Attributes",properties:a,expand:!0},{name:"Belongs To",properties:b.belongsTo,expand:!0},{name:"Has Many",properties:b.hasMany,expand:!0},{name:"Flags",properties:["isLoaded","isDirty","isSaving","isDeleted","isError","isNew","isValid"]}];return{propertyInfo:{includeOtherProperties:!0,groups:d,expensiveProperties:c}}}}),b["default"]=c}),b("ember-data/lib/system/model",["./model/model","./model/attributes","./model/states","./model/errors","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.Model=f,e.RootState=h,e.attr=g,e.Errors=i}),b("ember-data/lib/system/model/attributes",["./model","exports"],function(a,b){"use strict";function c(a,b){return"function"==typeof b.defaultValue?b.defaultValue.apply(null,arguments):b.defaultValue}function d(a,b){return a._attributes.hasOwnProperty(b)||a._inFlightAttributes.hasOwnProperty(b)||a._data.hasOwnProperty(b)}function e(a,b){return a._attributes.hasOwnProperty(b)?a._attributes[b]:a._inFlightAttributes.hasOwnProperty(b)?a._inFlightAttributes[b]:a._data[b]}var f=a["default"],g=Ember.get;f.reopenClass({attributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isAttribute&&(c.name=b,a.set(b,c))}),a}),transformedAttributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachAttribute(function(b,c){c.type&&a.set(b,c.type)}),a}),eachAttribute:function(a,b){g(this,"attributes").forEach(function(c,d){a.call(b,c,d)},b)},eachTransformedAttribute:function(a,b){g(this,"transformedAttributes").forEach(function(c,d){a.call(b,c,d)})}}),f.reopen({eachAttribute:function(a,b){this.constructor.eachAttribute(a,b)}}),b["default"]=function(a,b){b=b||{};var f={type:a,isAttribute:!0,options:b};return Ember.computed("data",function(a,f){if(arguments.length>1){var g=e(this,a);return f!==g&&(this._attributes[a]=f,this.send("didSetProperty",{name:a,oldValue:g,originalValue:this._data[a],value:f})),f}return d(this,a)?e(this,a):c(this,b,a)}).meta(f)}}),b("ember-data/lib/system/model/errors",["exports"],function(a){"use strict";var b=Ember.get,c=Ember.isEmpty,d=Ember.EnumerableUtils.map;a["default"]=Ember.Object.extend(Ember.Enumerable,Ember.Evented,{registerHandlers:function(a,b,c){this.on("becameInvalid",a,b),this.on("becameValid",a,c)},errorsByAttributeName:Ember.reduceComputed("content",{initialValue:function(){return Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}})},addedItem:function(a,b){return a.get(b.attribute).pushObject(b),a},removedItem:function(a,b){return a.get(b.attribute).removeObject(b),a}}),errorsFor:function(a){return b(this,"errorsByAttributeName").get(a)},messages:Ember.computed.mapBy("content","message"),content:Ember.computed(function(){return Ember.A()}),unknownProperty:function(a){var b=this.errorsFor(a);return c(b)?null:b},nextObject:function(a){return b(this,"content").objectAt(a)},length:Ember.computed.oneWay("content.length").readOnly(),isEmpty:Ember.computed.not("length").readOnly(),add:function(a,c){var d=b(this,"isEmpty");c=this._findOrCreateMessages(a,c),b(this,"content").addObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),d&&!b(this,"isEmpty")&&this.trigger("becameInvalid")},_findOrCreateMessages:function(a,b){var c=this.errorsFor(a);return d(Ember.makeArray(b),function(b){return c.findBy("message",b)||{attribute:a,message:b}})},remove:function(a){if(!b(this,"isEmpty")){var c=b(this,"content").rejectBy("attribute",a);b(this,"content").setObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),b(this,"isEmpty")&&this.trigger("becameValid")}},clear:function(){b(this,"isEmpty")||(b(this,"content").clear(),this.enumerableContentDidChange(),this.trigger("becameValid"))},has:function(a){return!c(this.errorsFor(a))}})}),b("ember-data/lib/system/model/model",["./states","./errors","../store","exports"],function(a,b,d,e){"use strict";var f,g=a["default"],h=b["default"],i=d.PromiseObject,j=Ember.get,k=Ember.set,l=Ember.merge,m=Ember.RSVP.Promise,n=Ember.computed("currentState",function(a){return j(j(this,"currentState"),a)}).readOnly(),o=Ember.Object.extend(Ember.Evented,{_recordArrays:void 0,_relationships:void 0,_loadingRecordArrays:void 0,isEmpty:n,isLoading:n,isLoaded:n,isDirty:n,isSaving:n,isDeleted:n,isNew:n,isValid:n,dirtyType:n,isError:!1,isReloading:!1,clientId:null,id:null,currentState:g.empty,errors:Ember.computed(function(){var a=h.create();return a.registerHandlers(this,function(){this.send("becameInvalid")},function(){this.send("becameValid")}),a}).readOnly(),serialize:function(a){var b=j(this,"store");return b.serialize(this,a)},toJSON:function(a){f||(f=c("ember-data/lib/serializers/json_serializer")["default"]);var b=f.create({container:this.container});return b.serialize(this,a)},didLoad:Ember.K,didUpdate:Ember.K,didCreate:Ember.K,didDelete:Ember.K,becameInvalid:Ember.K,becameError:Ember.K,data:Ember.computed(function(){return this._data=this._data||{},this._data}).readOnly(),_data:null,init:function(){this._super(),this._setup()},_setup:function(){this._changesToSync={},this._deferredTriggers=[],this._data={},this._attributes={},this._inFlightAttributes={},this._relationships={}},send:function(a,b){var c=j(this,"currentState");return c[a]||this._unhandledEvent(c,a,b),c[a](this,b)},transitionTo:function(a){var b=a.split(".",1),c=j(this,"currentState"),d=c;do d.exit&&d.exit(this),d=d.parentState;while(!d.hasOwnProperty(b));var e,f,g=a.split("."),h=[],i=[];for(e=0,f=g.length;f>e;e++)d=d[g[e]],d.enter&&i.push(d),d.setup&&h.push(d);for(e=0,f=i.length;f>e;e++)i[e].enter(this);for(k(this,"currentState",d),e=0,f=h.length;f>e;e++)h[e].setup(this);this.updateRecordArraysLater()},_unhandledEvent:function(a,b,c){var d="Attempted to handle event `"+b+"` ";throw d+="on "+String(this)+" while in state ",d+=a.stateName+". ",void 0!==c&&(d+="Called with "+Ember.inspect(c)+"."),new Ember.Error(d)},withTransaction:function(a){var b=j(this,"transaction");b&&a(b)},loadingData:function(a){this.send("loadingData",a)},loadedData:function(){this.send("loadedData")},notFound:function(){this.send("notFound")},pushedData:function(){this.send("pushedData")},deleteRecord:function(){this.send("deleteRecord")},destroyRecord:function(){return this.deleteRecord(),this.save()},unloadRecord:function(){this.isDestroyed||this.send("unloadRecord")},clearRelationships:function(){this.eachRelationship(function(a,b){if("belongsTo"===b.kind)k(this,a,null);else if("hasMany"===b.kind){var c=this._relationships[a];c&&c.destroy()}},this)},updateRecordArrays:function(){this._updatingRecordArraysLater=!1,j(this,"store").dataWasUpdated(this.constructor,this)},changedAttributes:function(){var a,b=j(this,"_data"),c=j(this,"_attributes"),d={};for(a in c)d[a]=[b[a],c[a]];return d},adapterWillCommit:function(){this.send("willCommit")},adapterDidCommit:function(a){k(this,"isError",!1),a?this._data=a:Ember.mixin(this._data,this._inFlightAttributes),this._inFlightAttributes={},this.send("didCommit"),this.updateRecordArraysLater(),a&&this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},adapterDidDirty:function(){this.send("becomeDirty"),this.updateRecordArraysLater()},dataDidChange:Ember.observer(function(){this.reloadHasManys()},"data"),reloadHasManys:function(){var a=j(this.constructor,"relationshipsByName");this.updateRecordArraysLater(),a.forEach(function(a,b){this._data.links&&this._data.links[a]||"hasMany"===b.kind&&this.hasManyDidChange(b.key)},this)},hasManyDidChange:function(a){var b=this._relationships[a];if(b){var c=this._data[a]||[];k(b,"content",Ember.A(c)),k(b,"isLoaded",!0),b.trigger("didLoad")}},updateRecordArraysLater:function(){this._updatingRecordArraysLater||(this._updatingRecordArraysLater=!0,Ember.run.schedule("actions",this,this.updateRecordArrays))},setupData:function(a,b){b?Ember.merge(this._data,a):this._data=a;var c=this._relationships;this.eachRelationship(function(b,d){a.links&&a.links[b]||d.options.async&&(c[b]=null)}),a&&this.pushedData(),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},materializeId:function(a){k(this,"id",a)},materializeAttributes:function(a){l(this._data,a)},materializeAttribute:function(a,b){this._data[a]=b},updateHasMany:function(a,b){this._data[a]=b,this.hasManyDidChange(a)},updateBelongsTo:function(a,b){this._data[a]=b},rollback:function(){this._attributes={},j(this,"isError")&&(this._inFlightAttributes={},k(this,"isError",!1)),j(this,"isValid")||(this._inFlightAttributes={}),this.send("rolledBack"),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},toStringExtension:function(){return j(this,"id")},suspendRelationshipObservers:function(a,b){var c=j(this.constructor,"relationshipNames").belongsTo,d=this;try{this._suspendedRelationships=!0,Ember._suspendObservers(d,c,null,"belongsToDidChange",function(){Ember._suspendBeforeObservers(d,c,null,"belongsToWillChange",function(){a.call(b||d)})})}finally{this._suspendedRelationships=!1}},save:function(){var a="DS: Model#save "+this,b=Ember.RSVP.defer(a);return this.get("store").scheduleSave(this,b),this._inFlightAttributes=this._attributes,this._attributes={},i.create({promise:b.promise})},reload:function(){k(this,"isReloading",!0);var a=this,b="DS: Model#reload of "+this,c=new m(function(b){a.send("reloadRecord",b)},b).then(function(){return a.set("isReloading",!1),a.set("isError",!1),a},function(b){throw a.set("isError",!0),b},"DS: Model#reload complete, update flags");return i.create({promise:c})},adapterDidUpdateAttribute:function(a,b){void 0!==b?(this._data[a]=b,this.notifyPropertyChange(a)):this._data[a]=this._inFlightAttributes[a],this.updateRecordArraysLater()},adapterDidInvalidate:function(a){function b(b){a[b]&&c.add(b,a[b])}var c=j(this,"errors");this.eachAttribute(b),this.eachRelationship(b)},adapterDidError:function(){this.send("becameError"),k(this,"isError",!0)},trigger:function(a){Ember.tryInvoke(this,a,[].slice.call(arguments,1)),this._super.apply(this,arguments)},triggerLater:function(){1===this._deferredTriggers.push(arguments)&&Ember.run.schedule("actions",this,"_triggerDeferredTriggers")},_triggerDeferredTriggers:function(){for(var a=0,b=this._deferredTriggers.length;b>a;a++)this.trigger.apply(this,this._deferredTriggers[a]);this._deferredTriggers.length=0},willDestroy:function(){this._super(),this.clearRelationships()}});o.reopenClass({_create:o.create,create:function(){throw new Ember.Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.")}}),e["default"]=o}),b("ember-data/lib/system/model/states",["exports"],function(a){"use strict";function b(a,b){b.value===b.originalValue?(delete a._attributes[b.name],a.send("propertyWasReset",b.name)):b.value!==b.oldValue&&a.send("becomeDirty"),a.updateRecordArraysLater()}function c(a){var b,d={};for(var e in a)b=a[e],d[e]=b&&"object"==typeof b?c(b):b;return d}function d(a,b){for(var c in b)a[c]=b[c];return a}function e(a){var b=c(j);return d(b,a)}function f(){}function g(a,b,c){a=d(b?Ember.create(b):{},a),a.parentState=b,a.stateName=c;for(var e in a)a.hasOwnProperty(e)&&"parentState"!==e&&"stateName"!==e&&"object"==typeof a[e]&&(a[e]=g(a[e],a,c+"."+e));return a}var h=Ember.get,i=Ember.set,j={initialState:"uncommitted",isDirty:!0,uncommitted:{didSetProperty:b,propertyWasReset:function(a){var b=!1;for(var c in a._attributes){b=!0;break}b||a.send("rolledBack")},pushedData:Ember.K,becomeDirty:Ember.K,willCommit:function(a){a.transitionTo("inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},rolledBack:function(a){a.transitionTo("loaded.saved")},becameInvalid:function(a){a.transitionTo("invalid")},rollback:function(a){a.rollback()}},inFlight:{isSaving:!0,didSetProperty:b,becomeDirty:Ember.K,pushedData:Ember.K,unloadRecord:function(){},willCommit:Ember.K,didCommit:function(a){var b=h(this,"dirtyType");a.transitionTo("saved"),a.send("invokeLifecycleCallbacks",b)},becameInvalid:function(a){a.transitionTo("invalid"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},invalid:{isValid:!1,deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},didSetProperty:function(a,c){h(a,"errors").remove(c.name),b(a,c)},becomeDirty:Ember.K,willCommit:function(a){h(a,"errors").clear(),a.transitionTo("inFlight")},rolledBack:function(a){h(a,"errors").clear()},becameValid:function(a){a.transitionTo("uncommitted")},invokeLifecycleCallbacks:function(a){a.triggerLater("becameInvalid",a)},exit:function(a){a._inFlightAttributes={}}}},k=e({dirtyType:"created",isNew:!0});k.uncommitted.rolledBack=function(a){a.transitionTo("deleted.saved")};var l=e({dirtyType:"updated"});k.uncommitted.deleteRecord=function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},k.uncommitted.rollback=function(a){j.uncommitted.rollback.apply(this,arguments),a.transitionTo("deleted.saved")},k.uncommitted.propertyWasReset=Ember.K,l.inFlight.unloadRecord=f,l.uncommitted.deleteRecord=function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()};var m={isEmpty:!1,isLoading:!1,isLoaded:!1,isDirty:!1,isSaving:!1,isDeleted:!1,isNew:!1,isValid:!0,rolledBack:Ember.K,unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},propertyWasReset:Ember.K,empty:{isEmpty:!0,loadingData:function(a,b){a._loadingPromise=b,a.transitionTo("loading")},loadedData:function(a){a.transitionTo("loaded.created.uncommitted"),a.suspendRelationshipObservers(function(){a.notifyPropertyChange("data")})},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad")}},loading:{isLoading:!0,exit:function(a){a._loadingPromise=null},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad"),i(a,"isError",!1)},becameError:function(a){a.triggerLater("becameError",a)},notFound:function(a){a.transitionTo("empty")}},loaded:{initialState:"saved",isLoaded:!0,saved:{setup:function(a){var b=a._attributes,c=!1;for(var d in b)if(b.hasOwnProperty(d)){c=!0;break}c&&a.adapterDidDirty()},didSetProperty:b,pushedData:Ember.K,becomeDirty:function(a){a.transitionTo("updated.uncommitted")},willCommit:function(a){a.transitionTo("updated.inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},didCommit:function(a){a.send("invokeLifecycleCallbacks",h(a,"lastDirtyType"))},notFound:Ember.K},created:k,updated:l},deleted:{initialState:"uncommitted",dirtyType:"deleted",isDeleted:!0,isLoaded:!0,isDirty:!0,setup:function(a){a.updateRecordArrays()},uncommitted:{willCommit:function(a){a.transitionTo("inFlight")},rollback:function(a){a.rollback()},becomeDirty:Ember.K,deleteRecord:Ember.K,rolledBack:function(a){a.transitionTo("loaded.saved")}},inFlight:{isSaving:!0,unloadRecord:f,willCommit:Ember.K,didCommit:function(a){a.transitionTo("saved"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},saved:{isDirty:!1,setup:function(a){var b=h(a,"store");b.dematerializeRecord(a)},invokeLifecycleCallbacks:function(a){a.triggerLater("didDelete",a),a.triggerLater("didCommit",a)},willCommit:Ember.K,didCommit:Ember.K}},invokeLifecycleCallbacks:function(a,b){"created"===b?a.triggerLater("didCreate",a):a.triggerLater("didUpdate",a),a.triggerLater("didCommit",a)}};m=g(m,null,"root"),a["default"]=m}),b("ember-data/lib/system/record_array_manager",["./record_arrays","exports"],function(a,b){"use strict";function c(a){for(var b=[],c=Ember.keys(a),d=0;dd;d++)c=c.concat(a[d]);return c}var f=a.RecordArray,g=a.FilteredRecordArray,h=a.AdapterPopulatedRecordArray,i=a.ManyArray,j=Ember.get,k=(Ember.set,Ember.EnumerableUtils.forEach);b["default"]=Ember.Object.extend({init:function(){this.filteredRecordArrays=Ember.MapWithDefault.create({defaultValue:function(){return[]}}),this.changedRecords=[],this._adapterPopulatedRecordArrays=[]},recordDidChange:function(a){1===this.changedRecords.push(a)&&Ember.run.schedule("actions",this,this.updateRecordArrays)},recordArraysForRecord:function(a){return a._recordArrays=a._recordArrays||Ember.OrderedSet.create(),a._recordArrays},updateRecordArrays:function(){k(this.changedRecords,function(a){j(a,"isDeleted")?this._recordWasDeleted(a):this._recordWasChanged(a)},this),this.changedRecords.length=0},_recordWasDeleted:function(a){var b=a._recordArrays;b&&k(b,function(b){b.removeRecord(a)})},_recordWasChanged:function(a){var b,c=a.constructor,d=this.filteredRecordArrays.get(c);k(d,function(d){b=j(d,"filterFunction"),this.updateRecordArray(d,b,c,a)},this);var e=a._loadingRecordArrays;if(e){for(var f=0,g=e.length;g>f;f++)e[f].loadedRecord();a._loadingRecordArrays=[]}},updateRecordArray:function(a,b,c,d){var e;e=b?b(d):!0;var f=this.recordArraysForRecord(d);e?(f.add(a),a.addRecord(d)):e||(f.remove(a),a.removeRecord(d))},updateFilter:function(a,b,c){for(var d,e=this.store.typeMapFor(b),f=e.records,g=0,h=f.length;h>g;g++)d=f[g],j(d,"isDeleted")||j(d,"isEmpty")||this.updateRecordArray(a,c,b,d)},createManyArray:function(a,b){var c=i.create({type:a,content:b,store:this.store});return k(b,function(a){var b=this.recordArraysForRecord(a);b.add(c)},this),c},createRecordArray:function(a){var b=f.create({type:a,content:Ember.A(),store:this.store,isLoaded:!0});return this.registerFilteredRecordArray(b,a),b},createFilteredRecordArray:function(a,b,c){var d=g.create({query:c,type:a,content:Ember.A(),store:this.store,manager:this,filterFunction:b});return this.registerFilteredRecordArray(d,a,b),d},createAdapterPopulatedRecordArray:function(a,b){var c=h.create({type:a,query:b,content:Ember.A(),store:this.store,manager:this});return this._adapterPopulatedRecordArrays.push(c),c},registerFilteredRecordArray:function(a,b,c){var d=this.filteredRecordArrays.get(b);d.push(a),this.updateFilter(a,b,c)},registerWaitingRecordArray:function(a,b){var c=a._loadingRecordArrays||[];c.push(b),a._loadingRecordArrays=c},willDestroy:function(){this._super(),k(e(c(this.filteredRecordArrays.values)),d),k(this._adapterPopulatedRecordArrays,d)}})}),b("ember-data/lib/system/record_arrays",["./record_arrays/record_array","./record_arrays/filtered_record_array","./record_arrays/adapter_populated_record_array","./record_arrays/many_array","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.RecordArray=f,e.FilteredRecordArray=g,e.AdapterPopulatedRecordArray=h,e.ManyArray=i}),b("ember-data/lib/system/record_arrays/adapter_populated_record_array",["./record_array","exports"],function(a,b){"use strict";{var c=a["default"],d=Ember.get;Ember.set}b["default"]=c.extend({query:null,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a server query (on "+a+") is immutable.")},load:function(a){var b=d(this,"store"),c=d(this,"type"),e=b.pushMany(c,a),f=b.metadataFor(c);this.setProperties({content:Ember.A(e),isLoaded:!0,meta:Ember.copy(f)}),e.forEach(function(a){this.manager.recordArraysForRecord(a).add(this)},this),Ember.run.once(this,"trigger","didLoad")}})}),b("ember-data/lib/system/record_arrays/filtered_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get;b["default"]=c.extend({filterFunction:null,isLoaded:!0,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a client-side filter (on "+a+") is immutable.")},_updateFilter:function(){var a=d(this,"manager");a.updateFilter(this,d(this,"type"),d(this,"filterFunction"))},updateFilter:Ember.observer(function(){Ember.run.once(this,this._updateFilter)},"filterFunction")})}),b("ember-data/lib/system/record_arrays/many_array",["./record_array","../changes","exports"],function(a,b,c){"use strict";function d(a){a.sync()}var e=a["default"],f=b.RelationshipChange,g=Ember.get,h=Ember.set,i=Ember.EnumerableUtils.map;c["default"]=e.extend({init:function(){this._super.apply(this,arguments),this._changesToSync=Ember.OrderedSet.create()},name:null,owner:null,isPolymorphic:!1,isLoaded:!1,promise:null,loadingRecordsCount:function(a){this.loadingRecordsCount=a},loadedRecord:function(){this.loadingRecordsCount--,0===this.loadingRecordsCount&&(h(this,"isLoaded",!0),this.trigger("didLoad"))},fetch:function(){var a=g(this,"content"),b=g(this,"store"),c=g(this,"owner"),d=a.filterBy("isEmpty",!0);b.fetchMany(d,c)},replaceContent:function(a,b,c){c=i(c,function(a){return a},this),this._super(a,b,c)},arrangedContentDidChange:function(){Ember.run.once(this,"fetch")},arrayContentWillChange:function(a,b){var c=g(this,"owner"),d=g(this,"name");if(!c._suspendedRelationships)for(var e=a;a+b>e;e++){var h=g(this,"content").objectAt(e),i=f.createChange(c,h,g(this,"store"),{parentType:c.constructor,changeType:"remove",kind:"hasMany",key:d});this._changesToSync.add(i)}return this._super.apply(this,arguments)},arrayContentDidChange:function(a,b,c){this._super.apply(this,arguments);var e=g(this,"owner"),h=g(this,"name"),i=g(this,"store");if(!e._suspendedRelationships){for(var j=a;a+c>j;j++){var k=g(this,"content").objectAt(j),l=f.createChange(e,k,i,{parentType:e.constructor,changeType:"add",kind:"hasMany",key:h});l.hasManyName=h,this._changesToSync.add(l)}this._changesToSync.forEach(d),this._changesToSync.clear()}},createRecord:function(a){var b,c=g(this,"owner"),d=g(c,"store"),e=g(this,"type");return b=d.createRecord.call(d,e,a),this.pushObject(b),b}})}),b("ember-data/lib/system/record_arrays/record_array",["../store","exports"],function(a,b){"use strict";{var c=a.PromiseArray,d=Ember.get;Ember.set}b["default"]=Ember.ArrayProxy.extend(Ember.Evented,{type:null,content:null,isLoaded:!1,isUpdating:!1,store:null,objectAtContent:function(a){var b=d(this,"content");return b.objectAt(a)},update:function(){if(!d(this,"isUpdating")){var a=d(this,"store"),b=d(this,"type");return a.fetchAll(b,this)}},addRecord:function(a){d(this,"content").addObject(a)},removeRecord:function(a){d(this,"content").removeObject(a)},save:function(){var a="DS: RecordArray#save "+d(this,"type"),b=Ember.RSVP.all(this.invoke("save"),a).then(function(a){return Ember.A(a)},null,"DS: RecordArray#save apply Ember.NativeArray");return c.create({promise:b})},_dissociateFromOwnRecords:function(){var a=this;this.forEach(function(b){var c=b._recordArrays;c&&c.remove(a)})},willDestroy:function(){this._dissociateFromOwnRecords(),this._super()}})}),b("ember-data/lib/system/relationship-meta",["../../../ember-inflector/lib/system","exports"],function(a,b){"use strict";function c(a,b){var c,d;return c=b.type||b.key,"string"==typeof c?("hasMany"===b.kind&&(c=e(c)),d=a.modelFor(c)):d=b.type,d}function d(a,b){return{key:b.key,kind:b.kind,type:c(a,b),options:b.options,parentType:b.parentType,isRelationship:!0}}var e=a.singularize;b.typeForRelationshipMeta=c,b.relationshipFromMeta=d}),b("ember-data/lib/system/relationships",["./relationships/belongs_to","./relationships/has_many","../system/relationships/ext","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"];d.belongsTo=e,d.hasMany=f}),b("ember-data/lib/system/relationships/belongs_to",["../model","../store","../changes","../relationship-meta","exports"],function(a,b,c,d,e){"use strict";function f(a,b,c){return Ember.computed("data",function(a,b){var d,e=h(this,"data"),f=h(this,"store"),g="DS: Async belongsTo "+this+" : "+a;if(c.key=a,2===arguments.length)return void 0===b?null:l.create({promise:j.cast(b,g)});var k=e.links&&e.links[a],m=e[a];return i(m)?k?(d=f.findBelongsTo(this,k,n(f,c)),l.create({promise:d})):null:(d=f.fetchRecord(m)||j.cast(m,g),l.create({promise:d}))}).meta(c)}function g(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c={type:a,isRelationship:!0,options:b,kind:"belongsTo",key:null};return b.async?f(a,b,c):Ember.computed("data",function(b,c){var d,e,f=h(this,"data"),g=h(this,"store");return e="string"==typeof a?g.modelFor(a):a,2===arguments.length?void 0===c?null:c:(d=f[b],i(d)?null:(g.fetchRecord(d),d))}).meta(c)}{var h=Ember.get,i=(Ember.set,Ember.isNone),j=Ember.RSVP.Promise,k=a.Model,l=b.PromiseObject,m=c.RelationshipChange,n=d.relationshipFromMeta;d.typeForRelationshipMeta}k.reopen({belongsToWillChange:Ember.beforeObserver(function(a,b){if(h(a,"isLoaded")){var c=h(a,b);if(c){var d=h(a,"store"),e=m.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"remove"});e.sync(),this._changesToSync[b]=e}}}),belongsToDidChange:Ember.immediateObserver(function(a,b){if(h(a,"isLoaded")){var c=h(a,b);if(c){var d=h(a,"store"),e=m.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"add"});e.sync()}}delete this._changesToSync[b]})}),e["default"]=g}),b("ember-data/lib/system/relationships/ext",["../../../../ember-inflector/lib/system","../relationship-meta","../model"],function(a,b,c){"use strict";{var d=(a.singularize,b.typeForRelationshipMeta),e=b.relationshipFromMeta,f=c.Model,g=Ember.get;Ember.set}f.reopen({didDefineProperty:function(a,b,c){if(c instanceof Ember.Descriptor){var d=c.meta();d.isRelationship&&"belongsTo"===d.kind&&(Ember.addObserver(a,b,null,"belongsToDidChange"),Ember.addBeforeObserver(a,b,null,"belongsToWillChange")),d.parentType=a.constructor}}}),f.reopenClass({typeForRelationship:function(a){var b=g(this,"relationshipsByName").get(a);return b&&b.type},inverseFor:function(a){function b(a,c,d){d=d||[];var e=g(c,"relationships");if(e){var f=e.get(a);return f&&d.push.apply(d,e.get(a)),a.superclass&&b(a.superclass,c,d),d}}var c=this.typeForRelationship(a);if(!c)return null;var d=this.metaForProperty(a).options;if(null===d.inverse)return null;var e,f,h;if(d.inverse)e=d.inverse,h=Ember.get(c,"relationshipsByName").get(e),f=h.kind;else{var i=b(this,c);if(0===i.length)return null;e=i[0].name,f=i[0].kind}return{type:c,name:e,kind:f}},relationships:Ember.computed(function(){var a=new Ember.MapWithDefault({defaultValue:function(){return[]}});return this.eachComputedProperty(function(b,c){if(c.isRelationship){c.key=b;var e=a.get(d(this.store,c));e.push({name:b,kind:c.kind})}}),a}).cacheable(!1),relationshipNames:Ember.computed(function(){var a={hasMany:[],belongsTo:[]};return this.eachComputedProperty(function(b,c){c.isRelationship&&a[c.kind].push(b)}),a}),relatedTypes:Ember.computed(function(){var a,b=Ember.A();return this.eachComputedProperty(function(c,e){e.isRelationship&&(e.key=c,a=d(this.store,e),b.contains(a)||b.push(a))}),b}).cacheable(!1),relationshipsByName:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){if(c.isRelationship){c.key=b;var f=e(this.store,c);f.type=d(this.store,c),a.set(b,f)}}),a}).cacheable(!1),fields:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isRelationship?a.set(b,c.kind):c.isAttribute&&a.set(b,"attribute")}),a}),eachRelationship:function(a,b){g(this,"relationshipsByName").forEach(function(c,d){a.call(b,c,d)})},eachRelatedType:function(a,b){g(this,"relatedTypes").forEach(function(c){a.call(b,c)})}}),f.reopen({eachRelationship:function(a,b){this.constructor.eachRelationship(a,b)}})}),b("ember-data/lib/system/relationships/has_many",["../store","../relationship-meta","exports"],function(a,b,c){"use strict";function d(a,b,c){return Ember.computed("data",function(a){var d=this._relationships[a],f="DS: Async hasMany "+this+" : "+a;if(c.key=a,!d){var g=Ember.RSVP.defer(f);d=e(this,a,b,function(b,d){var e,f=d.links&&d.links[a];return e=f?b.findHasMany(this,f,i(b,c),g):b.findMany(this,d[a],j(b,c),g),l(e,"promise",g.promise),e})}var k=d.get("promise").then(function(){return d},null,"DS: Async hasMany records received");return h.create({promise:k})}).meta(c).readOnly()}function e(a,b,c,d){var e=a._relationships;if(e[b])return e[b];var f=k(a,"data"),g=k(a,"store"),h=e[b]=d.call(a,g,f);return m(h,{owner:a,name:b,isPolymorphic:c.polymorphic})}function f(a,b){b=b||{};var c={type:a,isRelationship:!0,options:b,kind:"hasMany",key:null};return b.async?d(a,b,c):Ember.computed("data",function(a){return e(this,a,b,function(b,d){d[a];return b.findMany(this,d[a],j(b,c))})}).meta(c).readOnly()}function g(a,b){return"object"==typeof a&&(b=a,a=void 0),f(a,b)}var h=a.PromiseArray,i=b.relationshipFromMeta,j=b.typeForRelationshipMeta,k=Ember.get,l=Ember.set,m=Ember.setProperties;c["default"]=g}),b("ember-data/lib/system/store",["./adapter","ember-inflector/lib/system/string","exports"],function(a,b,d){"use strict";function e(a){return null==a?null:a+""}function f(a,b,c,d){return b.eachRelationship(function(b,e){if(c.links&&c.links[b])return void(d&&e.options.async&&(d._relationships[b]=null));var f=e.kind,h=c[b];null!=h&&("belongsTo"===f?g(a,c,b,e,h):"hasMany"===f&&(i(a,c,b,e,h),j(d,b,h)))}),c}function g(a,b,d,e,f){if(B||(B=c("ember-data/lib/system/model").Model),!(H(f)||f instanceof B)){var g;"number"==typeof f||"string"==typeof f?(g=h(e,d,b),b[d]=a.recordForId(g,f)):"object"==typeof f&&(b[d]=a.recordForId(f.type,f.id))}}function h(a,b,c){return a.options.polymorphic?c[b+"Type"]:a.type}function i(a,b,c,d,e){for(var f=0,h=e.length;h>f;f++)g(a,e,f,d,e[f])}function j(a,b,c){if(a){var d=k(Ember.A(c),a.get(b).filterBy("isNew"));Ember.A(c).pushObjects(d)}}function k(a,b){var c=a.mapBy("id");return b.reject(function(a){return Ember.A(c).contains(a.id)})}function l(a,b){return y.create({promise:L.cast(a,b)})}function m(a,b){return z.create({promise:L.cast(a,b)})}function n(a,b,c){return a.lookup("serializer:"+b)||a.lookup("serializer:application")||a.lookup("serializer:"+c)||a.lookup("serializer:-default")}function o(a){return a.lookup("serializer:application")||a.lookup("serializer:-default")}function p(a,b){var c=a.serializer,d=a.defaultSerializer,e=a.container;return e&&void 0===c&&(c=n(e,b.typeKey,d)),(null===c||void 0===c)&&(c={extract:function(a,b,c){return c}}),c}function q(a,b,c,d){var e=a.find(b,c,d),f=p(a,c),g="DS: Handle Adapter#find of "+c+" with id: "+d;return L.cast(e,g).then(function(a){var e=f.extract(b,c,a,d,"find");return b.push(c,e)},function(a){var e=b.getById(c,d);throw e.notFound(),a},"DS: Extract payload of '"+c+"'")}function r(a,b,c,d,e){var f=a.findMany(b,c,d,e),g=p(a,c),h="DS: Handle Adapter#findMany of "+c;return L.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findMany");b.pushMany(c,d)},null,"DS: Extract payload of "+c)}function s(a,b,c,d,e){var f=a.findHasMany(b,c,d,e),g=p(a,e.type),h="DS: Handle Adapter#findHasMany of "+c+" : "+e.type;return L.cast(f,h).then(function(a){var d=g.extract(b,e.type,a,null,"findHasMany"),f=b.pushMany(e.type,d);c.updateHasMany(e.key,f)},null,"DS: Extract payload of "+c+" : hasMany "+e.type)}function t(a,b,c,d,e){var f=a.findBelongsTo(b,c,d,e),g=p(a,e.type),h="DS: Handle Adapter#findBelongsTo of "+c+" : "+e.type;return L.cast(f,h).then(function(a){var c=g.extract(b,e.type,a,null,"findBelongsTo"),d=b.push(e.type,c);return d.updateBelongsTo(e.key,d),d},null,"DS: Extract payload of "+c+" : "+e.type)}function u(a,b,c,d){var e=a.findAll(b,c,d),f=p(a,c),g="DS: Handle Adapter#findAll of "+c;return L.cast(e,g).then(function(a){var d=f.extract(b,c,a,null,"findAll");return b.pushMany(c,d),b.didUpdateAll(c),b.all(c)},null,"DS: Extract payload of findAll "+c)}function v(a,b,c,d,e){var f=a.findQuery(b,c,d,e),g=p(a,c),h="DS: Handle Adapter#findQuery of "+c;return L.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findQuery");return e.load(d),e},null,"DS: Extract payload of findQuery "+c)}function w(a,b,c,d){var e=d.constructor,f=a[c](b,e,d),g=p(a,e),h="DS: Extract and notify about "+c+" completion of "+d;return f.then(function(a){var f;return f=a?g.extract(b,e,a,E(d,"id"),c):a,b.didSaveRecord(d,f),d},function(a){throw a instanceof C?b.recordWasInvalid(d,a.errors):b.recordWasError(d,a),a -},h)}var x,y,z,A,B,C=a.InvalidError,D=(a.Adapter,b.singularize),E=Ember.get,F=Ember.set,G=Ember.run.once,H=Ember.isNone,I=Ember.EnumerableUtils.forEach,J=Ember.EnumerableUtils.indexOf,K=Ember.EnumerableUtils.map,L=Ember.RSVP.Promise,M=Ember.copy,N=Ember.String.camelize;x=Ember.Object.extend({init:function(){A||(A=c("ember-data/lib/system/record_array_manager")["default"]),this.typeMaps={},this.recordArrayManager=A.create({store:this}),this._relationshipChanges={},this._pendingSave=[]},adapter:"-rest",serialize:function(a,b){return this.serializerFor(a.constructor.typeKey).serialize(a,b)},defaultAdapter:Ember.computed("adapter",function(){var a=E(this,"adapter");return"string"==typeof a&&(a=this.container.lookup("adapter:"+a)||this.container.lookup("adapter:application")||this.container.lookup("adapter:-rest")),DS.Adapter.detect(a)&&(a=a.create({container:this.container})),a}),createRecord:function(a,b){var c=this.modelFor(a),d=M(b)||{};H(d.id)&&(d.id=this._generateId(c)),d.id=e(d.id);var f=this.buildRecord(c,d.id);return f.loadedData(),f.setProperties(d),f},_generateId:function(a){var b=this.adapterFor(a);return b&&b.generateIdForRecord?b.generateIdForRecord(this):null},deleteRecord:function(a){a.deleteRecord()},unloadRecord:function(a){a.unloadRecord()},find:function(a,b){return 1===arguments.length?this.findAll(a):"object"===Ember.typeOf(b)?this.findQuery(a,b):this.findById(a,e(b))},findById:function(a,b){var c=this.modelFor(a),d=this.recordForId(c,b),e=this.fetchRecord(d);return l(e||d,"DS: Store#findById "+c+" with id: "+b)},findByIds:function(a,b){var c=this;return m(Ember.RSVP.all(K(b,function(b){return c.findById(a,b)})).then(Ember.A,null,"DS: Store#findByIds of "+a+" complete"))},fetchRecord:function(a){if(H(a))return null;if(a._loadingPromise)return a._loadingPromise;if(!E(a,"isEmpty"))return null;var b=a.constructor,c=E(a,"id"),d=this.adapterFor(b),e=q(d,this,b,c);return a.loadingData(e),e},getById:function(a,b){return this.hasRecordForId(a,b)?this.recordForId(a,b):null},reloadRecord:function(a){var b=a.constructor,c=this.adapterFor(b),d=E(a,"id");return q(c,this,b,d)},fetchMany:function(a,b){if(!a.length)return Ember.RSVP.resolve(a);var c=Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}});I(a,function(a){c.get(a.constructor).push(a)});var d=[];return I(c,function(a,c){var e=c.mapBy("id"),f=this.adapterFor(a);d.push(r(f,this,a,e,b))},this),Ember.RSVP.all(d)},hasRecordForId:function(a,b){var c=this.modelFor(a),d=e(b);return!!this.typeMapFor(c).idToRecord[d]},recordForId:function(a,b){var c=this.modelFor(a),d=e(b),f=this.typeMapFor(c).idToRecord,g=f[d];return g&&f.hasOwnProperty(d)||(g=this.buildRecord(c,d)),g},findMany:function(a,b,c,d){var e=this.modelFor(c),f=Ember.A(b),g=f.filterBy("isEmpty",!0),h=this.recordArrayManager.createManyArray(e,f);return I(g,function(a){a.loadingData()}),h.loadingRecordsCount=g.length,g.length?(I(g,function(a){this.recordArrayManager.registerWaitingRecordArray(a,h)},this),d.resolve(this.fetchMany(g,a))):(d&&d.resolve(),h.set("isLoaded",!0),G(h,"trigger","didLoad")),h},findHasMany:function(a,b,c,d){var e=this.adapterFor(a.constructor),f=this.recordArrayManager.createManyArray(c.type,Ember.A([]));return d.resolve(s(e,this,a,b,c)),f},findBelongsTo:function(a,b,c){var d=this.adapterFor(a.constructor);return t(d,this,a,b,c)},findQuery:function(a,b){var c=this.modelFor(a),d=this.recordArrayManager.createAdapterPopulatedRecordArray(c,b),e=this.adapterFor(c);return m(v(e,this,c,b,d))},findAll:function(a){var b=this.modelFor(a);return this.fetchAll(b,this.all(b))},fetchAll:function(a,b){var c=this.adapterFor(a),d=this.typeMapFor(a).metadata.since;return F(b,"isUpdating",!0),m(u(c,this,a,d))},didUpdateAll:function(a){var b=this.typeMapFor(a).findAllCache;F(b,"isUpdating",!1)},all:function(a){var b=this.modelFor(a),c=this.typeMapFor(b),d=c.findAllCache;if(d)return d;var e=this.recordArrayManager.createRecordArray(b);return c.findAllCache=e,e},unloadAll:function(a){for(var b,c=this.modelFor(a),d=this.typeMapFor(c),e=d.records.slice(),f=0;fa?"0"+a:""+a}var d=a["default"];b["default"]=d.extend({deserialize:function(a){var b=typeof a;return"string"===b?new Date(Ember.Date.parse(a)):"number"===b?new Date(a):null===a||void 0===a?a:null},serialize:function(a){if(a instanceof Date){var b=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],e=a.getUTCFullYear(),f=a.getUTCMonth(),g=a.getUTCDate(),h=a.getUTCDay(),i=a.getUTCHours(),j=a.getUTCMinutes(),k=a.getUTCSeconds(),l=b[h],m=c(g),n=d[f];return l+", "+m+" "+n+" "+e+" "+c(i)+":"+c(j)+":"+c(k)+" GMT"}return null}})}),b("ember-data/lib/transforms/number",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isEmpty;b["default"]=c.extend({deserialize:function(a){return d(a)?null:Number(a)},serialize:function(a){return d(a)?null:Number(a)}})}),b("ember-data/lib/transforms/string",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isNone;b["default"]=c.extend({deserialize:function(a){return d(a)?null:String(a)},serialize:function(a){return d(a)?null:String(a)}})}),b("ember-inflector/lib/ext/string",["../system/string"],function(a){"use strict";var b=a.pluralize,c=a.singularize;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.pluralize=function(){return b(this)},String.prototype.singularize=function(){return c(this)})}),b("ember-inflector/lib/main",["./system","./ext/string","exports"],function(a,b,c){"use strict";var d=a.Inflector,e=a.defaultRules,f=a.pluralize,g=a.singularize;d.defaultRules=e,Ember.Inflector=d,Ember.String.pluralize=f,Ember.String.singularize=g,c["default"]=d,c.pluralize=f,c.singularize=g}),b("ember-inflector/lib/system",["./system/inflector","./system/string","./system/inflections","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b.pluralize,g=b.singularize,h=c["default"];e.inflector=new e(h),d.Inflector=e,d.singularize=g,d.pluralize=f,d.defaultRules=h}),b("ember-inflector/lib/system/inflections",["exports"],function(a){"use strict";var b={plurals:[[/$/,"s"],[/s$/i,"s"],[/^(ax|test)is$/i,"$1es"],[/(octop|vir)us$/i,"$1i"],[/(octop|vir)i$/i,"$1i"],[/(alias|status)$/i,"$1es"],[/(bu)s$/i,"$1ses"],[/(buffal|tomat)o$/i,"$1oes"],[/([ti])um$/i,"$1a"],[/([ti])a$/i,"$1a"],[/sis$/i,"ses"],[/(?:([^f])fe|([lr])f)$/i,"$1$2ves"],[/(hive)$/i,"$1s"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/(x|ch|ss|sh)$/i,"$1es"],[/(matr|vert|ind)(?:ix|ex)$/i,"$1ices"],[/^(m|l)ouse$/i,"$1ice"],[/^(m|l)ice$/i,"$1ice"],[/^(ox)$/i,"$1en"],[/^(oxen)$/i,"$1"],[/(quiz)$/i,"$1zes"]],singular:[[/s$/i,""],[/(ss)$/i,"$1"],[/(n)ews$/i,"$1ews"],[/([ti])a$/i,"$1um"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i,"$1sis"],[/(^analy)(sis|ses)$/i,"$1sis"],[/([^f])ves$/i,"$1fe"],[/(hive)s$/i,"$1"],[/(tive)s$/i,"$1"],[/([lr])ves$/i,"$1f"],[/([^aeiouy]|qu)ies$/i,"$1y"],[/(s)eries$/i,"$1eries"],[/(m)ovies$/i,"$1ovie"],[/(x|ch|ss|sh)es$/i,"$1"],[/^(m|l)ice$/i,"$1ouse"],[/(bus)(es)?$/i,"$1"],[/(o)es$/i,"$1"],[/(shoe)s$/i,"$1"],[/(cris|test)(is|es)$/i,"$1is"],[/^(a)x[ie]s$/i,"$1xis"],[/(octop|vir)(us|i)$/i,"$1us"],[/(alias|status)(es)?$/i,"$1"],[/^(ox)en/i,"$1"],[/(vert|ind)ices$/i,"$1ex"],[/(matr)ices$/i,"$1ix"],[/(quiz)zes$/i,"$1"],[/(database)s$/i,"$1"]],irregularPairs:[["person","people"],["man","men"],["child","children"],["sex","sexes"],["move","moves"],["cow","kine"],["zombie","zombies"]],uncountable:["equipment","information","rice","money","species","series","fish","sheep","jeans","police"]};a["default"]=b}),b("ember-inflector/lib/system/inflector",["exports"],function(a){"use strict";function b(a,b){for(var c=0,d=b.length;d>c;c++)a.uncountable[b[c].toLowerCase()]=!0}function c(a,b){for(var c,d=0,e=b.length;e>d;d++)c=b[d],a.irregular[c[0].toLowerCase()]=c[1],a.irregularInverse[c[1].toLowerCase()]=c[0]}function d(a){a=a||{},a.uncountable=a.uncountable||{},a.irregularPairs=a.irregularPairs||{};var d=this.rules={plurals:a.plurals||[],singular:a.singular||[],irregular:{},irregularInverse:{},uncountable:{}};b(d,a.uncountable),c(d,a.irregularPairs)}var e=/^\s*$/;d.prototype={plural:function(a,b){this.rules.plurals.push([a,b.toLowerCase()])},singular:function(a,b){this.rules.singular.push([a,b.toLowerCase()])},uncountable:function(a){b(this.rules,[a.toLowerCase()])},irregular:function(a,b){c(this.rules,[[a,b]])},pluralize:function(a){return this.inflect(a,this.rules.plurals,this.rules.irregular)},singularize:function(a){return this.inflect(a,this.rules.singular,this.rules.irregularInverse)},inflect:function(a,b,c){var d,f,g,h,i,j,k,l;if(i=e.test(a))return a;if(h=a.toLowerCase(),j=this.rules.uncountable[h])return a;if(k=c&&c[h])return k;for(var m=b.length,n=0;m>n&&(d=b[m-1],l=d[0],!l.test(a));m--);return d=d||[],l=d[0],f=d[1],g=a.replace(l,f)}},a["default"]=d}),b("ember-inflector/lib/system/string",["./inflector","exports"],function(a,b){"use strict";var c=a["default"],d=function(a){return c.inflector.pluralize(a)},e=function(a){return c.inflector.singularize(a)};b.pluralize=d,b.singularize=e}),a.DS=c("ember-data/lib/main")["default"]}(Ember.lookup); +// Fetched on: 2014-08-07T09:19:41Z +(function(e){var r,t,i,a;(function(){var e;if(!Array.isArray){e=function(e){return Object.prototype.toString.call(e)==="[object Array]"}}else{e=Array.isArray}var n={},s={},o={};var d=false;r=function(r,t,i){if(!e(t)){i=t;t=[]}n[r]={deps:t,callback:i}};function u(e,r,t){var a=e.length;var n=new Array(a);var s;var o;for(var d=0,u=a;d0;r--){t=e[r-1];i=t["deprecated"];a=t["valid"];this.registerDeprecation(i,a)}};e["default"]=r});r("ember-data/system/debug",["ember-data/system/debug/debug_info","ember-data/system/debug/debug_adapter","exports"],function(e,r,t){"use strict";var i=r["default"];t["default"]=i});r("ember-data/system/debug/debug_adapter",["ember-data/system/model","exports"],function(e,r){"use strict";var t=e.Model;var i=Ember.get;var a=Ember.String.capitalize;var n=Ember.String.underscore;r["default"]=Ember.DataAdapter.extend({getFilters:function(){return[{name:"isNew",desc:"New"},{name:"isModified",desc:"Modified"},{name:"isClean",desc:"Clean"}]},detect:function(e){return e!==t&&t.detect(e)},columnsForType:function(e){var r=[{name:"id",desc:"Id"}];var t=0;var s=this;i(e,"attributes").forEach(function(e,i){if(t++>s.attributeLimit){return false}var o=a(n(e).replace("_"," "));r.push({name:e,desc:o})});return r},getRecords:function(e){return this.get("store").all(e)},getRecordColumnValues:function(e){var r=this,t=0;var a={id:i(e,"id")};e.eachAttribute(function(n){if(t++>r.attributeLimit){return false}var s=i(e,n);a[n]=s});return a},getRecordKeywords:function(e){var r=[];var t=Ember.A(["id"]);e.eachAttribute(function(e){t.push(e)});t.forEach(function(t){r.push(i(e,t))});return r},getRecordFilterValues:function(e){return{isNew:e.get("isNew"),isModified:e.get("isDirty")&&!e.get("isNew"),isClean:!e.get("isDirty")}},getRecordColor:function(e){var r="black";if(e.get("isNew")){r="green"}else if(e.get("isDirty")){r="blue"}return r},observeRecord:function(e,r){var t=Ember.A(),i=this;var a=Ember.A(["id","isNew","isDirty"]);e.eachAttribute(function(e){a.push(e)});a.forEach(function(a){var n=function(){r(i.wrapRecord(e))};Ember.addObserver(e,a,n);t.push(function(){Ember.removeObserver(e,a,n)})});var n=function(){t.forEach(function(e){e()})};return n}})});r("ember-data/system/debug/debug_info",["ember-data/system/model","exports"],function(e,r){"use strict";var t=e.Model;t.reopen({_debugInfo:function(){var e=["id"],r={belongsTo:[],hasMany:[]},t=[];this.eachAttribute(function(r,t){e.push(r)},this);this.eachRelationship(function(e,i){r[i.kind].push(e);t.push(e)});var i=[{name:"Attributes",properties:e,expand:true},{name:"Belongs To",properties:r.belongsTo,expand:true},{name:"Has Many",properties:r.hasMany,expand:true},{name:"Flags",properties:["isLoaded","isDirty","isSaving","isDeleted","isError","isNew","isValid"]}];return{propertyInfo:{includeOtherProperties:true,groups:i,expensiveProperties:t}}}});r["default"]=t});r("ember-data/system/model",["ember-data/system/model/model","ember-data/system/model/attributes","ember-data/system/model/states","ember-data/system/model/errors","exports"],function(e,r,t,i,a){"use strict";var n=e["default"];var s=r["default"];var o=t["default"];var d=i["default"];a.Model=n;a.RootState=o;a.attr=s;a.Errors=d});r("ember-data/system/model/attributes",["ember-data/system/model/model","exports"],function(e,r){"use strict";var t=e["default"];var i=Ember.get;t.reopenClass({attributes:Ember.computed(function(){var e=Ember.Map.create();this.eachComputedProperty(function(r,t){if(t.isAttribute){t.name=r;e.set(r,t)}});return e}).readOnly(),transformedAttributes:Ember.computed(function(){var e=Ember.Map.create();this.eachAttribute(function(r,t){if(t.type){e.set(r,t.type)}});return e}).readOnly(),eachAttribute:function(e,r){i(this,"attributes").forEach(function(t,i){e.call(r,t,i)},r)},eachTransformedAttribute:function(e,r){i(this,"transformedAttributes").forEach(function(t,i){e.call(r,t,i)})}});t.reopen({eachAttribute:function(e,r){this.constructor.eachAttribute(e,r)}});function a(e,r,t){if(typeof r.defaultValue==="function"){return r.defaultValue.apply(null,arguments)}else{return r.defaultValue}}function n(e,r){return e._attributes.hasOwnProperty(r)||e._inFlightAttributes.hasOwnProperty(r)||e._data.hasOwnProperty(r)}function s(e,r){if(e._attributes.hasOwnProperty(r)){return e._attributes[r]}else if(e._inFlightAttributes.hasOwnProperty(r)){return e._inFlightAttributes[r]}else{return e._data[r]}}r["default"]=function o(e,r){r=r||{};var t={type:e,isAttribute:true,options:r};return Ember.computed("data",function(e,t){if(arguments.length>1){var i=s(this,e);if(t!==i){this._attributes[e]=t;this.send("didSetProperty",{name:e,oldValue:i,originalValue:this._data[e],value:t})}return t}else if(n(this,e)){return s(this,e)}else{return a(this,r,e)}}).meta(t)}});r("ember-data/system/model/errors",["exports"],function(e){"use strict";var r=Ember.get;var t=Ember.isEmpty;var i=Ember.EnumerableUtils.map;e["default"]=Ember.Object.extend(Ember.Enumerable,Ember.Evented,{registerHandlers:function(e,r,t){this.on("becameInvalid",e,r);this.on("becameValid",e,t)},errorsByAttributeName:Ember.reduceComputed("content",{initialValue:function(){return Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}})},addedItem:function(e,r){e.get(r.attribute).pushObject(r);return e},removedItem:function(e,r){e.get(r.attribute).removeObject(r);return e}}),errorsFor:function(e){return r(this,"errorsByAttributeName").get(e)},messages:Ember.computed.mapBy("content","message"),content:Ember.computed(function(){return Ember.A()}),unknownProperty:function(e){var r=this.errorsFor(e);if(t(r)){return null}return r},nextObject:function(e,t,i){return r(this,"content").objectAt(e)},length:Ember.computed.oneWay("content.length").readOnly(),isEmpty:Ember.computed.not("length").readOnly(),add:function(e,t){var i=r(this,"isEmpty");t=this._findOrCreateMessages(e,t);r(this,"content").addObjects(t);this.notifyPropertyChange(e);this.enumerableContentDidChange();if(i&&!r(this,"isEmpty")){this.trigger("becameInvalid")}},_findOrCreateMessages:function(e,r){var t=this.errorsFor(e);return i(Ember.makeArray(r),function(r){return t.findBy("message",r)||{attribute:e,message:r}})},remove:function(e){if(r(this,"isEmpty")){return}var t=r(this,"content").rejectBy("attribute",e);r(this,"content").setObjects(t);this.notifyPropertyChange(e);this.enumerableContentDidChange();if(r(this,"isEmpty")){this.trigger("becameValid")}},clear:function(){if(r(this,"isEmpty")){return}r(this,"content").clear();this.enumerableContentDidChange();this.trigger("becameValid")},has:function(e){return!t(this.errorsFor(e))}})});r("ember-data/system/model/model",["ember-data/system/model/states","ember-data/system/model/errors","ember-data/system/store","exports"],function(e,r,i,a){"use strict";var n=e["default"];var s=r["default"];var o=i.PromiseObject;var d=Ember.get;var u=Ember.set;var c=Ember.merge;var l=Ember.RSVP.Promise;var f=Ember.ArrayPolyfills.forEach;var h;var p=Ember.computed("currentState",function(e,r){return d(d(this,"currentState"),e)}).readOnly();var m=Object.create(null);var v=Object.create(null);function y(e){return v[e]||(v[e]=e.split("."))}function b(e){return m[e]||(m[e]=y(e)[0])}var g=Ember.Object.extend(Ember.Evented,{_recordArrays:undefined,_relationships:undefined,_loadingRecordArrays:undefined,isEmpty:p,isLoading:p,isLoaded:p,isDirty:p,isSaving:p,isDeleted:p,isNew:p,isValid:p,dirtyType:p,isError:false,isReloading:false,clientId:null,id:null,currentState:n.empty,errors:Ember.computed(function(){var e=s.create();e.registerHandlers(this,function(){this.send("becameInvalid")},function(){this.send("becameValid")});return e}).readOnly(),serialize:function(e){var r=d(this,"store");return r.serialize(this,e)},toJSON:function(e){if(!h){h=t("ember-data/serializers/json_serializer")["default"]}var r=h.create({container:this.container});return r.serialize(this,e)},didLoad:Ember.K,didUpdate:Ember.K,didCreate:Ember.K,didDelete:Ember.K,becameInvalid:Ember.K,becameError:Ember.K,data:Ember.computed(function(){this._data=this._data||{};return this._data}).readOnly(),_data:null,init:function(){this._super();this._setup()},_setup:function(){this._changesToSync={};this._deferredTriggers=[];this._data={};this._attributes={};this._inFlightAttributes={};this._relationships={}},send:function(e,r){var t=d(this,"currentState");if(!t[e]){this._unhandledEvent(t,e,r)}return t[e](this,r)},transitionTo:function(e){var r=b(e);var t=d(this,"currentState");var i=t;do{if(i.exit){i.exit(this)}i=i.parentState}while(!i.hasOwnProperty(r));var a=y(e);var n=[],s=[],o,c;for(o=0,c=a.length;o1){K(i,t,e,s,n).then(d).then(u(n)).then(null,c(n))}else if(s.length===1){var l=Ember.A(r).findBy("record",a[0]);o(l)}else{}})}else{l(r,o)}},getById:function(e,r){if(this.hasRecordForId(e,r)){return this.recordForId(e,r)}else{return null}},reloadRecord:function(e){var r=e.constructor;var t=this.adapterFor(r);var i=o(e,"id");return this.scheduleFetch(e)},hasRecordForId:function(e,r){var t=this.modelFor(e);var i=_(r);return!!this.typeMapFor(t).idToRecord[i]},recordForId:function(e,r){var t=this.modelFor(e);var i=_(r);var a=this.typeMapFor(t).idToRecord;var n=a[i];if(!n||!a[i]){n=this.buildRecord(t,i)}return n},findMany:function(e,r,t,i){var a=this.modelFor(t);var n=Ember.A(r);var s=n.filterProperty("isEmpty",true);var o=this.recordArrayManager.createManyArray(a,n);o.loadingRecordsCount=s.length;if(s.length){l(s,function(e){this.recordArrayManager.registerWaitingRecordArray(e,o)},this);i.resolve(this.scheduleFetchMany(s,e))}else{if(i){i.resolve()}o.set("isLoaded",true);u(o,"trigger","didLoad")}return o},findHasMany:function(e,r,t,i){var a=this.adapterFor(e.constructor);var n=this.recordArrayManager.createManyArray(t.type,Ember.A([]));i.resolve(j(a,this,e,r,t));return n},findBelongsTo:function(e,r,t){var i=this.adapterFor(e.constructor);return L(i,this,e,r,t)},findQuery:function(e,r){var t=this.modelFor(e);var i=this.recordArrayManager.createAdapterPopulatedRecordArray(t,r);var a=this.adapterFor(t);return M(U(a,this,t,r,i))},findAll:function(e){var r=this.modelFor(e);return this.fetchAll(r,this.all(r))},fetchAll:function(e,r){var t=this.adapterFor(e);var i=this.typeMapFor(e).metadata.since;d(r,"isUpdating",true);return M(B(t,this,e,i))},didUpdateAll:function(e){var r=this.typeMapFor(e).findAllCache;d(r,"isUpdating",false)},all:function(e){var r=this.modelFor(e);var t=this.typeMapFor(r);var i=t.findAllCache;if(i){return i}var a=this.recordArrayManager.createRecordArray(r);t.findAllCache=a;return a},unloadAll:function(e){var r=this.modelFor(e);var t=this.typeMapFor(r);var i=t.records.slice();var a;for(var n=0;nE;R--){o=n[R-1];g=o[0];if(g.test(e)){break}}o=o||[];g=o[0];d=o[1];u=e.replace(g,d);return u}};e["default"]=o});r("ember-inflector/system/string",["./inflector","exports"],function(e,r){"use strict";var t=e["default"];function i(e){return t.inflector.pluralize(e)}function a(e){return t.inflector.singularize(e)}r.pluralize=i;r.singularize=a});e.DS=t("ember-data")["default"]})(this); diff --git a/vendor/assets/ember/production/ember.js b/vendor/assets/ember/production/ember.js index e1618ead..d13e032a 100644 --- a/vendor/assets/ember/production/ember.js +++ b/vendor/assets/ember/production/ember.js @@ -1,21 +1,21 @@ // Fetched from channel: canary, with url http://builds.emberjs.com/canary/ember.min.js -// Fetched on: 2014-07-01T13:19:24Z -(function(){var define,requireModule,require,requirejs,Ember;(function(){Ember=this.Ember=this.Ember||{};if(typeof Ember==="undefined"){Ember={}}if(typeof Ember.__loader==="undefined"){var registry={},seen={};define=function(name,deps,callback){registry[name]={deps:deps,callback:callback}};requirejs=require=requireModule=function(name){if(seen.hasOwnProperty(name)){return seen[name]}seen[name]={};if(!registry[name]){throw new Error("Could not find module "+name)}var mod=registry[name],deps=mod.deps,callback=mod.callback,reified=[],exports;for(var i=0,l=deps.length;i3?slice.call(arguments,3):undefined;if(!this.currentInstance){createAutorun(this)}return this.currentInstance.schedule(queueName,target,method,args,false,stack)},deferOnce:function(queueName,target,method){if(!method){method=target;target=null}if(isString(method)){method=target[method]}var stack=this.DEBUG?new Error:undefined,args=arguments.length>3?slice.call(arguments,3):undefined;if(!this.currentInstance){createAutorun(this)}return this.currentInstance.schedule(queueName,target,method,args,true,stack)},setTimeout:function(){var args=slice.call(arguments),length=args.length,method,wait,target,methodOrTarget,methodOrWait,methodOrArgs;if(length===0){return}else if(length===1){method=args.shift();wait=0}else if(length===2){methodOrTarget=args[0];methodOrWait=args[1];if(isFunction(methodOrWait)||isFunction(methodOrTarget[methodOrWait])){target=args.shift();method=args.shift();wait=0}else if(isCoercableNumber(methodOrWait)){method=args.shift();wait=args.shift()}else{method=args.shift();wait=0}}else{var last=args[args.length-1];if(isCoercableNumber(last)){wait=args.pop()}else{wait=0}methodOrTarget=args[0];methodOrArgs=args[1];if(isFunction(methodOrArgs)||isString(methodOrArgs)&&methodOrTarget!==null&&methodOrArgs in methodOrTarget){target=args.shift();method=args.shift()}else{method=args.shift()}}var executeAt=+new Date+parseInt(wait,10);if(isString(method)){method=target[method]}var onError=getOnError(this.options);function fn(){if(onError){try{method.apply(target,args)}catch(e){onError(e)}}else{method.apply(target,args)}}var i=searchTimer(executeAt,timers);timers.splice(i,0,executeAt,fn);updateLaterTimer(this,executeAt,wait);return fn},throttle:function(target,method){var self=this,args=arguments,immediate=pop.call(args),wait,throttler,index,timer;if(isNumber(immediate)||isString(immediate)){wait=immediate;immediate=true}else{wait=pop.call(args)}wait=parseInt(wait,10);index=findThrottler(target,method,this._throttlers);if(index>-1){return this._throttlers[index]}timer=global.setTimeout(function(){if(!immediate){self.run.apply(self,args)}var index=findThrottler(target,method,self._throttlers);if(index>-1){self._throttlers.splice(index,1)}},wait);if(immediate){self.run.apply(self,args)}throttler=[target,method,timer];this._throttlers.push(throttler);return throttler},debounce:function(target,method){var self=this,args=arguments,immediate=pop.call(args),wait,index,debouncee,timer;if(isNumber(immediate)||isString(immediate)){wait=immediate;immediate=false}else{wait=pop.call(args)}wait=parseInt(wait,10);index=findDebouncee(target,method,this._debouncees);if(index>-1){debouncee=this._debouncees[index];this._debouncees.splice(index,1);clearTimeout(debouncee[2])}timer=global.setTimeout(function(){if(!immediate){self.run.apply(self,args)}var index=findDebouncee(target,method,self._debouncees);if(index>-1){self._debouncees.splice(index,1)}},wait);if(immediate&&index===-1){self.run.apply(self,args)}debouncee=[target,method,timer];self._debouncees.push(debouncee);return debouncee},cancelTimers:function(){var clearItems=function(item){clearTimeout(item[2])};each(this._throttlers,clearItems);this._throttlers=[];each(this._debouncees,clearItems);this._debouncees=[];if(this._laterTimer){clearTimeout(this._laterTimer);this._laterTimer=null}timers=[];if(this._autorun){clearTimeout(this._autorun);this._autorun=null}},hasTimers:function(){return!!timers.length||!!this._debouncees.length||!!this._throttlers.length||this._autorun},cancel:function(timer){var timerType=typeof timer;if(timer&&timerType==="object"&&timer.queue&&timer.method){return timer.queue.cancel(timer)}else if(timerType==="function"){for(var i=0,l=timers.length;i-1){item=array[index];if(item[2]===timer[2]){array.splice(index,1);clearTimeout(timer[2]);return true}}return false}};Backburner.prototype.schedule=Backburner.prototype.defer;Backburner.prototype.scheduleOnce=Backburner.prototype.deferOnce;Backburner.prototype.later=Backburner.prototype.setTimeout;if(needsIETryCatchFix){var originalRun=Backburner.prototype.run;Backburner.prototype.run=wrapInTryCatch(originalRun);var originalEnd=Backburner.prototype.end;Backburner.prototype.end=wrapInTryCatch(originalEnd)}function wrapInTryCatch(func){return function(){try{return func.apply(this,arguments)}catch(e){throw e}}}function getOnError(options){return options.onError||options.onErrorTarget&&options.onErrorTarget[options.onErrorMethod]}function createAutorun(backburner){backburner.begin();backburner._autorun=global.setTimeout(function(){backburner._autorun=null;backburner.end()})}function updateLaterTimer(self,executeAt,wait){if(!self._laterTimer||executeAt=timers[middle]){start=middle+2}else{end=middle}}return time>=timers[start]?start+2:start}__exports__.Backburner=Backburner});define("backburner/deferred_action_queues",["backburner/utils","backburner/queue","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Utils=__dependency1__["default"];var Queue=__dependency2__.Queue;var each=Utils.each,isString=Utils.isString;function DeferredActionQueues(queueNames,options){var queues=this.queues={};this.queueNames=queueNames=queueNames||[];this.options=options;each(queueNames,function(queueName){queues[queueName]=new Queue(this,queueName,options)})}DeferredActionQueues.prototype={queueNames:null,queues:null,options:null,schedule:function(queueName,target,method,args,onceFlag,stack){var queues=this.queues,queue=queues[queueName];if(!queue){throw new Error("You attempted to schedule an action in a queue ("+queueName+") that doesn't exist")}if(onceFlag){return queue.pushUnique(target,method,args,stack)}else{return queue.push(target,method,args,stack)}},invoke:function(target,method,args,_){if(args&&args.length>0){method.apply(target,args)}else{method.call(target)}},invokeWithOnError:function(target,method,args,onError){try{if(args&&args.length>0){method.apply(target,args)}else{method.call(target)}}catch(error){onError(error)}},flush:function(){var queues=this.queues,queueNames=this.queueNames,queueName,queue,queueItems,priorQueueNameIndex,queueNameIndex=0,numberOfQueues=queueNames.length,options=this.options,onError=options.onError||options.onErrorTarget&&options.onErrorTarget[options.onErrorMethod],invoke=onError?this.invokeWithOnError:this.invoke;outerloop:while(queueNameIndex0){if(onError){try{method.apply(target,args)}catch(e){onError(e)}}else{method.apply(target,args)}}else{if(onError){try{method.call(target)}catch(e){onError(e)}}else{method.call(target)}}}if(l&&after){after()}if(queue.length>l){this._queue=queue.slice(l);this.flush()}else{this._queue.length=0}},cancel:function(actionToCancel){var queue=this._queue,currentTarget,currentMethod,i,l;for(i=0,l=queue.length;i1?"they":"it")+" could not be found")}}var defaultControllersComputedProperty=computed(function(){var controller=this;return{needs:get(controller,"needs"),container:get(controller,"container"),unknownProperty:function(controllerName){var needs=this.needs,dependency,i,l;for(i=0,l=needs.length;i0){if(this.container){verifyNeedsDependencies(this,this.container,needs)}get(this,"controllers")}this._super.apply(this,arguments)},controllerFor:function(controllerName){return controllerFor(get(this,"container"),controllerName)},controllers:defaultControllersComputedProperty});__exports__["default"]=ControllerMixin});define("ember-application/system/application",["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","ember-application/system/deprecated-container","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__dependency17__,__dependency18__,__dependency19__,__dependency20__,__dependency21__,__dependency22__,__dependency23__,__dependency24__,__dependency25__,__dependency26__,__dependency27__,__dependency28__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var runLoadHooks=__dependency4__.runLoadHooks;var DAG=__dependency5__["default"];var Namespace=__dependency6__["default"];var DeferredMixin=__dependency7__["default"];var DefaultResolver=__dependency8__["default"];var create=__dependency9__.create;var run=__dependency10__["default"];var canInvoke=__dependency11__.canInvoke;var Container=__dependency12__["default"];var Controller=__dependency13__["default"];var EnumerableUtils=__dependency14__["default"];var ObjectController=__dependency15__["default"];var ArrayController=__dependency16__["default"];var EventDispatcher=__dependency17__["default"];var jQuery=__dependency18__["default"];var Route=__dependency19__["default"];var Router=__dependency20__["default"];var HashLocation=__dependency21__["default"];var HistoryLocation=__dependency22__["default"];var AutoLocation=__dependency23__["default"];var NoneLocation=__dependency24__["default"];var BucketCache=__dependency25__["default"];var K=__dependency26__.K;var EmberHandlebars=__dependency27__["default"];var DeprecatedContainer=__dependency28__["default"];var ContainerDebugAdapter;var Application=Namespace.extend(DeferredMixin,{rootElement:"body",eventDispatcher:null,customEvents:null,_readinessDeferrals:1,init:function(){if(!this.$){this.$=jQuery}this.__container__=this.buildContainer();this.Router=this.defaultRouter();this._super();this.scheduleInitialize();Ember.libraries.registerCoreLibrary("Handlebars",EmberHandlebars.VERSION);Ember.libraries.registerCoreLibrary("jQuery",jQuery().jquery);if(Ember.LOG_VERSION){Ember.LOG_VERSION=false;var nameLengths=EnumerableUtils.map(Ember.libraries,function(item){return get(item,"name.length")});var maxNameLength=Math.max.apply(this,nameLengths);Ember.libraries.each(function(name,version){var spaces=new Array(maxNameLength-name.length+1).join(" ")})}},buildContainer:function(){var container=this.__container__=Application.buildContainer(this);return container},defaultRouter:function(){if(this.Router===false){return}var container=this.__container__;if(this.Router){container.unregister("router:main"); -container.register("router:main",this.Router)}return container.lookupFactory("router:main")},scheduleInitialize:function(){var self=this;if(!this.$||this.$.isReady){run.schedule("actions",self,"_initialize")}else{this.$().ready(function runInitialize(){run(self,"_initialize")})}},deferReadiness:function(){this._readinessDeferrals++},advanceReadiness:function(){this._readinessDeferrals--;if(this._readinessDeferrals===0){run.once(this,this.didBecomeReady)}},register:function(){var container=this.__container__;container.register.apply(container,arguments)},inject:function(){var container=this.__container__;container.injection.apply(container,arguments)},initialize:function(){},_initialize:function(){if(this.isDestroyed){return}if(this.Router){var container=this.__container__;container.unregister("router:main");container.register("router:main",this.Router)}this.runInitializers();runLoadHooks("application",this);this.advanceReadiness();return this},reset:function(){this._readinessDeferrals=1;function handleReset(){var router=this.__container__.lookup("router:main");router.reset();run(this.__container__,"destroy");this.buildContainer();run.schedule("actions",this,function(){this._initialize()})}run.join(this,handleReset)},runInitializers:function(){var initializers=get(this.constructor,"initializers"),container=this.__container__,graph=new DAG,namespace=this,name,initializer;for(name in initializers){initializer=initializers[name];graph.addEdges(initializer.name,initializer.initialize,initializer.before,initializer.after)}graph.topsort(function(vertex){var initializer=vertex.value;initializer(container,namespace)})},didBecomeReady:function(){this.setupEventDispatcher();this.ready();this.startRouting();if(!Ember.testing){Ember.Namespace.processAll();Ember.BOOTED=true}this.resolve(this)},setupEventDispatcher:function(){var customEvents=get(this,"customEvents"),rootElement=get(this,"rootElement"),dispatcher=this.__container__.lookup("event_dispatcher:main");set(this,"eventDispatcher",dispatcher);dispatcher.setup(customEvents,rootElement)},startRouting:function(){var router=this.__container__.lookup("router:main");if(!router){return}router.startRouting()},handleURL:function(url){var router=this.__container__.lookup("router:main");router.handleURL(url)},ready:K,resolver:null,Resolver:null,willDestroy:function(){Ember.BOOTED=false;this.__container__.lookup("router:main").reset();this.__container__.destroy()},initializer:function(options){this.constructor.initializer(options)}});Application.reopenClass({initializers:{},initializer:function(initializer){if(this.superclass.initializers!==undefined&&this.superclass.initializers===this.initializers){this.reopenClass({initializers:create(this.initializers)})}this.initializers[initializer.name]=initializer},buildContainer:function(namespace){var container=new Container;Container.defaultContainer=new DeprecatedContainer(container);container.set=set;container.resolver=resolverFor(namespace);container.normalize=container.resolver.normalize;container.describe=container.resolver.describe;container.makeToString=container.resolver.makeToString;container.optionsForType("component",{singleton:false});container.optionsForType("view",{singleton:false});container.optionsForType("template",{instantiate:false});container.optionsForType("helper",{instantiate:false});container.register("application:main",namespace,{instantiate:false});container.register("controller:basic",Controller,{instantiate:false});container.register("controller:object",ObjectController,{instantiate:false});container.register("controller:array",ArrayController,{instantiate:false});container.register("route:basic",Route,{instantiate:false});container.register("event_dispatcher:main",EventDispatcher);container.register("router:main",Router);container.injection("router:main","namespace","application:main");container.register("location:auto",AutoLocation);container.register("location:hash",HashLocation);container.register("location:history",HistoryLocation);container.register("location:none",NoneLocation);container.injection("controller","target","router:main");container.injection("controller","namespace","application:main");container.register("-bucket-cache:main",BucketCache);container.injection("router","_bucketCache","-bucket-cache:main");container.injection("route","_bucketCache","-bucket-cache:main");container.injection("controller","_bucketCache","-bucket-cache:main");container.injection("route","router","router:main");container.injection("location","rootURL","-location-setting:root-url");container.register("resolver-for-debugging:main",container.resolver.__resolver__,{instantiate:false});container.injection("container-debug-adapter:main","resolver","resolver-for-debugging:main");container.injection("data-adapter:main","containerDebugAdapter","container-debug-adapter:main");if(!ContainerDebugAdapter){ContainerDebugAdapter=requireModule("ember-extension-support/container_debug_adapter")["default"]}container.register("container-debug-adapter:main",ContainerDebugAdapter);return container}});function resolverFor(namespace){if(namespace.get("resolver")){}var ResolverClass=namespace.get("resolver")||namespace.get("Resolver")||DefaultResolver;var resolver=ResolverClass.create({namespace:namespace});function resolve(fullName){return resolver.resolve(fullName)}resolve.describe=function(fullName){return resolver.lookupDescription(fullName)};resolve.makeToString=function(factory,fullName){return resolver.makeToString(factory,fullName)};resolve.normalize=function(fullName){if(resolver.normalize){return resolver.normalize(fullName)}else{return fullName}};resolve.__resolver__=resolver;return resolve}__exports__["default"]=Application});define("ember-application/system/dag",["ember-metal/error","exports"],function(__dependency1__,__exports__){"use strict";var EmberError=__dependency1__["default"];function visit(vertex,fn,visited,path){var name=vertex.name,vertices=vertex.incoming,names=vertex.incomingNames,len=names.length,i;if(!visited){visited={}}if(!path){path=[]}if(visited.hasOwnProperty(name)){return}path.push(name);visited[name]=true;for(i=0;i-1){result=result.replace(/\.(.)/g,function(m){return m.charAt(1).toUpperCase()})}if(name.indexOf("_")>-1){result=result.replace(/_(.)/g,function(m){return m.charAt(1).toUpperCase()})}return type+":"+result}else{return fullName}},resolve:function(fullName){var parsedName=this.parseName(fullName),resolveMethodName=parsedName.resolveMethodName,resolved;if(!(parsedName.name&&parsedName.type)){throw new TypeError("Invalid fullName: `"+fullName+"`, must be of the form `type:name` ")}if(this[resolveMethodName]){resolved=this[resolveMethodName](parsedName)}if(!resolved){resolved=this.resolveOther(parsedName)}if(parsedName.root&&parsedName.root.LOG_RESOLVER){this._logLookup(resolved,parsedName)}return resolved},parseName:function(fullName){var nameParts=fullName.split(":"),type=nameParts[0],fullNameWithoutType=nameParts[1],name=fullNameWithoutType,namespace=get(this,"namespace"),root=namespace;if(type!=="template"&&name.indexOf("/")!==-1){var parts=name.split("/");name=parts[parts.length-1];var namespaceName=capitalize(parts.slice(0,-1).join("."));root=Namespace.byName(namespaceName)}return{fullName:fullName,type:type,fullNameWithoutType:fullNameWithoutType,name:name,root:root,resolveMethodName:"resolve"+classify(type)}},lookupDescription:function(fullName){var parsedName=this.parseName(fullName);if(parsedName.type==="template"){return"template at "+parsedName.fullNameWithoutType.replace(/\./g,"/")}var description=parsedName.root+"."+classify(parsedName.name);if(parsedName.type!=="model"){description+=classify(parsedName.type)}return description},makeToString:function(factory,fullName){return factory.toString()},useRouterNaming:function(parsedName){parsedName.name=parsedName.name.replace(/\./g,"_");if(parsedName.name==="basic"){parsedName.name=""}},resolveTemplate:function(parsedName){var templateName=parsedName.fullNameWithoutType.replace(/\./g,"/");if(Ember.TEMPLATES[templateName]){return Ember.TEMPLATES[templateName]}templateName=decamelize(templateName);if(Ember.TEMPLATES[templateName]){return Ember.TEMPLATES[templateName]}},resolveView:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveController:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveRoute:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveModel:function(parsedName){var className=classify(parsedName.name),factory=get(parsedName.root,className);if(factory){return factory}},resolveHelper:function(parsedName){return this.resolveOther(parsedName)||EmberHandlebars.helpers[parsedName.fullNameWithoutType]},resolveOther:function(parsedName){var className=classify(parsedName.name)+classify(parsedName.type),factory=get(parsedName.root,className);if(factory){return factory}},_logLookup:function(found,parsedName){var symbol,padding;if(found){symbol="[✓]"}else{symbol="[ ]"}if(parsedName.fullName.length>60){padding="."}else{padding=new Array(60-parsedName.fullName.length).join(".")}Logger.info(symbol,parsedName.fullName,padding,this.lookupDescription(parsedName.fullName))}})});define("ember-extension-support",["ember-metal/core","ember-extension-support/data_adapter","ember-extension-support/container_debug_adapter"],function(__dependency1__,__dependency2__,__dependency3__){"use strict";var Ember=__dependency1__["default"];var DataAdapter=__dependency2__["default"];var ContainerDebugAdapter=__dependency3__["default"];Ember.DataAdapter=DataAdapter;Ember.ContainerDebugAdapter=ContainerDebugAdapter});define("ember-extension-support/container_debug_adapter",["ember-metal/core","ember-runtime/system/native_array","ember-metal/utils","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var emberA=__dependency2__.A;var typeOf=__dependency3__.typeOf;var dasherize=__dependency4__.dasherize;var classify=__dependency4__.classify;var Namespace=__dependency5__["default"];var EmberObject=__dependency6__["default"];__exports__["default"]=EmberObject.extend({container:null,resolver:null,canCatalogEntriesByType:function(type){if(type==="model"||type==="template")return false;return true},catalogEntriesByType:function(type){var namespaces=emberA(Namespace.NAMESPACES),types=emberA(),self=this;var typeSuffixRegex=new RegExp(classify(type)+"$");namespaces.forEach(function(namespace){if(namespace!==Ember){for(var key in namespace){if(!namespace.hasOwnProperty(key)){continue}if(typeSuffixRegex.test(key)){var klass=namespace[key];if(typeOf(klass)==="class"){types.push(dasherize(key.replace(typeSuffixRegex,"")))}}}}});return types}})});define("ember-extension-support/data_adapter",["ember-metal/core","ember-metal/property_get","ember-metal/run_loop","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","ember-runtime/system/native_array","ember-application/system/application","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var run=__dependency3__["default"];var dasherize=__dependency4__.dasherize;var Namespace=__dependency5__["default"];var EmberObject=__dependency6__["default"];var emberA=__dependency7__.A;var Application=__dependency8__["default"];__exports__["default"]=EmberObject.extend({init:function(){this._super();this.releaseMethods=emberA()},container:null,containerDebugAdapter:undefined,attributeLimit:3,releaseMethods:emberA(),getFilters:function(){return emberA()},watchModelTypes:function(typesAdded,typesUpdated){var modelTypes=this.getModelTypes(),self=this,typesToSend,releaseMethods=emberA();typesToSend=modelTypes.map(function(type){var klass=type.klass;var wrapped=self.wrapModelType(klass,type.name);releaseMethods.push(self.observeModelType(klass,typesUpdated));return wrapped});typesAdded(typesToSend);var release=function(){releaseMethods.forEach(function(fn){fn()});self.releaseMethods.removeObject(release)};this.releaseMethods.pushObject(release);return release},_nameToClass:function(type){if(typeof type==="string"){type=this.container.lookupFactory("model:"+type)}return type},watchRecords:function(type,recordsAdded,recordsUpdated,recordsRemoved){var self=this,releaseMethods=emberA(),records=this.getRecords(type),release;var recordUpdated=function(updatedRecord){recordsUpdated([updatedRecord])};var recordsToSend=records.map(function(record){releaseMethods.push(self.observeRecord(record,recordUpdated));return self.wrapRecord(record)});var contentDidChange=function(array,idx,removedCount,addedCount){for(var i=idx;i-1}else{return content==selection}}).property("content","parentView.selection"),labelPathDidChange:observer("parentView.optionLabelPath",function(){var labelPath=get(this,"parentView.optionLabelPath");if(!labelPath){return}defineProperty(this,"label",computed(function(){return get(this,labelPath)}).property(labelPath))}),valuePathDidChange:observer("parentView.optionValuePath",function(){var valuePath=get(this,"parentView.optionValuePath");if(!valuePath){return}defineProperty(this,"value",computed(function(){return get(this,valuePath)}).property(valuePath))})});var SelectOptgroup=CollectionView.extend({instrumentDisplay:"Ember.SelectOptgroup",tagName:"optgroup",attributeBindings:["label"],selectionBinding:"parentView.selection",multipleBinding:"parentView.multiple",optionLabelPathBinding:"parentView.optionLabelPath",optionValuePathBinding:"parentView.optionValuePath",itemViewClassBinding:"parentView.optionView"});var Select=View.extend({instrumentDisplay:"Ember.Select",tagName:"select",classNames:["ember-select"],defaultTemplate:Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"];helpers=this.merge(helpers,Ember.Handlebars.helpers);data=data||{};var buffer="",stack1,escapeExpression=this.escapeExpression,self=this;function program1(depth0,data){var buffer="",stack1;data.buffer.push('");return buffer}function program3(depth0,data){var stack1;stack1=helpers.each.call(depth0,"view.groupedContent",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(4,program4,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}else{data.buffer.push("")}}function program4(depth0,data){data.buffer.push(escapeExpression(helpers.view.call(depth0,"view.groupView",{hash:{content:"content",label:"label"},hashTypes:{content:"ID",label:"ID"},hashContexts:{content:depth0,label:depth0},contexts:[depth0],types:["ID"],data:data})))}function program6(depth0,data){var stack1;stack1=helpers.each.call(depth0,"view.content",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(7,program7,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}else{data.buffer.push("")}}function program7(depth0,data){data.buffer.push(escapeExpression(helpers.view.call(depth0,"view.optionView",{hash:{content:""},hashTypes:{content:"ID"},hashContexts:{content:depth0},contexts:[depth0],types:["ID"],data:data})))}stack1=helpers["if"].call(depth0,"view.prompt",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(1,program1,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}stack1=helpers["if"].call(depth0,"view.optionGroupPath",{hash:{},hashTypes:{},hashContexts:{},inverse:self.program(6,program6,data),fn:self.program(3,program3,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}return buffer}),attributeBindings:["multiple","disabled","tabindex","name","required","autofocus","form","size"],multiple:false,disabled:false,required:false,content:null,selection:null,value:computed(function(key,value){if(arguments.length===2){return value}var valuePath=get(this,"optionValuePath").replace(/^content\.?/,"");return valuePath?get(this,"selection."+valuePath):get(this,"selection")}).property("selection"),prompt:null,optionLabelPath:"content",optionValuePath:"content",optionGroupPath:null,groupView:SelectOptgroup,groupedContent:computed(function(){var groupPath=get(this,"optionGroupPath");var groupedContent=emberA();var content=get(this,"content")||[];forEach(content,function(item){var label=get(item,groupPath);if(get(groupedContent,"lastObject.label")!==label){groupedContent.pushObject({label:label,content:emberA()})}get(groupedContent,"lastObject.content").push(item)});return groupedContent}).property("optionGroupPath","content.@each"),optionView:SelectOption,_change:function(){if(get(this,"multiple")){this._changeMultiple()}else{this._changeSingle()}},selectionDidChange:observer("selection.@each",function(){var selection=get(this,"selection");if(get(this,"multiple")){if(!isArray(selection)){set(this,"selection",emberA([selection]));return}this._selectionDidChangeMultiple()}else{this._selectionDidChangeSingle()}}),valueDidChange:observer("value",function(){var content=get(this,"content"),value=get(this,"value"),valuePath=get(this,"optionValuePath").replace(/^content\.?/,""),selectedValue=valuePath?get(this,"selection."+valuePath):get(this,"selection"),selection;if(value!==selectedValue){selection=content?content.find(function(obj){return value===(valuePath?get(obj,valuePath):obj)}):null;this.set("selection",selection)}}),_triggerChange:function(){var selection=get(this,"selection");var value=get(this,"value");if(!isNone(selection)){this.selectionDidChange()}if(!isNone(value)){this.valueDidChange()}this._change()},_changeSingle:function(){var selectedIndex=this.$()[0].selectedIndex,content=get(this,"content"),prompt=get(this,"prompt");if(!content||!get(content,"length")){return}if(prompt&&selectedIndex===0){set(this,"selection",null);return}if(prompt){selectedIndex-=1}set(this,"selection",content.objectAt(selectedIndex))},_changeMultiple:function(){var options=this.$("option:selected"),prompt=get(this,"prompt"),offset=prompt?1:0,content=get(this,"content"),selection=get(this,"selection");if(!content){return}if(options){var selectedIndexes=options.map(function(){return this.index-offset}).toArray();var newSelection=content.objectsAt(selectedIndexes);if(isArray(selection)){replace(selection,0,get(selection,"length"),newSelection)}else{set(this,"selection",newSelection)}}},_selectionDidChangeSingle:function(){var el=this.get("element");if(!el){return}var content=get(this,"content"),selection=get(this,"selection"),selectionIndex=content?indexOf(content,selection):-1,prompt=get(this,"prompt");if(prompt){selectionIndex+=1}if(el){el.selectedIndex=selectionIndex}},_selectionDidChangeMultiple:function(){var content=get(this,"content"),selection=get(this,"selection"),selectedIndexes=content?indexesOf(content,selection):[-1],prompt=get(this,"prompt"),offset=prompt?1:0,options=this.$("option"),adjusted;if(options){options.each(function(){adjusted=this.index>-1?this.index-offset:-1;this.selected=indexOf(selectedIndexes,adjusted)>-1})}},init:function(){this._super();this.on("didInsertElement",this,this._triggerChange);this.on("change",this,this._change)}});__exports__["default"]=Select;__exports__.Select=Select;__exports__.SelectOption=SelectOption;__exports__.SelectOptgroup=SelectOptgroup});define("ember-handlebars/controls/text_area",["ember-metal/property_get","ember-views/views/component","ember-handlebars/controls/text_support","ember-metal/mixin","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var Component=__dependency2__["default"];var TextSupport=__dependency3__["default"];var observer=__dependency4__.observer;__exports__["default"]=Component.extend(TextSupport,{instrumentDisplay:"{{textarea}}",classNames:["ember-text-area"],tagName:"textarea",attributeBindings:["rows","cols","name","selectionEnd","selectionStart","wrap"],rows:null,cols:null,_updateElementValue:observer("value",function(){var value=get(this,"value"),$el=this.$();if($el&&value!==$el.val()){$el.val(value)}}),init:function(){this._super();this.on("didInsertElement",this,this._updateElementValue)}})});define("ember-handlebars/controls/text_field",["ember-metal/property_get","ember-metal/property_set","ember-views/views/component","ember-handlebars/controls/text_support","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var Component=__dependency3__["default"];var TextSupport=__dependency4__["default"];__exports__["default"]=Component.extend(TextSupport,{instrumentDisplay:'{{input type="text"}}',classNames:["ember-text-field"],tagName:"input",attributeBindings:["type","value","size","pattern","name","min","max","accept","autocomplete","autosave","formaction","formenctype","formmethod","formnovalidate","formtarget","height","inputmode","list","multiple","step","width"],value:"",type:"text",size:null,pattern:null,min:null,max:null})});define("ember-handlebars/controls/text_support",["ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-runtime/mixins/target_action_support","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var Mixin=__dependency3__.Mixin;var TargetActionSupport=__dependency4__["default"];var TextSupport=Mixin.create(TargetActionSupport,{value:"",attributeBindings:["placeholder","disabled","maxlength","tabindex","readonly","autofocus","form","selectionDirection","spellcheck","required","title","autocapitalize","autocorrect"],placeholder:null,disabled:false,maxlength:null,init:function(){this._super();this.on("focusOut",this,this._elementValueDidChange);this.on("change",this,this._elementValueDidChange);this.on("paste",this,this._elementValueDidChange);this.on("cut",this,this._elementValueDidChange);this.on("input",this,this._elementValueDidChange);this.on("keyUp",this,this.interpretKeyEvents)},action:null,onEvent:"enter",bubbles:false,interpretKeyEvents:function(event){var map=TextSupport.KEY_EVENTS;var method=map[event.keyCode];this._elementValueDidChange();if(method){return this[method](event)}},_elementValueDidChange:function(){set(this,"value",this.$().val())},insertNewline:function(event){sendAction("enter",this,event);sendAction("insert-newline",this,event)},cancel:function(event){sendAction("escape-press",this,event)},focusIn:function(event){sendAction("focus-in",this,event)},focusOut:function(event){sendAction("focus-out",this,event)},keyPress:function(event){sendAction("key-press",this,event)}});TextSupport.KEY_EVENTS={13:"insertNewline",27:"cancel"};function sendAction(eventName,view,event){var action=get(view,eventName),on=get(view,"onEvent"),value=get(view,"value");if(on===eventName||on==="keyPress"&&eventName==="key-press"){view.sendAction("action",value)}view.sendAction(eventName,value);if(action||on===eventName){if(!get(view,"bubbles")){event.stopPropagation()}}}__exports__["default"]=TextSupport});define("ember-handlebars/ext",["ember-metal/core","ember-runtime/system/string","ember-handlebars-compiler","ember-metal/property_get","ember-metal/binding","ember-metal/error","ember-metal/mixin","ember-metal/is_empty","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var Ember=__dependency1__["default"];var fmt=__dependency2__.fmt;var EmberHandlebars=__dependency3__["default"];var helpers=EmberHandlebars.helpers;var get=__dependency4__.get;var isGlobalPath=__dependency5__.isGlobalPath;var EmberError=__dependency6__["default"];var IS_BINDING=__dependency7__.IS_BINDING;var resolveHelper,SimpleHandlebarsView;var isEmpty=__dependency8__["default"];var slice=[].slice,originalTemplate=EmberHandlebars.template;function normalizePath(root,path,data){var keywords=data&&data.keywords||{},keyword,isKeyword;keyword=path.split(".",1)[0];if(keywords.hasOwnProperty(keyword)){root=keywords[keyword];isKeyword=true;if(path===keyword){path=""}else{path=path.substr(keyword.length+1)}}return{root:root,path:path,isKeyword:isKeyword}}function handlebarsGet(root,path,options){var data=options&&options.data,normalizedPath=normalizePath(root,path,data),value;if(Ember.FEATURES.isEnabled("ember-handlebars-caps-lookup")){if(isGlobalPath(path)){value=get(Ember.lookup,path)}else{value=get(normalizedPath.root,normalizedPath.path)}}else{root=normalizedPath.root;path=normalizedPath.path;value=get(root,path);if(value===undefined&&root!==Ember.lookup&&isGlobalPath(path)){value=get(Ember.lookup,path)}}return value}function getEscaped(root,path,options){var result=handlebarsGet(root,path,options);if(result===null||result===undefined){result=""}else if(!(result instanceof Handlebars.SafeString)){result=String(result)}if(!options.hash.unescaped){result=Handlebars.Utils.escapeExpression(result)}return result}__exports__.getEscaped=getEscaped;function resolveParams(context,params,options){var resolvedParams=[],types=options.types,param,type;for(var i=0,l=params.length;i2){options.data.isUnbound=true;helper=resolveHelper(container,property)||helpers.helperMissing;out=helper.apply(ctx,slice.call(arguments,1));delete options.data.isUnbound;return out}context=fn.contexts&&fn.contexts.length?fn.contexts[0]:ctx;return handlebarsGet(context,property,fn)}});define("ember-handlebars/helpers/view",["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-views/system/jquery","ember-views/views/view","ember-metal/binding","ember-handlebars/ext","ember-runtime/system/string","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__exports__){"use strict";var Ember=__dependency1__["default"];var EmberObject=__dependency2__["default"];var get=__dependency3__.get;var set=__dependency4__.set;var IS_BINDING=__dependency5__.IS_BINDING;var jQuery=__dependency6__["default"];var View=__dependency7__["default"];var isGlobalPath=__dependency8__.isGlobalPath;var normalizePath=__dependency9__.normalizePath;var handlebarsGet=__dependency9__.handlebarsGet;var EmberString=__dependency10__["default"];var LOWERCASE_A_Z=/^[a-z]/,VIEW_PREFIX=/^view\./;function makeBindings(thisContext,options){var hash=options.hash,hashType=options.hashTypes;for(var prop in hash){if(hashType[prop]==="ID"){var value=hash[prop];if(IS_BINDING.test(prop)){}else{hash[prop+"Binding"]=value;hashType[prop+"Binding"]="STRING";delete hash[prop];delete hashType[prop]}}}if(hash.hasOwnProperty("idBinding")){hash.id=handlebarsGet(thisContext,hash.idBinding,options);hashType.id="STRING";delete hash.idBinding;delete hashType.idBinding}}var ViewHelper=EmberObject.create({propertiesFromHTMLOptions:function(options){var hash=options.hash,data=options.data;var extensions={},classes=hash["class"],dup=false;if(hash.id){extensions.elementId=hash.id;dup=true}if(hash.tag){extensions.tagName=hash.tag;dup=true}if(classes){classes=classes.split(" ");extensions.classNames=classes;dup=true}if(hash.classBinding){extensions.classNameBindings=hash.classBinding.split(" ");dup=true}if(hash.classNameBindings){if(extensions.classNameBindings===undefined)extensions.classNameBindings=[];extensions.classNameBindings=extensions.classNameBindings.concat(hash.classNameBindings.split(" "));dup=true}if(hash.attributeBindings){extensions.attributeBindings=null;dup=true}if(dup){hash=jQuery.extend({},hash);delete hash.id;delete hash.tag;delete hash["class"];delete hash.classBinding}var path;for(var prop in hash){if(!hash.hasOwnProperty(prop)){continue}if(IS_BINDING.test(prop)&&typeof hash[prop]==="string"){path=this.contextualizeBindingPath(hash[prop],data);if(path){hash[prop]=path}}}if(extensions.classNameBindings){for(var b in extensions.classNameBindings){var full=extensions.classNameBindings[b];if(typeof full==="string"){var parsedPath=View._parsePropertyPath(full);path=this.contextualizeBindingPath(parsedPath.path,data);if(path){extensions.classNameBindings[b]=path+parsedPath.classNames}}}}return jQuery.extend(hash,extensions)},contextualizeBindingPath:function(path,data){var normalized=normalizePath(null,path,data);if(normalized.isKeyword){return"templateData.keywords."+path}else if(isGlobalPath(path)){return null}else if(path==="this"||path===""){return"_parentView.context"}else{return"_parentView.context."+path}},helper:function(thisContext,path,options){var data=options.data,fn=options.fn,newView;makeBindings(thisContext,options);if("string"===typeof path){var lookup;if(options.types[0]==="STRING"&&LOWERCASE_A_Z.test(path)&&!VIEW_PREFIX.test(path)){lookup=path}else{newView=handlebarsGet(thisContext,path,options);if(typeof newView==="string"){lookup=newView}}if(lookup){newView=data.view.container.lookupFactory("view:"+lookup)}}else{newView=path}var viewOptions=this.propertiesFromHTMLOptions(options,thisContext);var currentView=data.view;viewOptions.templateData=data;var newViewProto=newView.proto?newView.proto():newView;if(fn){viewOptions.template=fn}if(!newViewProto.controller&&!newViewProto.controllerBinding&&!viewOptions.controller&&!viewOptions.controllerBinding){viewOptions._context=thisContext}if(options.helperName){viewOptions.helperName=options.helperName}currentView.appendChild(newView,viewOptions)}});__exports__.ViewHelper=ViewHelper;function viewHelper(path,options){if(path&&path.data&&path.data.isRenderData){options=path;path=options.data.view.container.lookupFactory("view:default")}options.helperName=options.helperName||"view";return ViewHelper.helper(this,path,options)}__exports__.viewHelper=viewHelper});define("ember-handlebars/helpers/yield",["ember-metal/core","ember-metal/property_get","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;__exports__["default"]=function yieldHelper(options){var view=options.data.view;while(view&&!get(view,"layout")){if(view._contextView){view=view._contextView}else{view=get(view,"_parentView")}}view._yield(this,options)}});define("ember-handlebars/loader",["ember-handlebars/component_lookup","ember-views/system/jquery","ember-metal/error","ember-runtime/system/lazy_load","ember-handlebars-compiler","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var ComponentLookup=__dependency1__["default"];var jQuery=__dependency2__["default"];var EmberError=__dependency3__["default"];var onLoad=__dependency4__.onLoad;var EmberHandlebars=__dependency5__["default"];function bootstrap(ctx){var selectors='script[type="text/x-handlebars"], script[type="text/x-raw-handlebars"]';jQuery(selectors,ctx).each(function(){var script=jQuery(this);var compile=script.attr("type")==="text/x-raw-handlebars"?jQuery.proxy(Handlebars.compile,Handlebars):jQuery.proxy(EmberHandlebars.compile,EmberHandlebars),templateName=script.attr("data-template-name")||script.attr("id")||"application",template=compile(script.html());if(Ember.TEMPLATES[templateName]!==undefined){throw new EmberError('Template named "'+templateName+'" already exists.')}Ember.TEMPLATES[templateName]=template;script.remove()})}function _bootstrap(){bootstrap(jQuery(document))}function registerComponentLookup(container){container.register("component-lookup:main",ComponentLookup)}onLoad("Ember.Application",function(Application){Application.initializer({name:"domTemplates",initialize:_bootstrap});Application.initializer({name:"registerComponentLookup",after:"domTemplates",initialize:registerComponentLookup})});__exports__["default"]=bootstrap});define("ember-handlebars/string",["ember-runtime/system/string","exports"],function(__dependency1__,__exports__){"use strict";var EmberStringUtils=__dependency1__["default"];function htmlSafe(str){return new Handlebars.SafeString(str)}EmberStringUtils.htmlSafe=htmlSafe;if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.String){String.prototype.htmlSafe=function(){return htmlSafe(this)}}__exports__["default"]=htmlSafe});define("ember-handlebars/views/handlebars_bound_view",["ember-handlebars-compiler","ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-views/views/view","ember-views/views/states","ember-handlebars/views/metamorph_view","ember-handlebars/ext","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var EmberHandlebars=__dependency1__["default"];var SafeString=EmberHandlebars.SafeString;var Ember=__dependency2__["default"];var K=Ember.K;var Metamorph=requireModule("metamorph");var EmberError=__dependency3__["default"];var get=__dependency4__.get;var set=__dependency5__.set;var merge=__dependency6__["default"];var run=__dependency7__["default"];var computed=__dependency8__.computed;var View=__dependency9__["default"];var cloneStates=__dependency10__.cloneStates;var states=__dependency10__.states;var viewStates=states;var _MetamorphView=__dependency11__["default"];var handlebarsGet=__dependency12__.handlebarsGet;function SimpleHandlebarsView(path,pathRoot,isEscaped,templateData){this.path=path;this.pathRoot=pathRoot;this.isEscaped=isEscaped;this.templateData=templateData;this.morph=Metamorph();this.state="preRender";this.updateId=null;this._parentView=null;this.buffer=null}SimpleHandlebarsView.prototype={isVirtual:true,isView:true,destroy:function(){if(this.updateId){run.cancel(this.updateId);this.updateId=null}if(this._parentView){this._parentView.removeChild(this)}this.morph=null;this.state="destroyed"},propertyWillChange:K,propertyDidChange:K,normalizedValue:function(){var path=this.path,pathRoot=this.pathRoot,result,templateData;if(path===""){result=pathRoot}else{templateData=this.templateData;result=handlebarsGet(pathRoot,path,{data:templateData})}return result},renderToBuffer:function(buffer){var string="";string+=this.morph.startTag();string+=this.render();string+=this.morph.endTag();buffer.push(string)},render:function(){var escape=this.isEscaped;var result=this.normalizedValue();if(result===null||result===undefined){result=""}else if(!(result instanceof SafeString)){result=String(result)}if(escape){result=Handlebars.Utils.escapeExpression(result)}return result},rerender:function(){switch(this.state){case"preRender":case"destroyed":break;case"inBuffer":throw new EmberError("Something you did tried to replace an {{expression}} before it was inserted into the DOM.");case"hasElement":case"inDOM":this.updateId=run.scheduleOnce("render",this,"update");break}return this},update:function(){this.updateId=null;this.morph.html(this.render())},_transitionTo:function(state){this.state=state}};states=cloneStates(viewStates);merge(states._default,{rerenderIfNeeded:K});merge(states.inDOM,{rerenderIfNeeded:function(view){if(view.normalizedValue()!==view._lastNormalizedValue){view.rerender()}}});var _HandlebarsBoundView=_MetamorphView.extend({instrumentName:"boundHandlebars",_states:states,shouldDisplayFunc:null,preserveContext:false,previousContext:null,displayTemplate:null,inverseTemplate:null,path:null,pathRoot:null,normalizedValue:function(){var path=get(this,"path"),pathRoot=get(this,"pathRoot"),valueNormalizer=get(this,"valueNormalizerFunc"),result,templateData;if(path===""){result=pathRoot}else{templateData=get(this,"templateData");result=handlebarsGet(pathRoot,path,{data:templateData})}return valueNormalizer?valueNormalizer(result):result},rerenderIfNeeded:function(){this.currentState.rerenderIfNeeded(this)},render:function(buffer){var escape=get(this,"isEscaped");var shouldDisplay=get(this,"shouldDisplayFunc"),preserveContext=get(this,"preserveContext"),context=get(this,"previousContext");var inverseTemplate=get(this,"inverseTemplate"),displayTemplate=get(this,"displayTemplate");var result=this.normalizedValue();this._lastNormalizedValue=result;if(shouldDisplay(result)){set(this,"template",displayTemplate);if(preserveContext){set(this,"_context",context)}else{if(displayTemplate){set(this,"_context",result)}else{if(result===null||result===undefined){result=""}else if(!(result instanceof SafeString)){result=String(result)}if(escape){result=Handlebars.Utils.escapeExpression(result)}buffer.push(result);return}}}else if(inverseTemplate){set(this,"template",inverseTemplate);if(preserveContext){set(this,"_context",context)}else{set(this,"_context",result)}}else{set(this,"template",function(){return""})}return this._super(buffer)}});__exports__._HandlebarsBoundView=_HandlebarsBoundView;__exports__.SimpleHandlebarsView=SimpleHandlebarsView});define("ember-handlebars/views/metamorph_view",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-metal/run_loop","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__["default"];var CoreView=__dependency4__["default"];var View=__dependency5__["default"];var Mixin=__dependency6__.Mixin;var run=__dependency7__["default"];var Metamorph=requireModule("metamorph");function notifyMutationListeners(){run.once(View,"notifyMutationListeners")}var DOMManager={remove:function(view){view.morph.remove();notifyMutationListeners()},prepend:function(view,html){view.morph.prepend(html);notifyMutationListeners()},after:function(view,html){view.morph.after(html);notifyMutationListeners()},html:function(view,html){view.morph.html(html);notifyMutationListeners()},replace:function(view){var morph=view.morph;view._transitionTo("preRender");run.schedule("render",this,function renderMetamorphView(){if(view.isDestroying){return}view.clearRenderedChildren();var buffer=view.renderToBuffer();view.invokeRecursively(function(view){view.propertyWillChange("element")});view.triggerRecursively("willInsertElement");morph.replaceWith(buffer.string());view._transitionTo("inDOM");view.invokeRecursively(function(view){view.propertyDidChange("element")});view.triggerRecursively("didInsertElement");notifyMutationListeners()})},empty:function(view){view.morph.html("");notifyMutationListeners()}};var _Metamorph=Mixin.create({isVirtual:true,tagName:"",instrumentName:"metamorph",init:function(){this._super();this.morph=Metamorph()},beforeRender:function(buffer){buffer.push(this.morph.startTag());buffer.pushOpeningTag()},afterRender:function(buffer){buffer.pushClosingTag();buffer.push(this.morph.endTag())},createElement:function(){var buffer=this.renderToBuffer();this.outerHTML=buffer.string();this.clearBuffer()},domManager:DOMManager});__exports__._Metamorph=_Metamorph;var _wrapMap=Metamorph._wrapMap;__exports__._wrapMap=_wrapMap;var _MetamorphView=View.extend(_Metamorph);__exports__._MetamorphView=_MetamorphView;var _SimpleMetamorphView=CoreView.extend(_Metamorph);__exports__._SimpleMetamorphView=_SimpleMetamorphView;__exports__["default"]=View.extend(_Metamorph)});define("ember-metal",["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__dependency17__,__dependency18__,__dependency19__,__dependency20__,__dependency21__,__dependency22__,__dependency23__,__dependency24__,__dependency25__,__dependency26__,__dependency27__,__dependency28__,__dependency29__,__dependency30__,__dependency31__,__dependency32__,__exports__){"use strict";var Ember=__dependency1__["default"];var merge=__dependency2__["default"];var instrument=__dependency3__.instrument;var subscribe=__dependency3__.subscribe;var unsubscribe=__dependency3__.unsubscribe;var reset=__dependency3__.reset;var generateGuid=__dependency4__.generateGuid;var GUID_KEY=__dependency4__.GUID_KEY;var GUID_PREFIX=__dependency4__.GUID_PREFIX;var guidFor=__dependency4__.guidFor;var META_DESC=__dependency4__.META_DESC;var EMPTY_META=__dependency4__.EMPTY_META; -var meta=__dependency4__.meta;var getMeta=__dependency4__.getMeta;var setMeta=__dependency4__.setMeta;var metaPath=__dependency4__.metaPath;var inspect=__dependency4__.inspect;var typeOf=__dependency4__.typeOf;var tryCatchFinally=__dependency4__.tryCatchFinally;var isArray=__dependency4__.isArray;var makeArray=__dependency4__.makeArray;var canInvoke=__dependency4__.canInvoke;var tryInvoke=__dependency4__.tryInvoke;var tryFinally=__dependency4__.tryFinally;var wrap=__dependency4__.wrap;var apply=__dependency4__.apply;var applyStr=__dependency4__.applyStr;var EmberError=__dependency5__["default"];var EnumerableUtils=__dependency6__["default"];var create=__dependency7__.create;var platform=__dependency7__.platform;var map=__dependency8__.map;var forEach=__dependency8__.forEach;var filter=__dependency8__.filter;var indexOf=__dependency8__.indexOf;var Logger=__dependency9__["default"];var get=__dependency10__.get;var getWithDefault=__dependency10__.getWithDefault;var normalizeTuple=__dependency10__.normalizeTuple;var _getPath=__dependency10__._getPath;var on=__dependency11__.on;var addListener=__dependency11__.addListener;var removeListener=__dependency11__.removeListener;var suspendListener=__dependency11__.suspendListener;var suspendListeners=__dependency11__.suspendListeners;var sendEvent=__dependency11__.sendEvent;var hasListeners=__dependency11__.hasListeners;var watchedEvents=__dependency11__.watchedEvents;var listenersFor=__dependency11__.listenersFor;var listenersDiff=__dependency11__.listenersDiff;var listenersUnion=__dependency11__.listenersUnion;var ObserverSet=__dependency12__["default"];var propertyWillChange=__dependency13__.propertyWillChange;var propertyDidChange=__dependency13__.propertyDidChange;var overrideChains=__dependency13__.overrideChains;var beginPropertyChanges=__dependency13__.beginPropertyChanges;var endPropertyChanges=__dependency13__.endPropertyChanges;var changeProperties=__dependency13__.changeProperties;var Descriptor=__dependency14__.Descriptor;var defineProperty=__dependency14__.defineProperty;var set=__dependency15__.set;var trySet=__dependency15__.trySet;var OrderedSet=__dependency16__.OrderedSet;var Map=__dependency16__.Map;var MapWithDefault=__dependency16__.MapWithDefault;var getProperties=__dependency17__["default"];var setProperties=__dependency18__["default"];var watchKey=__dependency19__.watchKey;var unwatchKey=__dependency19__.unwatchKey;var flushPendingChains=__dependency20__.flushPendingChains;var removeChainWatcher=__dependency20__.removeChainWatcher;var ChainNode=__dependency20__.ChainNode;var finishChains=__dependency20__.finishChains;var watchPath=__dependency21__.watchPath;var unwatchPath=__dependency21__.unwatchPath;var watch=__dependency22__.watch;var isWatching=__dependency22__.isWatching;var unwatch=__dependency22__.unwatch;var rewatch=__dependency22__.rewatch;var destroy=__dependency22__.destroy;var expandProperties=__dependency23__["default"];var ComputedProperty=__dependency24__.ComputedProperty;var computed=__dependency24__.computed;var cacheFor=__dependency24__.cacheFor;var addObserver=__dependency25__.addObserver;var observersFor=__dependency25__.observersFor;var removeObserver=__dependency25__.removeObserver;var addBeforeObserver=__dependency25__.addBeforeObserver;var _suspendBeforeObserver=__dependency25__._suspendBeforeObserver;var _suspendObserver=__dependency25__._suspendObserver;var _suspendBeforeObservers=__dependency25__._suspendBeforeObservers;var _suspendObservers=__dependency25__._suspendObservers;var beforeObserversFor=__dependency25__.beforeObserversFor;var removeBeforeObserver=__dependency25__.removeBeforeObserver;var IS_BINDING=__dependency26__.IS_BINDING;var mixin=__dependency26__.mixin;var Mixin=__dependency26__.Mixin;var required=__dependency26__.required;var aliasMethod=__dependency26__.aliasMethod;var observer=__dependency26__.observer;var immediateObserver=__dependency26__.immediateObserver;var beforeObserver=__dependency26__.beforeObserver;var Binding=__dependency27__.Binding;var isGlobalPath=__dependency27__.isGlobalPath;var bind=__dependency27__.bind;var oneWay=__dependency27__.oneWay;var run=__dependency28__["default"];var libraries=__dependency29__["default"];var isNone=__dependency30__.isNone;var none=__dependency30__.none;var isEmpty=__dependency31__.isEmpty;var empty=__dependency31__.empty;var isBlank=__dependency32__["default"];var EmberInstrumentation=Ember.Instrumentation={};EmberInstrumentation.instrument=instrument;EmberInstrumentation.subscribe=subscribe;EmberInstrumentation.unsubscribe=unsubscribe;EmberInstrumentation.reset=reset;Ember.instrument=instrument;Ember.subscribe=subscribe;Ember.generateGuid=generateGuid;Ember.GUID_KEY=GUID_KEY;Ember.GUID_PREFIX=GUID_PREFIX;Ember.create=create;Ember.platform=platform;var EmberArrayPolyfills=Ember.ArrayPolyfills={};EmberArrayPolyfills.map=map;EmberArrayPolyfills.forEach=forEach;EmberArrayPolyfills.filter=filter;EmberArrayPolyfills.indexOf=indexOf;Ember.Error=EmberError;Ember.guidFor=guidFor;Ember.META_DESC=META_DESC;Ember.EMPTY_META=EMPTY_META;Ember.meta=meta;Ember.getMeta=getMeta;Ember.setMeta=setMeta;Ember.metaPath=metaPath;Ember.inspect=inspect;Ember.typeOf=typeOf;Ember.tryCatchFinally=tryCatchFinally;Ember.isArray=isArray;Ember.makeArray=makeArray;Ember.canInvoke=canInvoke;Ember.tryInvoke=tryInvoke;Ember.tryFinally=tryFinally;Ember.wrap=wrap;Ember.apply=apply;Ember.applyStr=applyStr;Ember.Logger=Logger;Ember.get=get;Ember.getWithDefault=getWithDefault;Ember.normalizeTuple=normalizeTuple;Ember._getPath=_getPath;Ember.EnumerableUtils=EnumerableUtils;Ember.on=on;Ember.addListener=addListener;Ember.removeListener=removeListener;Ember._suspendListener=suspendListener;Ember._suspendListeners=suspendListeners;Ember.sendEvent=sendEvent;Ember.hasListeners=hasListeners;Ember.watchedEvents=watchedEvents;Ember.listenersFor=listenersFor;Ember.listenersDiff=listenersDiff;Ember.listenersUnion=listenersUnion;Ember._ObserverSet=ObserverSet;Ember.propertyWillChange=propertyWillChange;Ember.propertyDidChange=propertyDidChange;Ember.overrideChains=overrideChains;Ember.beginPropertyChanges=beginPropertyChanges;Ember.endPropertyChanges=endPropertyChanges;Ember.changeProperties=changeProperties;Ember.Descriptor=Descriptor;Ember.defineProperty=defineProperty;Ember.set=set;Ember.trySet=trySet;Ember.OrderedSet=OrderedSet;Ember.Map=Map;Ember.MapWithDefault=MapWithDefault;Ember.getProperties=getProperties;Ember.setProperties=setProperties;Ember.watchKey=watchKey;Ember.unwatchKey=unwatchKey;Ember.flushPendingChains=flushPendingChains;Ember.removeChainWatcher=removeChainWatcher;Ember._ChainNode=ChainNode;Ember.finishChains=finishChains;Ember.watchPath=watchPath;Ember.unwatchPath=unwatchPath;Ember.watch=watch;Ember.isWatching=isWatching;Ember.unwatch=unwatch;Ember.rewatch=rewatch;Ember.destroy=destroy;Ember.expandProperties=expandProperties;Ember.ComputedProperty=ComputedProperty;Ember.computed=computed;Ember.cacheFor=cacheFor;Ember.addObserver=addObserver;Ember.observersFor=observersFor;Ember.removeObserver=removeObserver;Ember.addBeforeObserver=addBeforeObserver;Ember._suspendBeforeObserver=_suspendBeforeObserver;Ember._suspendBeforeObservers=_suspendBeforeObservers;Ember._suspendObserver=_suspendObserver;Ember._suspendObservers=_suspendObservers;Ember.beforeObserversFor=beforeObserversFor;Ember.removeBeforeObserver=removeBeforeObserver;Ember.IS_BINDING=IS_BINDING;Ember.required=required;Ember.aliasMethod=aliasMethod;Ember.observer=observer;Ember.immediateObserver=immediateObserver;Ember.beforeObserver=beforeObserver;Ember.mixin=mixin;Ember.Mixin=Mixin;Ember.oneWay=oneWay;Ember.bind=bind;Ember.Binding=Binding;Ember.isGlobalPath=isGlobalPath;Ember.run=run;Ember.libraries=libraries;Ember.libraries.registerCoreLibrary("Ember",Ember.VERSION);Ember.isNone=isNone;Ember.none=none;Ember.isEmpty=isEmpty;Ember.empty=empty;Ember.isBlank=isBlank;Ember.merge=merge;Ember.onerror=null;if(Ember.__loader.registry["ember-debug"]){requireModule("ember-debug")}__exports__["default"]=Ember});define("ember-metal/array",["exports"],function(__exports__){"use strict";var ArrayPrototype=Array.prototype;var isNativeFunc=function(func){return func&&Function.prototype.toString.call(func).indexOf("[native code]")>-1};var map=isNativeFunc(ArrayPrototype.map)?ArrayPrototype.map:function(fun){if(this===void 0||this===null){throw new TypeError}var t=Object(this);var len=t.length>>>0;if(typeof fun!=="function"){throw new TypeError}var res=new Array(len);var thisp=arguments[1];for(var i=0;i>>0;if(typeof fun!=="function"){throw new TypeError}var thisp=arguments[1];for(var i=0;i("+this._from+" -> "+this._to+")"+oneWay},connect:function(obj){var fromPath=this._from,toPath=this._to;trySet(obj,toPath,getWithGlobals(obj,fromPath));addObserver(obj,fromPath,this,this.fromDidChange);if(!this._oneWay){addObserver(obj,toPath,this,this.toDidChange)}this._readyToSync=true;return this},disconnect:function(obj){var twoWay=!this._oneWay;removeObserver(obj,this._from,this,this.fromDidChange);if(twoWay){removeObserver(obj,this._to,this,this.toDidChange)}this._readyToSync=false;return this},fromDidChange:function(target){this._scheduleSync(target,"fwd")},toDidChange:function(target){this._scheduleSync(target,"back")},_scheduleSync:function(obj,dir){var directionMap=this._directionMap;var existingDir=directionMap.get(obj);if(!existingDir){run.schedule("sync",this,this._sync,obj);directionMap.set(obj,dir)}if(existingDir==="back"&&dir==="fwd"){directionMap.set(obj,"fwd")}},_sync:function(obj){var log=Ember.LOG_BINDINGS;if(obj.isDestroyed||!this._readyToSync){return}var directionMap=this._directionMap;var direction=directionMap.get(obj);var fromPath=this._from,toPath=this._to;directionMap.remove(obj);if(direction==="fwd"){var fromValue=getWithGlobals(obj,this._from);if(log){Ember.Logger.log(" ",this.toString(),"->",fromValue,obj)}if(this._oneWay){trySet(obj,toPath,fromValue)}else{_suspendObserver(obj,toPath,this,this.toDidChange,function(){trySet(obj,toPath,fromValue)})}}else if(direction==="back"){var toValue=get(obj,this._to);if(log){Ember.Logger.log(" ",this.toString(),"<-",toValue,obj)}_suspendObserver(obj,fromPath,this,this.fromDidChange,function(){trySet(isGlobalPath(fromPath)?Ember.lookup:obj,fromPath,toValue)})}}};function mixinProperties(to,from){for(var key in from){if(from.hasOwnProperty(key)){to[key]=from[key]}}}mixinProperties(Binding,{from:function(){var C=this,binding=new C;return binding.from.apply(binding,arguments)},to:function(){var C=this,binding=new C;return binding.to.apply(binding,arguments)},oneWay:function(from,flag){var C=this,binding=new C(null,from);return binding.oneWay(flag)}});function bind(obj,to,from){return new Binding(to,from).connect(obj)}__exports__.bind=bind;function oneWay(obj,to,from){return new Binding(to,from).oneWay().connect(obj)}__exports__.oneWay=oneWay;__exports__.Binding=Binding;__exports__.isGlobalPath=isGlobalPath});define("ember-metal/chains",["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/array","ember-metal/watch_key","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var normalizeTuple=__dependency2__.normalizeTuple;var meta=__dependency3__.meta;var META_KEY=__dependency3__.META_KEY;var forEach=__dependency4__.forEach;var watchKey=__dependency5__.watchKey;var unwatchKey=__dependency5__.unwatchKey;var metaFor=meta,warn=Ember.warn,FIRST_KEY=/^([^\.]+)/;function firstKey(path){return path.match(FIRST_KEY)[0]}var pendingQueue=[];function flushPendingChains(){if(pendingQueue.length===0){return}var queue=pendingQueue;pendingQueue=[];forEach.call(queue,function(q){q[0].add(q[1])});warn("Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos",pendingQueue.length===0)}__exports__.flushPendingChains=flushPendingChains;function addChainWatcher(obj,keyName,node){if(!obj||"object"!==typeof obj){return}var m=metaFor(obj),nodes=m.chainWatchers;if(!m.hasOwnProperty("chainWatchers")){nodes=m.chainWatchers={}}if(!nodes[keyName]){nodes[keyName]=[]}nodes[keyName].push(node);watchKey(obj,keyName,m)}function removeChainWatcher(obj,keyName,node){if(!obj||"object"!==typeof obj){return}var m=obj[META_KEY];if(m&&!m.hasOwnProperty("chainWatchers")){return}var nodes=m&&m.chainWatchers;if(nodes&&nodes[keyName]){nodes=nodes[keyName];for(var i=0,l=nodes.length;i0){paths[path]--}obj=this.value();tuple=normalizeTuple(obj,path);if(tuple[0]===obj){path=tuple[1];key=firstKey(path);path=path.slice(key.length+1)}else{src=tuple[0];key=path.slice(0,0-(tuple[1].length+1));path=tuple[1]}tuple.length=0;this.unchain(key,path)};ChainNodePrototype.count=0;ChainNodePrototype.chain=function(key,path,src){var chains=this._chains,node;if(!chains){chains=this._chains={}}node=chains[key];if(!node){node=chains[key]=new ChainNode(this,key,src)}node.count++;if(path){key=firstKey(path);path=path.slice(key.length+1);node.chain(key,path)}};ChainNodePrototype.unchain=function(key,path){var chains=this._chains,node=chains[key];if(path&&path.length>1){key=firstKey(path);path=path.slice(key.length+1);node.unchain(key,path)}node.count--;if(node.count<=0){delete chains[node._key];node.destroy()}};ChainNodePrototype.willChange=function(events){var chains=this._chains;if(chains){for(var key in chains){if(!chains.hasOwnProperty(key)){continue}chains[key].willChange(events)}}if(this._parent){this._parent.chainWillChange(this,this._key,1,events)}};ChainNodePrototype.chainWillChange=function(chain,path,depth,events){if(this._key){path=this._key+"."+path}if(this._parent){this._parent.chainWillChange(this,path,depth+1,events)}else{if(depth>1){events.push(this.value(),path)}path="this."+path;if(this._paths[path]>0){events.push(this.value(),path)}}};ChainNodePrototype.chainDidChange=function(chain,path,depth,events){if(this._key){path=this._key+"."+path}if(this._parent){this._parent.chainDidChange(this,path,depth+1,events)}else{if(depth>1){events.push(this.value(),path)}path="this."+path;if(this._paths[path]>0){events.push(this.value(),path)}}};ChainNodePrototype.didChange=function(events){if(this._watching){var obj=this._parent.value();if(obj!==this._object){removeChainWatcher(this._object,this._key,this);this._object=obj;addChainWatcher(obj,this._key,this)}this._value=undefined;if(this._parent&&this._parent._key==="@each")this.value()}var chains=this._chains;if(chains){for(var key in chains){if(!chains.hasOwnProperty(key)){continue}chains[key].didChange(events)}}if(events===null){return}if(this._parent){this._parent.chainDidChange(this,this._key,1,events)}};function finishChains(obj){var m=obj[META_KEY],chains=m&&m.chains;if(chains){if(chains.value()!==obj){metaFor(obj).chains=chains=chains.copy(obj)}else{chains.didChange(null)}}}__exports__.finishChains=finishChains;__exports__.removeChainWatcher=removeChainWatcher;__exports__.ChainNode=ChainNode});define("ember-metal/computed",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/watching","ember-metal/expand_properties","ember-metal/error","ember-metal/properties","ember-metal/property_events","ember-metal/is_empty","ember-metal/is_none","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var meta=__dependency4__.meta;var META_KEY=__dependency4__.META_KEY;var guidFor=__dependency4__.guidFor;var typeOf=__dependency4__.typeOf;var inspect=__dependency4__.inspect;var EnumerableUtils=__dependency5__["default"];var create=__dependency6__.create;var watch=__dependency7__.watch;var unwatch=__dependency7__.unwatch;var expandProperties=__dependency8__["default"];var EmberError=__dependency9__["default"];var Descriptor=__dependency10__.Descriptor;var defineProperty=__dependency10__.defineProperty;var propertyWillChange=__dependency11__.propertyWillChange;var propertyDidChange=__dependency11__.propertyDidChange;var isEmpty=__dependency12__["default"];var isNone=__dependency13__.isNone;var metaFor=meta,a_slice=[].slice,o_create=create;function UNDEFINED(){}var lengthPattern=/\.(length|\[\])$/;function keysForDep(depsMeta,depKey){var keys=depsMeta[depKey];if(!keys){keys=depsMeta[depKey]={}}else if(!depsMeta.hasOwnProperty(depKey)){keys=depsMeta[depKey]=o_create(keys)}return keys}function metaForDeps(meta){return keysForDep(meta,"deps")}function addDependentKeys(desc,obj,keyName,meta){var depKeys=desc._dependentKeys,depsMeta,idx,len,depKey,keys;if(!depKeys)return;depsMeta=metaForDeps(meta);for(idx=0,len=depKeys.length;idx1){args=a_slice.call(arguments);func=args.pop()}if(typeof func!=="function"){throw new EmberError("Computed Property declared without a property function")}var cp=new ComputedProperty(func);if(args){cp.property.apply(cp,args)}return cp}function cacheFor(obj,key){var meta=obj[META_KEY],cache=meta&&meta.cache,ret=cache&&cache[key];if(ret===UNDEFINED){return undefined}return ret}cacheFor.set=function(cache,key,value){if(value===undefined){cache[key]=UNDEFINED}else{cache[key]=value}};cacheFor.get=function(cache,key){var ret=cache[key];if(ret===UNDEFINED){return undefined}return ret};cacheFor.remove=function(cache,key){cache[key]=undefined};function getProperties(self,propertyNames){var ret={};for(var i=0;ivalue});registerComputed("gte",function(dependentKey,value){return get(this,dependentKey)>=value});registerComputed("lt",function(dependentKey,value){return get(this,dependentKey)1){set(this,dependentKey,value)}return get(this,dependentKey)})};computed.oneWay=function(dependentKey){return computed(dependentKey,function(){return get(this,dependentKey)})};computed.reads=computed.oneWay;computed.readOnly=function(dependentKey){return computed(dependentKey,function(){return get(this,dependentKey)}).readOnly()};computed.defaultTo=function(defaultPath){return computed(function(key,newValue,cachedValue){if(arguments.length===1){return get(this,defaultPath)}return newValue!=null?newValue:get(this,defaultPath)})};computed.deprecatingAlias=function(dependentKey){return computed(dependentKey,function(key,value){if(arguments.length>1){set(this,dependentKey,value);return value}else{return get(this,dependentKey)}})};__exports__.ComputedProperty=ComputedProperty;__exports__.computed=computed;__exports__.cacheFor=cacheFor});define("ember-metal/core",["exports"],function(__exports__){"use strict";if("undefined"===typeof Ember){Ember={}}var imports=Ember.imports=Ember.imports||this;var exports=Ember.exports=Ember.exports||this;var lookup=Ember.lookup=Ember.lookup||this;exports.Em=exports.Ember=Ember;Ember.isNamespace=true;Ember.toString=function(){return"Ember"};Ember.VERSION="1.7.0-beta.1+canary.83fe4e00";if(Ember.ENV){}else if("undefined"!==typeof EmberENV){Ember.ENV=EmberENV}else if("undefined"!==typeof ENV){Ember.ENV=ENV}else{Ember.ENV={}}Ember.config=Ember.config||{};if("undefined"===typeof Ember.ENV.DISABLE_RANGE_API){Ember.ENV.DISABLE_RANGE_API=true}if("undefined"===typeof MetamorphENV){exports.MetamorphENV={}}MetamorphENV.DISABLE_RANGE_API=Ember.ENV.DISABLE_RANGE_API;Ember.FEATURES=Ember.ENV.FEATURES||{};Ember.FEATURES.isEnabled=function(feature){var featureValue=Ember.FEATURES[feature];if(Ember.ENV.ENABLE_ALL_FEATURES){return true}else if(featureValue===true||featureValue===false||featureValue===undefined){return featureValue}else if(Ember.ENV.ENABLE_OPTIONAL_FEATURES){return true}else{return false}};Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES;if(typeof Ember.EXTEND_PROTOTYPES==="undefined"){Ember.EXTEND_PROTOTYPES=true}Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==false;Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===false?false:Ember.EXTEND_PROTOTYPES;Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===false?false:true;var K=function(){return this};var K=K;__exports__.K=K;Ember.K=K;if("undefined"===typeof Ember.assert){Ember.assert=Ember.K}if("undefined"===typeof Ember.warn){Ember.warn=Ember.K}if("undefined"===typeof Ember.debug){Ember.debug=Ember.K}if("undefined"===typeof Ember.runInDebug){Ember.runInDebug=Ember.K}if("undefined"===typeof Ember.deprecate){Ember.deprecate=Ember.K}if("undefined"===typeof Ember.deprecateFunc){Ember.deprecateFunc=function(_,func){return func}}__exports__["default"]=Ember});define("ember-metal/enumerable_utils",["ember-metal/array","exports"],function(__dependency1__,__exports__){"use strict";var _filter=__dependency1__.filter;var a_forEach=__dependency1__.forEach;var _indexOf=__dependency1__.indexOf;var _map=__dependency1__.map;var splice=Array.prototype.splice;function map(obj,callback,thisArg){return obj.map?obj.map.call(obj,callback,thisArg):_map.call(obj,callback,thisArg)}__exports__.map=map;function forEach(obj,callback,thisArg){return obj.forEach?obj.forEach.call(obj,callback,thisArg):a_forEach.call(obj,callback,thisArg)}__exports__.forEach=forEach;function filter(obj,callback,thisArg){return obj.filter?obj.filter.call(obj,callback,thisArg):_filter.call(obj,callback,thisArg)}__exports__.filter=filter;function indexOf(obj,element,index){return obj.indexOf?obj.indexOf.call(obj,element,index):_indexOf.call(obj,element,index) -}__exports__.indexOf=indexOf;function indexesOf(obj,elements){return elements===undefined?[]:map(elements,function(item){return indexOf(obj,item)})}__exports__.indexesOf=indexesOf;function addObject(array,item){var index=indexOf(array,item);if(index===-1){array.push(item)}}__exports__.addObject=addObject;function removeObject(array,item){var index=indexOf(array,item);if(index!==-1){array.splice(index,1)}}__exports__.removeObject=removeObject;function _replace(array,idx,amt,objects){var args=[].concat(objects),chunk,ret=[],size=6e4,start=idx,ends=amt,count;while(args.length){count=ends>size?size:ends;if(count<=0){count=0}chunk=args.splice(0,size);chunk=[start,count].concat(chunk);start+=size;ends-=count;ret=ret.concat(splice.apply(array,chunk))}return ret}__exports__._replace=_replace;function replace(array,idx,amt,objects){if(array.replace){return array.replace(idx,amt,objects)}else{return _replace(array,idx,amt,objects)}}__exports__.replace=replace;function intersection(array1,array2){var result=[];forEach(array1,function(element){if(indexOf(array2,element)>=0){result.push(element)}});return result}__exports__.intersection=intersection;__exports__["default"]={_replace:_replace,addObject:addObject,filter:filter,forEach:forEach,indexOf:indexOf,indexesOf:indexesOf,intersection:intersection,map:map,removeObject:removeObject,replace:replace}});define("ember-metal/error",["ember-metal/platform","exports"],function(__dependency1__,__exports__){"use strict";var create=__dependency1__.create;var errorProps=["description","fileName","lineNumber","message","name","number","stack"];function EmberError(){var tmp=Error.apply(this,arguments);if(Error.captureStackTrace){Error.captureStackTrace(this,Ember.Error)}for(var idx=0;idx=0;i-=3){if(target===array[i]&&method===array[i+1]){index=i;break}}return index}function actionsFor(obj,eventName){var meta=metaFor(obj,true),actions;if(!meta.listeners){meta.listeners={}}if(!meta.hasOwnProperty("listeners")){meta.listeners=create(meta.listeners)}actions=meta.listeners[eventName];if(actions&&!meta.listeners.hasOwnProperty(eventName)){actions=meta.listeners[eventName]=meta.listeners[eventName].slice()}else if(!actions){actions=meta.listeners[eventName]=[]}return actions}function listenersUnion(obj,eventName,otherActions){var meta=obj[META_KEY],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2],actionIndex=indexOf(otherActions,target,method);if(actionIndex===-1){otherActions.push(target,method,flags)}}}__exports__.listenersUnion=listenersUnion;function listenersDiff(obj,eventName,otherActions){var meta=obj[META_KEY],actions=meta&&meta.listeners&&meta.listeners[eventName],diffActions=[];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2],actionIndex=indexOf(otherActions,target,method);if(actionIndex!==-1){continue}otherActions.push(target,method,flags);diffActions.push(target,method,flags)}return diffActions}__exports__.listenersDiff=listenersDiff;function addListener(obj,eventName,target,method,once){if(!method&&"function"===typeof target){method=target;target=null}var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method),flags=0;if(once)flags|=ONCE;if(actionIndex!==-1){return}actions.push(target,method,flags);if("function"===typeof obj.didAddListener){obj.didAddListener(eventName,target,method)}}__exports__.addListener=addListener;function removeListener(obj,eventName,target,method){if(!method&&"function"===typeof target){method=target;target=null}function _removeListener(target,method){var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method);if(actionIndex===-1){return}actions.splice(actionIndex,3);if("function"===typeof obj.didRemoveListener){obj.didRemoveListener(eventName,target,method)}}if(method){_removeListener(target,method)}else{var meta=obj[META_KEY],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){_removeListener(actions[i],actions[i+1])}}}function suspendListener(obj,eventName,target,method,callback){if(!method&&"function"===typeof target){method=target;target=null}var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method);if(actionIndex!==-1){actions[actionIndex+2]|=SUSPENDED}function tryable(){return callback.call(target)}function finalizer(){if(actionIndex!==-1){actions[actionIndex+2]&=~SUSPENDED}}return tryFinally(tryable,finalizer)}__exports__.suspendListener=suspendListener;function suspendListeners(obj,eventNames,target,method,callback){if(!method&&"function"===typeof target){method=target;target=null}var suspendedActions=[],actionsList=[],eventName,actions,i,l;for(i=0,l=eventNames.length;i=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2];if(!method){continue}if(flags&SUSPENDED){continue}if(flags&ONCE){removeListener(obj,eventName,target,method)}if(!target){target=obj}if("string"===typeof method){if(params){applyStr(target,method,params)}else{target[method]()}}else{if(params){apply(target,method,params)}else{method.call(target)}}}return true}__exports__.sendEvent=sendEvent;function hasListeners(obj,eventName){var meta=obj[META_KEY],actions=meta&&meta.listeners&&meta.listeners[eventName];return!!(actions&&actions.length)}__exports__.hasListeners=hasListeners;function listenersFor(obj,eventName){var ret=[];var meta=obj[META_KEY],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return ret}for(var i=0,l=actions.length;i-1){throw new EmberError("Brace expanded properties cannot contain spaces, "+"e.g. `user.{firstName, lastName}` should be `user.{firstName,lastName}`")}if(match=BRACE_EXPANSION.exec(pattern)){prefix=match[1];list=match[2];forEach(list.split(","),function(suffix){callback(prefix+suffix)})}else{callback(pattern)}}});define("ember-metal/get_properties",["ember-metal/property_get","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var get=__dependency1__.get;var typeOf=__dependency2__.typeOf;__exports__["default"]=function getProperties(obj){var ret={},propertyNames=arguments,i=1;if(arguments.length===2&&typeOf(arguments[1])==="array"){i=0;propertyNames=arguments[1]}for(var len=propertyNames.length;i-1){list.splice(index,1)}},isEmpty:function(){return this.list.length===0},has:function(obj){var guid=guidFor(obj),presenceSet=this.presenceSet;return guid in presenceSet},forEach:function(fn,self){var list=this.toArray();for(var i=0,j=list.length;i0){mixin.mixins=a_map.call(args,function(x){if(x instanceof Mixin){return x}var mixin=new Mixin;mixin.properties=x;return mixin})}return mixin}function isMethod(obj){return"function"===typeof obj&&obj.isMethod!==false&&obj!==Boolean&&obj!==Object&&obj!==Number&&obj!==Array&&obj!==Date&&obj!==String}var CONTINUE={};function mixinProperties(mixinsMeta,mixin){var guid;if(mixin instanceof Mixin){guid=guidFor(mixin);if(mixinsMeta[guid]){return CONTINUE}mixinsMeta[guid]=mixin;return mixin.properties}else{return mixin}}function concatenatedMixinProperties(concatProp,props,values,base){var concats;concats=values[concatProp]||base[concatProp];if(props[concatProp]){concats=concats?concats.concat(props[concatProp]):props[concatProp]}return concats}function giveDescriptorSuper(meta,key,property,values,descs){var superProperty;if(values[key]===undefined){superProperty=descs[key]}superProperty=superProperty||meta.descs[key];if(!superProperty||!(superProperty instanceof ComputedProperty)){return property}property=o_create(property);property.func=wrap(property.func,superProperty.func);return property}function giveMethodSuper(obj,key,method,values,descs){var superMethod;if(descs[key]===undefined){superMethod=values[key]}superMethod=superMethod||obj[key];if("function"!==typeof superMethod){return method}return wrap(method,superMethod)}function applyConcatenatedProperties(obj,key,value,values){var baseValue=values[key]||obj[key];if(baseValue){if("function"===typeof baseValue.concat){return baseValue.concat(value)}else{return makeArray(baseValue).concat(value)}}else{return makeArray(value)}}function applyMergedProperties(obj,key,value,values){var baseValue=values[key]||obj[key];if(!baseValue){return value}var newBase=merge({},baseValue),hasFunction=false;for(var prop in value){if(!value.hasOwnProperty(prop)){continue}var propValue=value[prop];if(isMethod(propValue)){hasFunction=true;newBase[prop]=giveMethodSuper(obj,prop,propValue,baseValue,{})}else{newBase[prop]=propValue}}if(hasFunction){newBase._super=superFunction}return newBase}function addNormalizedProperty(base,key,value,meta,descs,values,concats,mergings){if(value instanceof Descriptor){if(value===REQUIRED&&descs[key]){return CONTINUE}if(value.func){value=giveDescriptorSuper(meta,key,value,values,descs)}descs[key]=value;values[key]=undefined}else{if(concats&&a_indexOf.call(concats,key)>=0||key==="concatenatedProperties"||key==="mergedProperties"){value=applyConcatenatedProperties(base,key,value,values)}else if(mergings&&a_indexOf.call(mergings,key)>=0){value=applyMergedProperties(base,key,value,values)}else if(isMethod(value)){value=giveMethodSuper(base,key,value,values,descs)}descs[key]=undefined;values[key]=value}}function mergeMixins(mixins,m,descs,values,base,keys){var mixin,props,key,concats,mergings,meta;function removeKeys(keyName){delete descs[keyName];delete values[keyName]}for(var i=0,l=mixins.length;i=0){if(_detect(mixins[loc],targetMixin,seen)){return true}}return false}MixinPrototype.detect=function(obj){if(!obj){return false}if(obj instanceof Mixin){return _detect(obj,this,{})}var m=obj[META_KEY],mixins=m&&m.mixins;if(mixins){return!!mixins[guidFor(this)]}return false};MixinPrototype.without=function(){var ret=new Mixin(this);ret._without=a_slice.call(arguments);return ret};function _keys(ret,mixin,seen){if(seen[guidFor(mixin)]){return}seen[guidFor(mixin)]=true;if(mixin.properties){var props=mixin.properties;for(var key in props){if(props.hasOwnProperty(key)){ret[key]=true}}}else if(mixin.mixins){a_forEach.call(mixin.mixins,function(x){_keys(ret,x,seen)})}}MixinPrototype.keys=function(){var keys={},seen={},ret=[];_keys(keys,this,seen);for(var key in keys){if(keys.hasOwnProperty(key)){ret.push(key)}}return ret};Mixin.mixins=function(obj){var m=obj[META_KEY],mixins=m&&m.mixins,ret=[];if(!mixins){return ret}for(var key in mixins){var mixin=mixins[key];if(!mixin.properties){ret.push(mixin)}}return ret};REQUIRED=new Descriptor;REQUIRED.toString=function(){return"(Required Property)"};function required(){return REQUIRED}__exports__.required=required;function Alias(methodName){this.methodName=methodName}Alias.prototype=new Descriptor;function aliasMethod(methodName){return new Alias(methodName)}__exports__.aliasMethod=aliasMethod;function observer(){var func=a_slice.call(arguments,-1)[0];var paths;var addWatchedProperty=function(path){paths.push(path)};var _paths=a_slice.call(arguments,0,-1);if(typeof func!=="function"){func=arguments[0];_paths=a_slice.call(arguments,1)}paths=[];for(var i=0;i<_paths.length;++i){expandProperties(_paths[i],addWatchedProperty)}if(typeof func!=="function"){throw new Ember.Error("Ember.observer called without a function")}func.__ember_observes__=paths;return func}__exports__.observer=observer;function immediateObserver(){for(var i=0,l=arguments.length;i0;if(existingDesc instanceof Descriptor){existingDesc.teardown(obj,keyName)}if(desc instanceof Descriptor){value=desc;descs[keyName]=desc;if(MANDATORY_SETTER&&watching){objectDefineProperty(obj,keyName,{configurable:true,enumerable:true,writable:true,value:undefined})}else{obj[keyName]=undefined}}else{descs[keyName]=undefined;if(desc==null){value=data;if(MANDATORY_SETTER&&watching){meta.values[keyName]=data;objectDefineProperty(obj,keyName,{configurable:true,enumerable:true,set:MANDATORY_SETTER_FUNCTION,get:DEFAULT_GETTER_FUNCTION(keyName)})}else{obj[keyName]=data}}else{value=desc;objectDefineProperty(obj,keyName,desc)}}if(watching){overrideChains(obj,keyName,meta)}if(obj.didDefineProperty){obj.didDefineProperty(obj,keyName,value)}return this}__exports__.defineProperty=defineProperty;function deprecateProperty(object,deprecatedKey,newKey){function deprecate(){}if(platform.hasPropertyAccessors){defineProperty(object,deprecatedKey,{configurable:true,enumerable:false,set:function(value){deprecate();set(object,newKey,value)},get:function(){deprecate();return get(object,newKey)}})}}__exports__.deprecateProperty=deprecateProperty});define("ember-metal/property_events",["ember-metal/utils","ember-metal/events","ember-metal/observer_set","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var META_KEY=__dependency1__.META_KEY;var guidFor=__dependency1__.guidFor;var tryFinally=__dependency1__.tryFinally;var sendEvent=__dependency2__.sendEvent;var listenersUnion=__dependency2__.listenersUnion;var listenersDiff=__dependency2__.listenersDiff;var ObserverSet=__dependency3__["default"];var beforeObserverSet=new ObserverSet;var observerSet=new ObserverSet;var deferred=0;function propertyWillChange(obj,keyName){var m=obj[META_KEY],watching=m&&m.watching[keyName]>0||keyName==="length",proto=m&&m.proto,desc=m&&m.descs[keyName];if(!watching){return}if(proto===obj){return}if(desc&&desc.willChange){desc.willChange(obj,keyName)}dependentKeysWillChange(obj,keyName,m);chainsWillChange(obj,keyName,m);notifyBeforeObservers(obj,keyName)}function propertyDidChange(obj,keyName){var m=obj[META_KEY],watching=m&&m.watching[keyName]>0||keyName==="length",proto=m&&m.proto,desc=m&&m.descs[keyName];if(proto===obj){return}if(desc&&desc.didChange){desc.didChange(obj,keyName)}if(!watching&&keyName!=="length"){return}dependentKeysDidChange(obj,keyName,m);chainsDidChange(obj,keyName,m,false);notifyObservers(obj,keyName)}var WILL_SEEN,DID_SEEN;function dependentKeysWillChange(obj,depKey,meta){if(obj.isDestroying){return}var seen=WILL_SEEN,top=!seen;if(top){seen=WILL_SEEN={}}iterDeps(propertyWillChange,obj,depKey,seen,meta);if(top){WILL_SEEN=null}}function dependentKeysDidChange(obj,depKey,meta){if(obj.isDestroying){return}var seen=DID_SEEN,top=!seen;if(top){seen=DID_SEEN={}}iterDeps(propertyDidChange,obj,depKey,seen,meta);if(top){DID_SEEN=null}}function iterDeps(method,obj,depKey,seen,meta){var guid=guidFor(obj);if(!seen[guid])seen[guid]={};if(seen[guid][depKey])return;seen[guid][depKey]=true;var deps=meta.deps;deps=deps&&deps[depKey];if(deps){for(var key in deps){var desc=meta.descs[key];if(desc&&desc._suspended===obj)continue;method(obj,key)}}}function chainsWillChange(obj,keyName,m){if(!(m.hasOwnProperty("chainWatchers")&&m.chainWatchers[keyName])){return}var nodes=m.chainWatchers[keyName],events=[],i,l;for(i=0,l=nodes.length;i0){ret=meta.values[keyName]}else{ret=obj[keyName]}if(ret===undefined&&"object"===typeof obj&&!(keyName in obj)&&"function"===typeof obj.unknownProperty){return obj.unknownProperty(keyName)}return ret}};if(Ember.config.overrideAccessors){Ember.get=get;Ember.config.overrideAccessors();get=Ember.get}function normalizeTuple(target,path){var hasThis=path.indexOf(HAS_THIS)===0,isGlobal=!hasThis&&IS_GLOBAL_PATH.test(path),key;if(!target||isGlobal)target=Ember.lookup;if(hasThis)path=path.slice(5);if(target===Ember.lookup){key=path.match(FIRST_KEY)[0];target=get(target,key);path=path.slice(key.length+1)}if(!path||path.length===0)throw new EmberError("Path cannot be empty");return[target,path]}function _getPath(root,path){var hasThis,parts,tuple,idx,len;if(root===null&&path.indexOf(".")===-1){return get(Ember.lookup,path)}hasThis=path.indexOf(HAS_THIS)===0;if(!root||hasThis){tuple=normalizeTuple(root,path);root=tuple[0];path=tuple[1];tuple.length=0}parts=path.split(".");len=parts.length;for(idx=0;root!=null&&idx0){if(MANDATORY_SETTER){currentValue=meta.values[keyName]}else{currentValue=obj[keyName]}if(value!==currentValue){propertyWillChange(obj,keyName);if(MANDATORY_SETTER){if(currentValue===undefined&&!(keyName in obj)||!obj.propertyIsEnumerable(keyName)){defineProperty(obj,keyName,null,value)}else{meta.values[keyName]=value}}else{obj[keyName]=value}propertyDidChange(obj,keyName)}}else{obj[keyName]=value}}return value};if(Ember.config.overrideAccessors){Ember.set=set;Ember.config.overrideAccessors();set=Ember.set}function setPath(root,path,value,tolerant){var keyName;keyName=path.slice(path.lastIndexOf(".")+1);path=path===keyName?keyName:path.slice(0,path.length-(keyName.length+1));if(path!=="this"){root=getPath(root,path)}if(!keyName||keyName.length===0){throw new EmberError("Property set failed: You passed an empty path")}if(!root){if(tolerant){return}else{throw new EmberError('Property set failed: object in path "'+path+'" could not be found or was destroyed.')}}return set(root,keyName,value)}function trySet(root,path,value){return set(root,path,value,true)}__exports__.trySet=trySet;__exports__.set=set});define("ember-metal/run_loop",["ember-metal/core","ember-metal/utils","ember-metal/array","ember-metal/property_events","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var Ember=__dependency1__["default"];var apply=__dependency2__.apply;var indexOf=__dependency3__.indexOf;var beginPropertyChanges=__dependency4__.beginPropertyChanges;var endPropertyChanges=__dependency4__.endPropertyChanges;function onBegin(current){run.currentRunLoop=current}function onEnd(current,next){run.currentRunLoop=next}var Backburner=requireModule("backburner").Backburner;var backburner=new Backburner(["sync","actions","destroy"],{sync:{before:beginPropertyChanges,after:endPropertyChanges},defaultQueue:"actions",onBegin:onBegin,onEnd:onEnd,onErrorTarget:Ember,onErrorMethod:"onerror"});var slice=[].slice;var concat=[].concat;__exports__["default"]=run;function run(){return apply(backburner,backburner.run,arguments)}run.join=function(target,method){if(!run.currentRunLoop){return apply(Ember,run,arguments)}var args=slice.call(arguments);args.unshift("actions");apply(run,run.schedule,args)};run.bind=function(target,method){var args=slice.call(arguments);return function(){return apply(run,run.join,args.concat(slice.call(arguments)))}};run.backburner=backburner;run.currentRunLoop=null;run.queues=backburner.queueNames;run.begin=function(){backburner.begin()};run.end=function(){backburner.end()};run.schedule=function(queue,target,method){checkAutoRun();apply(backburner,backburner.schedule,arguments)};run.hasScheduledTimers=function(){return backburner.hasTimers()};run.cancelTimers=function(){backburner.cancelTimers()};run.sync=function(){if(backburner.currentInstance){backburner.currentInstance.queues.sync.flush()}};run.later=function(target,method){return apply(backburner,backburner.later,arguments)};run.once=function(target,method){checkAutoRun();var args=slice.call(arguments);args.unshift("actions");return apply(backburner,backburner.scheduleOnce,args)};run.scheduleOnce=function(queue,target,method){checkAutoRun();return apply(backburner,backburner.scheduleOnce,arguments)};run.next=function(){var args=slice.call(arguments);args.push(1);return apply(backburner,backburner.later,args)};run.cancel=function(timer){return backburner.cancel(timer)};run.debounce=function(){return apply(backburner,backburner.debounce,arguments)};run.throttle=function(){return apply(backburner,backburner.throttle,arguments)};function checkAutoRun(){if(!run.currentRunLoop){}}run._addQueue=function(name,after){if(indexOf.call(run.queues,name)===-1){run.queues.splice(indexOf.call(run.queues,after)+1,0,name)}}});define("ember-metal/set_properties",["ember-metal/property_events","ember-metal/property_set","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var changeProperties=__dependency1__.changeProperties;var set=__dependency2__.set;__exports__["default"]=function setProperties(self,hash){changeProperties(function(){for(var prop in hash){if(hash.hasOwnProperty(prop)){set(self,prop,hash[prop])}}});return self}});define("ember-metal/utils",["ember-metal/core","ember-metal/platform","ember-metal/array","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var platform=__dependency2__.platform;var create=__dependency2__.create;var forEach=__dependency3__.forEach;var _uuid=0;function uuid(){return++_uuid}__exports__.uuid=uuid;var GUID_PREFIX="ember";var o_defineProperty=platform.defineProperty;var o_create=create;var numberCache=[];var stringCache={};var MANDATORY_SETTER=Ember.ENV.MANDATORY_SETTER;var GUID_KEY="__ember"+ +new Date;var GUID_DESC={writable:false,configurable:false,enumerable:false,value:null};function generateGuid(obj,prefix){if(!prefix)prefix=GUID_PREFIX;var ret=prefix+uuid();if(obj){if(obj[GUID_KEY]===null){obj[GUID_KEY]=ret}else{GUID_DESC.value=ret;o_defineProperty(obj,GUID_KEY,GUID_DESC)}}return ret}__exports__.generateGuid=generateGuid;function guidFor(obj){if(obj===undefined)return"(undefined)";if(obj===null)return"(null)";var ret;var type=typeof obj;switch(type){case"number":ret=numberCache[obj];if(!ret)ret=numberCache[obj]="nu"+obj;return ret;case"string":ret=stringCache[obj];if(!ret)ret=stringCache[obj]="st"+uuid();return ret;case"boolean":return obj?"(true)":"(false)";default:if(obj[GUID_KEY])return obj[GUID_KEY];if(obj===Object)return"(Object)";if(obj===Array)return"(Array)";ret="ember"+uuid();if(obj[GUID_KEY]===null){obj[GUID_KEY]=ret}else{GUID_DESC.value=ret;o_defineProperty(obj,GUID_KEY,GUID_DESC)}return ret}}__exports__.guidFor=guidFor;var META_DESC={writable:true,configurable:false,enumerable:false,value:null};var META_KEY="__ember_meta__";var isDefinePropertySimulated=platform.defineProperty.isSimulated;function Meta(obj){this.descs={};this.watching={};this.cache={};this.cacheMeta={};this.source=obj}Meta.prototype={descs:null,deps:null,watching:null,listeners:null,cache:null,cacheMeta:null,source:null,mixins:null,bindings:null,chains:null,chainWatchers:null,values:null,proto:null};if(isDefinePropertySimulated){Meta.prototype.__preventPlainObject__=true;Meta.prototype.toJSON=function(){}}var EMPTY_META=new Meta(null);if(MANDATORY_SETTER){EMPTY_META.values={}}function meta(obj,writable){var ret=obj[META_KEY];if(writable===false)return ret||EMPTY_META;if(!ret){if(!isDefinePropertySimulated)o_defineProperty(obj,META_KEY,META_DESC);ret=new Meta(obj);if(MANDATORY_SETTER){ret.values={}}obj[META_KEY]=ret;ret.descs.constructor=null}else if(ret.source!==obj){if(!isDefinePropertySimulated)o_defineProperty(obj,META_KEY,META_DESC);ret=o_create(ret);ret.descs=o_create(ret.descs);ret.watching=o_create(ret.watching);ret.cache={};ret.cacheMeta={};ret.source=obj;if(MANDATORY_SETTER){ret.values=o_create(ret.values)}obj[META_KEY]=ret}return ret}function getMeta(obj,property){var _meta=meta(obj,false);return _meta[property]}__exports__.getMeta=getMeta;function setMeta(obj,property,value){var _meta=meta(obj,true);_meta[property]=value;return value}__exports__.setMeta=setMeta;function metaPath(obj,path,writable){var _meta=meta(obj,writable),keyName,value;for(var i=0,l=path.length;i1){watching[keyName]--}}__exports__.unwatchKey=unwatchKey});define("ember-metal/watch_path",["ember-metal/utils","ember-metal/chains","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var meta=__dependency1__.meta;var typeOf=__dependency1__.typeOf;var ChainNode=__dependency2__.ChainNode;var metaFor=meta;function chainsFor(obj,meta){var m=meta||metaFor(obj),ret=m.chains;if(!ret){ret=m.chains=new ChainNode(null,null,obj)}else if(ret.value()!==obj){ret=m.chains=ret.copy(obj)}return ret}function watchPath(obj,keyPath,meta){if(keyPath==="length"&&typeOf(obj)==="array"){return}var m=meta||metaFor(obj),watching=m.watching;if(!watching[keyPath]){watching[keyPath]=1;chainsFor(obj,m).add(keyPath)}else{watching[keyPath]=(watching[keyPath]||0)+1}}__exports__.watchPath=watchPath;function unwatchPath(obj,keyPath,meta){var m=meta||metaFor(obj),watching=m.watching;if(watching[keyPath]===1){watching[keyPath]=0;chainsFor(obj,m).remove(keyPath)}else if(watching[keyPath]>1){watching[keyPath]--}}__exports__.unwatchPath=unwatchPath});define("ember-metal/watching",["ember-metal/utils","ember-metal/chains","ember-metal/watch_key","ember-metal/watch_path","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var meta=__dependency1__.meta;var META_KEY=__dependency1__.META_KEY;var GUID_KEY=__dependency1__.GUID_KEY;var typeOf=__dependency1__.typeOf;var generateGuid=__dependency1__.generateGuid;var removeChainWatcher=__dependency2__.removeChainWatcher;var flushPendingChains=__dependency2__.flushPendingChains;var watchKey=__dependency3__.watchKey;var unwatchKey=__dependency3__.unwatchKey;var watchPath=__dependency4__.watchPath;var unwatchPath=__dependency4__.unwatchPath;var metaFor=meta;function isKeyName(path){return path.indexOf(".")===-1}function watch(obj,_keyPath,m){if(_keyPath==="length"&&typeOf(obj)==="array"){return}if(isKeyName(_keyPath)){watchKey(obj,_keyPath,m)}else{watchPath(obj,_keyPath,m)}}__exports__.watch=watch;function isWatching(obj,key){var meta=obj[META_KEY];return(meta&&meta.watching[key])>0}__exports__.isWatching=isWatching;watch.flushPending=flushPendingChains;function unwatch(obj,_keyPath,m){if(_keyPath==="length"&&typeOf(obj)==="array"){return}if(isKeyName(_keyPath)){unwatchKey(obj,_keyPath,m)}else{unwatchPath(obj,_keyPath,m)}}__exports__.unwatch=unwatch;function rewatch(obj){var m=obj[META_KEY],chains=m&&m.chains;if(GUID_KEY in obj&&!obj.hasOwnProperty(GUID_KEY)){generateGuid(obj)}if(chains&&chains.value()!==obj){m.chains=chains.copy(obj)}}__exports__.rewatch=rewatch;var NODE_STACK=[];function destroy(obj){var meta=obj[META_KEY],node,nodes,key,nodeObject;if(meta){obj[META_KEY]=null;node=meta.chains;if(node){NODE_STACK.push(node);while(NODE_STACK.length>0){node=NODE_STACK.pop();nodes=node._chains;if(nodes){for(key in nodes){if(nodes.hasOwnProperty(key)){NODE_STACK.push(nodes[key])}}}if(node._watching){nodeObject=node._object;if(nodeObject){removeChainWatcher(nodeObject,node._key,node)}}}}}}__exports__.destroy=destroy});define("ember-routing-handlebars",["ember-metal/core","ember-handlebars","ember-routing/system/router","ember-routing-handlebars/helpers/shared","ember-routing-handlebars/helpers/link_to","ember-routing-handlebars/helpers/outlet","ember-routing-handlebars/helpers/render","ember-routing-handlebars/helpers/action","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var Ember=__dependency1__["default"];var EmberHandlebars=__dependency2__["default"];var Router=__dependency3__["default"];var resolvePaths=__dependency4__.resolvePaths;var resolveParams=__dependency4__.resolveParams;var deprecatedLinkToHelper=__dependency5__.deprecatedLinkToHelper;var linkToHelper=__dependency5__.linkToHelper;var LinkView=__dependency5__.LinkView;var outletHelper=__dependency6__.outletHelper;var OutletView=__dependency6__.OutletView;var renderHelper=__dependency7__["default"];var ActionHelper=__dependency8__.ActionHelper;var actionHelper=__dependency8__.actionHelper;Router.resolveParams=resolveParams;Router.resolvePaths=resolvePaths;Ember.LinkView=LinkView;EmberHandlebars.ActionHelper=ActionHelper;EmberHandlebars.OutletView=OutletView;EmberHandlebars.registerHelper("render",renderHelper);EmberHandlebars.registerHelper("action",actionHelper);EmberHandlebars.registerHelper("outlet",outletHelper);EmberHandlebars.registerHelper("link-to",linkToHelper);EmberHandlebars.registerHelper("linkTo",deprecatedLinkToHelper);__exports__["default"]=Ember -});define("ember-routing-handlebars/helpers/action",["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/utils","ember-metal/run_loop","ember-views/system/utils","ember-routing/system/router","ember-handlebars","ember-handlebars/ext","ember-handlebars/helpers/view","ember-routing-handlebars/helpers/shared","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var forEach=__dependency3__.forEach;var uuid=__dependency4__.uuid;var run=__dependency5__["default"];var isSimpleClick=__dependency6__.isSimpleClick;var EmberRouter=__dependency7__["default"];var EmberHandlebars=__dependency8__["default"];var handlebarsGet=__dependency9__.handlebarsGet;var viewHelper=__dependency10__.viewHelper;var resolveParams=__dependency11__.resolveParams;var resolvePath=__dependency11__.resolvePath;var SafeString=EmberHandlebars.SafeString;var a_slice=Array.prototype.slice;function args(options,actionName){var ret=[];if(actionName){ret.push(actionName)}var types=options.options.types.slice(1),data=options.options.data;return ret.concat(resolveParams(options.context,options.params,{types:types,data:data}))}var ActionHelper={registeredActions:{}};__exports__.ActionHelper=ActionHelper;var keys=["alt","shift","meta","ctrl"];var POINTER_EVENT_TYPE_REGEX=/^click|mouse|touch/;var isAllowedEvent=function(event,allowedKeys){if(typeof allowedKeys==="undefined"){if(POINTER_EVENT_TYPE_REGEX.test(event.type)){return isSimpleClick(event)}else{allowedKeys=""}}if(allowedKeys.indexOf("any")>=0){return true}var allowed=true;forEach.call(keys,function(key){if(event[key+"Key"]&&allowedKeys.indexOf(key)===-1){allowed=false}});return allowed};ActionHelper.registerAction=function(actionNameOrPath,options,allowedKeys){var actionId=uuid();ActionHelper.registeredActions[actionId]={eventName:options.eventName,handler:function handleRegisteredAction(event){if(!isAllowedEvent(event,allowedKeys)){return true}if(options.preventDefault!==false){event.preventDefault()}if(options.bubbles===false){event.stopPropagation()}var target=options.target,parameters=options.parameters,actionName;if(target.target){target=handlebarsGet(target.root,target.target,target.options)}else{target=target.root}if(options.boundProperty){actionName=resolveParams(parameters.context,[actionNameOrPath],{types:["ID"],data:parameters.options.data})[0];if(typeof actionName==="undefined"||typeof actionName==="function"){actionName=actionNameOrPath}}if(!actionName){actionName=actionNameOrPath}run(function runRegisteredAction(){if(target.send){target.send.apply(target,args(parameters,actionName))}else{target[actionName].apply(target,args(parameters))}})}};options.view.on("willClearRender",function(){delete ActionHelper.registeredActions[actionId]});return actionId};function actionHelper(actionName){var options=arguments[arguments.length-1],contexts=a_slice.call(arguments,1,-1);var hash=options.hash,controller=options.data.keywords.controller;var action={eventName:hash.on||"click",parameters:{context:this,options:options,params:contexts},view:options.data.view,bubbles:hash.bubbles,preventDefault:hash.preventDefault,target:{options:options},boundProperty:options.types[0]==="ID"};if(hash.target){action.target.root=this;action.target.target=hash.target}else if(controller){action.target.root=controller}var actionId=ActionHelper.registerAction(actionName,action,hash.allowedKeys);return new SafeString('data-ember-action="'+actionId+'"')}__exports__.actionHelper=actionHelper});define("ember-routing-handlebars/helpers/link_to",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-runtime/system/lazy_load","ember-runtime/system/string","ember-runtime/system/object","ember-runtime/keys","ember-views/system/utils","ember-views/views/component","ember-handlebars","ember-handlebars/helpers/view","ember-routing/system/router","ember-routing-handlebars/helpers/shared","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var merge=__dependency4__["default"];var run=__dependency5__["default"];var computed=__dependency6__.computed;var onLoad=__dependency7__.onLoad;var fmt=__dependency8__.fmt;var EmberObject=__dependency9__["default"];var keys=__dependency10__["default"];var isSimpleClick=__dependency11__.isSimpleClick;var EmberComponent=__dependency12__["default"];var EmberHandlebars=__dependency13__["default"];var viewHelper=__dependency14__.viewHelper;var EmberRouter=__dependency15__["default"];var resolveParams=__dependency16__.resolveParams;var resolvePaths=__dependency16__.resolvePaths;var routeArgs=__dependency16__.routeArgs;var slice=[].slice;requireModule("ember-handlebars");var numberOfContextsAcceptedByHandler=function(handler,handlerInfos){var req=0;for(var i=0,l=handlerInfos.length;imaximumContexts){currentWhen=leafName}var args=routeArgs(currentWhen,contexts,null);var isActive=router.isActive.apply(router,args);if(!isActive){return false}if(!this.currentWhen&&leafName===loadedParams.targetRouteName){var visibleQueryParams={};merge(visibleQueryParams,loadedParams.queryParams);router._prepareQueryParams(loadedParams.targetRouteName,loadedParams.models,visibleQueryParams);isActive=shallowEqual(visibleQueryParams,router.router.state.queryParams)}if(isActive){return get(this,"activeClass")}}),loading:computed("loadedParams",function computeLinkViewLoading(){if(!get(this,"loadedParams")){return get(this,"loadingClass")}}),router:computed(function(){return get(this,"controller").container.lookup("router:main")}),_invoke:function(event){if(!isSimpleClick(event)){return true}if(this.preventDefault!==false){if(Ember.FEATURES.isEnabled("ember-routing-linkto-target-attribute")){var targetAttribute=get(this,"target");if(!targetAttribute||targetAttribute==="_self"){event.preventDefault()}}else{event.preventDefault()}}if(this.bubbles===false){event.stopPropagation()}if(get(this,"_isDisabled")){return false}if(get(this,"loading")){Ember.Logger.warn("This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.");return false}var router=get(this,"router"),loadedParams=get(this,"loadedParams");var transition=router._doTransition(loadedParams.targetRouteName,loadedParams.models,loadedParams.queryParams);if(get(this,"replace")){transition.method("replace")}var args=routeArgs(loadedParams.targetRouteName,loadedParams.models,transition.state.queryParams);var url=router.router.generate.apply(router.router,args);run.scheduleOnce("routerTransitions",this,this._eagerUpdateUrl,transition,url)},_eagerUpdateUrl:function(transition,href){if(!transition.isActive||!transition.urlMethod){return}if(href.indexOf("#")===0){href=href.slice(1)}var routerjs=get(this,"router.router");if(transition.urlMethod==="update"){routerjs.updateURL(href)}else if(transition.urlMethod==="replace"){routerjs.replaceURL(href)}transition.method(null)},resolvedParams:computed("router.url",function(){var parameters=this.parameters,options=parameters.options,types=options.types,data=options.data,targetRouteName,models;var onlyQueryParamsSupplied=parameters.params.length===0;if(onlyQueryParamsSupplied){var appController=this.container.lookup("controller:application");targetRouteName=get(appController,"currentRouteName");models=[]}else{models=resolveParams(parameters.context,parameters.params,{types:types,data:data});targetRouteName=models.shift()}var suppliedQueryParams=getResolvedQueryParams(this,targetRouteName);return{targetRouteName:targetRouteName,models:models,queryParams:suppliedQueryParams}}),loadedParams:computed("resolvedParams",function computeLinkViewRouteArgs(){var resolvedParams=get(this,"resolvedParams"),router=get(this,"router"),namedRoute=resolvedParams.targetRouteName;if(!namedRoute){return}if(!paramsAreLoaded(resolvedParams.models)){return}return resolvedParams}),queryParamsObject:null,href:computed("loadedParams",function computeLinkViewHref(){if(get(this,"tagName")!=="a"){return}var router=get(this,"router"),loadedParams=get(this,"loadedParams");if(!loadedParams){return get(this,"loadingHref")}var visibleQueryParams={};merge(visibleQueryParams,loadedParams.queryParams);router._prepareQueryParams(loadedParams.targetRouteName,loadedParams.models,visibleQueryParams);var args=routeArgs(loadedParams.targetRouteName,loadedParams.models,visibleQueryParams);var result=router.generate.apply(router,args);return result}),loadingHref:"#"});LinkView.toString=function(){return"LinkView"};if(Ember.FEATURES.isEnabled("ember-routing-linkto-target-attribute")){LinkView.reopen({attributeBindings:["target"],target:null})}function linkToHelper(name){var options=slice.call(arguments,-1)[0],params=slice.call(arguments,0,-1),hash=options.hash;if(params[params.length-1]instanceof QueryParams){hash.queryParamsObject=params.pop()}hash.disabledBinding=hash.disabledWhen;if(!options.fn){var linkTitle=params.shift();var linkType=options.types.shift();var context=this;if(linkType==="ID"){options.linkTextPath=linkTitle;options.fn=function(){return EmberHandlebars.getEscaped(context,linkTitle,options)}}else{options.fn=function(){return linkTitle}}}hash.parameters={context:this,options:options,params:params};options.helperName=options.helperName||"link-to";return viewHelper.call(this,LinkView,options)}EmberHandlebars.registerHelper("query-params",function queryParamsHelper(options){return QueryParams.create({values:options.hash,types:options.hashTypes})});function deprecatedLinkToHelper(){return linkToHelper.apply(this,arguments)}function getResolvedQueryParams(linkView,targetRouteName){var helperParameters=linkView.parameters,queryParamsObject=linkView.queryParamsObject,resolvedQueryParams={};if(!queryParamsObject){return resolvedQueryParams}var rawParams=queryParamsObject.values;for(var key in rawParams){if(!rawParams.hasOwnProperty(key)){continue}var value=rawParams[key],type=queryParamsObject.types[key];if(type==="ID"){var normalizedPath=getNormalizedPath(value,helperParameters);value=EmberHandlebars.get(normalizedPath.root,normalizedPath.path,helperParameters.options)}resolvedQueryParams[key]=value}return resolvedQueryParams}function getNormalizedPath(path,helperParameters){return EmberHandlebars.normalizePath(helperParameters.context,path,helperParameters.options.data)}function paramsAreLoaded(params){for(var i=0,len=params.length;i2){var factory=container.lookupFactory(controllerFullName)||generateControllerFactory(container,controllerName,context);controller=factory.create({model:context,parentController:parentController,target:parentController});view.one("willDestroyElement",function(){controller.destroy()})}else{controller=container.lookup(controllerFullName)||generateController(container,controllerName);controller.setProperties({target:parentController,parentController:parentController})}var root=options.contexts[1];if(root){view.registerObserver(root,contextString,function(){controller.set("model",handlebarsGet(root,contextString,options))})}options.hash.viewName=camelize(name);var templateName="template:"+name;options.hash.template=container.lookup(templateName);options.hash.controller=controller;if(router&&!context){router._connectActiveView(name,view)}options.helperName=options.helperName||'render "'+name+'"';viewHelper.call(this,view,options)}});define("ember-routing-handlebars/helpers/shared",["ember-metal/property_get","ember-metal/array","ember-runtime/mixins/controller","ember-handlebars/ext","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var get=__dependency1__.get;var map=__dependency2__.map;var ControllerMixin=__dependency3__["default"];var handlebarsResolve=__dependency4__.resolveParams;var handlebarsGet=__dependency4__.handlebarsGet;var typeOf=__dependency5__.typeOf;var get=__dependency1__.get;function routeArgs(targetRouteName,models,queryParams){var args=[];if(typeOf(targetRouteName)==="string"){args.push(""+targetRouteName)}args.push.apply(args,models);args.push({queryParams:queryParams});return args}__exports__.routeArgs=routeArgs;function getActiveTargetName(router){var handlerInfos=router.activeTransition?router.activeTransition.state.handlerInfos:router.state.handlerInfos;return handlerInfos[handlerInfos.length-1].name}__exports__.getActiveTargetName=getActiveTargetName;function resolveParams(context,params,options){return map.call(resolvePaths(context,params,options),function(path,i){if(null===path){return params[i]}else{return handlebarsGet(context,path,options)}})}__exports__.resolveParams=resolveParams;function stashParamNames(router,handlerInfos){if(handlerInfos._namesStashed){return}var targetRouteName=handlerInfos[handlerInfos.length-1].name;var recogHandlers=router.router.recognizer.handlersFor(targetRouteName);var dynamicParent=null;for(var i=0,len=handlerInfos.length;i7)},_replacePath:function(path){this._location.replace(this._getOrigin()+path)},_getRootURL:function(){return this.rootURL},_getPath:function(){var pathname=this._location.pathname;if(pathname.charAt(0)!=="/"){pathname="/"+pathname}return pathname},_getHash:EmberLocation._getHash,_getQuery:function(){return this._location.search},_getFullPath:function(){return this._getPath()+this._getQuery()+this._getHash()},_getHistoryPath:function(){var rootURL=this._getRootURL(),path=this._getPath(),hash=this._getHash(),query=this._getQuery(),rootURLIndex=path.indexOf(rootURL),routeHash,hashParts;if(hash.substr(0,2)==="#/"){hashParts=hash.substr(1).split("#");routeHash=hashParts.shift();if(path.slice(-1)==="/"){routeHash=routeHash.substr(1)}path+=routeHash;path+=query;if(hashParts.length){path+="#"+hashParts.join("#")}}else{path+=query;path+=hash}return path},_getHashPath:function(){var rootURL=this._getRootURL(),path=rootURL,historyPath=this._getHistoryPath(),routePath=historyPath.substr(rootURL.length);if(routePath!==""){if(routePath.charAt(0)!=="/"){routePath="/"+routePath}path+="#"+routePath}return path},create:function(options){if(options&&options.rootURL){this.rootURL=options.rootURL}var historyPath,hashPath,cancelRouterSetup=false,implementationClass=this._NoneLocation,currentPath=this._getFullPath();if(this._getSupportsHistory()){historyPath=this._getHistoryPath();if(currentPath===historyPath){implementationClass=this._HistoryLocation}else{cancelRouterSetup=true;this._replacePath(historyPath)}}else if(this._getSupportsHashChange()){hashPath=this._getHashPath();if(currentPath===hashPath||currentPath==="/"&&hashPath==="/#/"){implementationClass=this._HashLocation}else{cancelRouterSetup=true;this._replacePath(hashPath)}}var implementation=implementationClass.create.apply(implementationClass,arguments);if(cancelRouterSetup){set(implementation,"cancelRouterSetup",true)}return implementation}}});define("ember-routing/location/hash_location",["ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","ember-metal/utils","ember-runtime/system/object","ember-routing/location/api","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict"; -var get=__dependency1__.get;var set=__dependency2__.set;var run=__dependency3__["default"];var guidFor=__dependency4__.guidFor;var EmberObject=__dependency5__["default"];var EmberLocation=__dependency6__["default"];var jQuery=__dependency7__["default"];__exports__["default"]=EmberObject.extend({implementation:"hash",init:function(){set(this,"location",get(this,"_location")||window.location)},getHash:EmberLocation._getHash,getURL:function(){return this.getHash().substr(1)},setURL:function(path){get(this,"location").hash=path;set(this,"lastSetURL",path)},replaceURL:function(path){get(this,"location").replace("#"+path);set(this,"lastSetURL",path)},onUpdateURL:function(callback){var self=this;var guid=guidFor(this);jQuery(window).on("hashchange.ember-location-"+guid,function(){run(function(){var path=self.getURL();if(get(self,"lastSetURL")===path){return}set(self,"lastSetURL",null);callback(path)})})},formatURL:function(url){return"#"+url},willDestroy:function(){var guid=guidFor(this);jQuery(window).off("hashchange.ember-location-"+guid)}})});define("ember-routing/location/history_location",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-runtime/system/object","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var EmberObject=__dependency5__["default"];var jQuery=__dependency6__["default"];var popstateFired=false;var supportsHistoryState=window.history&&"state"in window.history;__exports__["default"]=EmberObject.extend({implementation:"history",init:function(){set(this,"location",get(this,"location")||window.location);set(this,"baseURL",jQuery("base").attr("href")||"")},initState:function(){set(this,"history",get(this,"history")||window.history);this.replaceState(this.formatURL(this.getURL()))},rootURL:"/",getURL:function(){var rootURL=get(this,"rootURL"),location=get(this,"location"),path=location.pathname,baseURL=get(this,"baseURL");rootURL=rootURL.replace(/\/$/,"");baseURL=baseURL.replace(/\/$/,"");var url=path.replace(baseURL,"").replace(rootURL,"");var search=location.search||"";url+=search;return url},setURL:function(path){var state=this.getState();path=this.formatURL(path);if(!state||state.path!==path){this.pushState(path)}},replaceURL:function(path){var state=this.getState();path=this.formatURL(path);if(!state||state.path!==path){this.replaceState(path)}},getState:function(){return supportsHistoryState?get(this,"history").state:this._historyState},pushState:function(path){var state={path:path};get(this,"history").pushState(state,null,path);if(!supportsHistoryState){this._historyState=state}this._previousURL=this.getURL()},replaceState:function(path){var state={path:path};get(this,"history").replaceState(state,null,path);if(!supportsHistoryState){this._historyState=state}this._previousURL=this.getURL()},onUpdateURL:function(callback){var guid=guidFor(this),self=this;jQuery(window).on("popstate.ember-location-"+guid,function(e){if(!popstateFired){popstateFired=true;if(self.getURL()===self._previousURL){return}}callback(self.getURL())})},formatURL:function(url){var rootURL=get(this,"rootURL"),baseURL=get(this,"baseURL");if(url!==""){rootURL=rootURL.replace(/\/$/,"");baseURL=baseURL.replace(/\/$/,"")}else if(baseURL.match(/^\//)&&rootURL.match(/^\//)){baseURL=baseURL.replace(/\/$/,"")}return baseURL+rootURL+url},willDestroy:function(){var guid=guidFor(this);jQuery(window).off("popstate.ember-location-"+guid)}})});define("ember-routing/location/none_location",["ember-metal/property_get","ember-metal/property_set","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var EmberObject=__dependency3__["default"];__exports__["default"]=EmberObject.extend({implementation:"none",path:"",getURL:function(){return get(this,"path")},setURL:function(path){set(this,"path",path)},onUpdateURL:function(callback){this.updateCallback=callback},handleURL:function(url){set(this,"path",url);this.updateCallback(url)},formatURL:function(url){return url}})});define("ember-routing/system/cache",["ember-runtime/system/object","exports"],function(__dependency1__,__exports__){"use strict";var EmberObject=__dependency1__["default"];__exports__["default"]=EmberObject.extend({init:function(){this.cache={}},has:function(bucketKey){return bucketKey in this.cache},stash:function(bucketKey,key,value){var bucket=this.cache[bucketKey];if(!bucket){bucket=this.cache[bucketKey]={}}bucket[key]=value},lookup:function(bucketKey,prop,defaultValue){var cache=this.cache;if(!(bucketKey in cache)){return defaultValue}var bucket=cache[bucketKey];if(prop in bucket){return bucket[prop]}else{return defaultValue}},cache:null})});define("ember-routing/system/controller_for",["exports"],function(__exports__){"use strict";__exports__["default"]=function controllerFor(container,controllerName,lookupOptions){return container.lookup("controller:"+controllerName,lookupOptions)}});define("ember-routing/system/dsl",["ember-metal/core","exports"],function(__dependency1__,__exports__){"use strict";var Ember=__dependency1__["default"];function DSL(name){this.parent=name;this.matches=[]}__exports__["default"]=DSL;DSL.prototype={resource:function(name,options,callback){if(arguments.length===2&&typeof options==="function"){callback=options;options={}}if(arguments.length===1){options={}}if(typeof options.path!=="string"){options.path="/"+name}var createSubRoutes=false;if(Ember.FEATURES.isEnabled("ember-routing-consistent-resources")){createSubRoutes=true}else{if(callback){createSubRoutes=true}}if(createSubRoutes){var dsl=new DSL(name);route(dsl,"loading");route(dsl,"error",{path:"/_unused_dummy_error_path_route_"+name+"/:error"});if(callback){callback.call(dsl)}this.push(options.path,name,dsl.generate())}else{this.push(options.path,name,null)}if(Ember.FEATURES.isEnabled("ember-routing-named-substates")){name=name.split(".").pop();route(this,name+"_loading");route(this,name+"_error",{path:"/_unused_dummy_error_path_route_"+name+"/:error"})}},push:function(url,name,callback){var parts=name.split(".");if(url===""||url==="/"||parts[parts.length-1]==="index"){this.explicitIndex=true}this.matches.push([url,name,callback])},route:function(name,options){route(this,name,options);if(Ember.FEATURES.isEnabled("ember-routing-named-substates")){route(this,name+"_loading");route(this,name+"_error",{path:"/_unused_dummy_error_path_route_"+name+"/:error"})}},generate:function(){var dslMatches=this.matches;if(!this.explicitIndex){this.route("index",{path:"/"})}return function(match){for(var i=0,l=dslMatches.length;i1){var qp0=qps[0].qp,qp1=qps[1].qp}var qp=qps[0].qp;queryParams[qp.urlKey]=qp.route.serializeQueryParam(qps[0].value,qp.urlKey,qp.type)}},_deserializeQueryParams:function(targetRouteName,queryParams){forEachQueryParam(this,targetRouteName,queryParams,function(key,value,qp){delete queryParams[key];queryParams[qp.prop]=qp.route.deserializeQueryParam(value,qp.urlKey,qp.type)})},_pruneDefaultQueryParamValues:function(targetRouteName,queryParams){var qps=this._queryParamsFor(targetRouteName);for(var key in queryParams){var qp=qps.map[key];if(qp&&qp.sdef===queryParams[key]){delete queryParams[key]}}},_doTransition:function(_targetRouteName,models,_queryParams){var targetRouteName=_targetRouteName||getActiveTargetName(this.router);var queryParams={};merge(queryParams,_queryParams);this._prepareQueryParams(targetRouteName,models,queryParams);var transitionArgs=routeArgs(targetRouteName,models,queryParams); -var transitionPromise=this.router.transitionTo.apply(this.router,transitionArgs);listenForTransitionErrors(transitionPromise);return transitionPromise},_prepareQueryParams:function(targetRouteName,models,queryParams){this._hydrateUnsuppliedQueryParams(targetRouteName,models,queryParams);this._serializeQueryParams(targetRouteName,queryParams);this._pruneDefaultQueryParamValues(targetRouteName,queryParams)},_queryParamsFor:function(leafRouteName){if(this._qpCache[leafRouteName]){return this._qpCache[leafRouteName]}var map={},qps=[],qpCache=this._qpCache[leafRouteName]={map:map,qps:qps};var routerjs=this.router,recogHandlerInfos=routerjs.recognizer.handlersFor(leafRouteName);for(var i=0,len=recogHandlerInfos.length;i=0;--i){var handlerInfo=handlerInfos[i],route=handlerInfo.handler;if(!originRouteFound){if(originRoute===route){originRouteFound=true}continue}if(callback(route,handlerInfos[i+1].handler)!==true){return false}}return true}var defaultActionHandlers={willResolveModel:function(transition,originRoute){originRoute.router._scheduleLoadingEvent(transition,originRoute)},error:function(error,transition,originRoute){var router=originRoute.router;var tryTopLevel=forEachRouteAbove(originRoute,transition,function(route,childRoute){var childErrorRouteName=findChildRouteName(route,childRoute,"error");if(childErrorRouteName){router.intermediateTransitionTo(childErrorRouteName,error);return}return true});if(tryTopLevel){if(routeHasBeenDefined(originRoute.router,"application_error")){router.intermediateTransitionTo("application_error",error);return}}else{return}var errorArgs=["Error while processing route: "+transition.targetName];if(error){if(error.message){errorArgs.push(error.message)}if(error.stack){errorArgs.push(error.stack)}if(typeof error==="string"){errorArgs.push(error)}}Ember.Logger.error.apply(this,errorArgs)},loading:function(transition,originRoute){var router=originRoute.router;var tryTopLevel=forEachRouteAbove(originRoute,transition,function(route,childRoute){var childLoadingRouteName=findChildRouteName(route,childRoute,"loading");if(childLoadingRouteName){router.intermediateTransitionTo(childLoadingRouteName);return}if(transition.pivotHandler!==route){return true}});if(tryTopLevel){if(routeHasBeenDefined(originRoute.router,"application_loading")){router.intermediateTransitionTo("application_loading");return}}}};function findChildRouteName(parentRoute,originatingChildRoute,name){var router=parentRoute.router,childName,targetChildRouteName=originatingChildRoute.routeName.split(".").pop(),namespace=parentRoute.routeName==="application"?"":parentRoute.routeName+".";if(Ember.FEATURES.isEnabled("ember-routing-named-substates")){childName=namespace+targetChildRouteName+"_"+name;if(routeHasBeenDefined(router,childName)){return childName}}childName=namespace+name;if(routeHasBeenDefined(router,childName)){return childName}}function routeHasBeenDefined(router,name){var container=router.container;return router.hasRoute(name)&&(container.has("template:"+name)||container.has("route:"+name))}function triggerEvent(handlerInfos,ignoreFailure,args){var name=args.shift();if(!handlerInfos){if(ignoreFailure){return}throw new EmberError("Can't trigger action '"+name+"' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call `.send()` on the `Transition` object passed to the `model/beforeModel/afterModel` hooks.")}var eventWasHandled=false;for(var i=handlerInfos.length-1;i>=0;i--){var handlerInfo=handlerInfos[i],handler=handlerInfo.handler;if(handler._actions&&handler._actions[name]){if(handler._actions[name].apply(handler,args)===true){eventWasHandled=true}else{return}}}if(defaultActionHandlers[name]){defaultActionHandlers[name].apply(null,args);return}if(!eventWasHandled&&!ignoreFailure){throw new EmberError("Nothing handled the action '"+name+"'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.")}}function calculatePostTransitionState(emberRouter,leafRouteName,contexts){var routerjs=emberRouter.router;var state=routerjs.applyIntent(leafRouteName,contexts);var handlerInfos=state.handlerInfos;var params=state.params;for(var i=0,len=handlerInfos.length;itype2Index){return 1}switch(type1){case"boolean":case"number":if(vw){return 1}return 0;case"string":var comp=v.localeCompare(w);if(comp<0){return-1}if(comp>0){return 1}return 0;case"array":var vLen=v.length;var wLen=w.length;var l=Math.min(vLen,wLen);var r=0;var i=0;while(r===0&&iwLen){return 1}return 0;case"instance":if(Comparable&&Comparable.detect(v)){return v.compare(v,w)}return 0;case"date":var vNum=v.getTime();var wNum=w.getTime();if(vNumwNum){return 1}return 0;default:return 0}}});define("ember-runtime/computed/array_computed",["ember-metal/core","ember-runtime/computed/reduce_computed","ember-metal/enumerable_utils","ember-metal/platform","ember-metal/observer","ember-metal/error","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var reduceComputed=__dependency2__.reduceComputed;var ReduceComputedProperty=__dependency2__.ReduceComputedProperty;var forEach=__dependency3__.forEach;var o_create=__dependency4__.create;var addObserver=__dependency5__.addObserver;var EmberError=__dependency6__["default"];var a_slice=[].slice;function ArrayComputedProperty(){var cp=this;ReduceComputedProperty.apply(this,arguments);this.func=function(reduceFunc){return function(propertyName){if(!cp._hasInstanceMeta(this,propertyName)){forEach(cp._dependentKeys,function(dependentKey){addObserver(this,dependentKey,function(){cp.recomputeOnce.call(this,propertyName)})},this)}return reduceFunc.apply(this,arguments)}}(this.func);return this}ArrayComputedProperty.prototype=o_create(ReduceComputedProperty.prototype);ArrayComputedProperty.prototype.initialValue=function(){return Ember.A()};ArrayComputedProperty.prototype.resetValue=function(array){array.clear();return array};ArrayComputedProperty.prototype.didChange=function(obj,keyName){return};function arrayComputed(options){var args;if(arguments.length>1){args=a_slice.call(arguments,0,-1);options=a_slice.call(arguments,-1)[0]}if(typeof options!=="object"){throw new EmberError("Array Computed Property declared without an options hash")}var cp=new ArrayComputedProperty(options);if(args){cp.property.apply(cp,args)}return cp}__exports__.arrayComputed=arrayComputed;__exports__.ArrayComputedProperty=ArrayComputedProperty});define("ember-runtime/computed/reduce_computed",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/property_events","ember-metal/expand_properties","ember-metal/observer","ember-metal/computed","ember-metal/platform","ember-metal/enumerable_utils","ember-runtime/system/tracked_array","ember-runtime/mixins/array","ember-metal/run_loop","ember-runtime/system/set","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__exports__){"use strict";var Ember=__dependency1__["default"];var e_get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var metaFor=__dependency4__.meta;var EmberError=__dependency5__["default"];var propertyWillChange=__dependency6__.propertyWillChange;var propertyDidChange=__dependency6__.propertyDidChange;var expandProperties=__dependency7__["default"];var addObserver=__dependency8__.addObserver;var observersFor=__dependency8__.observersFor;var removeObserver=__dependency8__.removeObserver;var addBeforeObserver=__dependency8__.addBeforeObserver;var removeBeforeObserver=__dependency8__.removeBeforeObserver;var ComputedProperty=__dependency9__.ComputedProperty;var cacheFor=__dependency9__.cacheFor;var o_create=__dependency10__.create;var forEach=__dependency11__.forEach;var TrackedArray=__dependency12__["default"];var EmberArray=__dependency13__["default"];var run=__dependency14__["default"];var Set=__dependency15__["default"];var isArray=__dependency4__.isArray;var cacheSet=cacheFor.set;var cacheGet=cacheFor.get;var cacheRemove=cacheFor.remove;var a_slice=[].slice;var eachPropertyPattern=/^(.*)\.@each\.(.*)/;var doubleEachPropertyPattern=/(.*\.@each){2,}/;var arrayBracketPattern=/\.\[\]$/;function get(obj,key){if(key==="@this"){return obj}return e_get(obj,key)}function DependentArraysObserver(callbacks,cp,instanceMeta,context,propertyName,sugarMeta){this.callbacks=callbacks;this.cp=cp;this.instanceMeta=instanceMeta;this.dependentKeysByGuid={};this.trackedArraysByGuid={};this.suspended=false;this.changedItems={};this.changedItemCount=0}function ItemPropertyObserverContext(dependentArray,index,trackedArray){this.dependentArray=dependentArray;this.index=index;this.item=dependentArray.objectAt(index);this.trackedArray=trackedArray;this.beforeObserver=null;this.observer=null;this.destroyed=false}DependentArraysObserver.prototype={setValue:function(newValue){this.instanceMeta.setValue(newValue,true)},getValue:function(){return this.instanceMeta.getValue()},setupObservers:function(dependentArray,dependentKey){this.dependentKeysByGuid[guidFor(dependentArray)]=dependentKey;dependentArray.addArrayObserver(this,{willChange:"dependentArrayWillChange",didChange:"dependentArrayDidChange"});if(this.cp._itemPropertyKeys[dependentKey]){this.setupPropertyObservers(dependentKey,this.cp._itemPropertyKeys[dependentKey])}},teardownObservers:function(dependentArray,dependentKey){var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey]||[];delete this.dependentKeysByGuid[guidFor(dependentArray)];this.teardownPropertyObservers(dependentKey,itemPropertyKeys);dependentArray.removeArrayObserver(this,{willChange:"dependentArrayWillChange",didChange:"dependentArrayDidChange"})},suspendArrayObservers:function(callback,binding){var oldSuspended=this.suspended;this.suspended=true;callback.call(binding);this.suspended=oldSuspended},setupPropertyObservers:function(dependentKey,itemPropertyKeys){var dependentArray=get(this.instanceMeta.context,dependentKey),length=get(dependentArray,"length"),observerContexts=new Array(length);this.resetTransformations(dependentKey,observerContexts);forEach(dependentArray,function(item,index){var observerContext=this.createPropertyObserverContext(dependentArray,index,this.trackedArraysByGuid[dependentKey]);observerContexts[index]=observerContext;forEach(itemPropertyKeys,function(propertyKey){addBeforeObserver(item,propertyKey,this,observerContext.beforeObserver);addObserver(item,propertyKey,this,observerContext.observer)},this)},this)},teardownPropertyObservers:function(dependentKey,itemPropertyKeys){var dependentArrayObserver=this,trackedArray=this.trackedArraysByGuid[dependentKey],beforeObserver,observer,item;if(!trackedArray){return}trackedArray.apply(function(observerContexts,offset,operation){if(operation===TrackedArray.DELETE){return}forEach(observerContexts,function(observerContext){observerContext.destroyed=true;beforeObserver=observerContext.beforeObserver;observer=observerContext.observer;item=observerContext.item;forEach(itemPropertyKeys,function(propertyKey){removeBeforeObserver(item,propertyKey,dependentArrayObserver,beforeObserver);removeObserver(item,propertyKey,dependentArrayObserver,observer)})})})},createPropertyObserverContext:function(dependentArray,index,trackedArray){var observerContext=new ItemPropertyObserverContext(dependentArray,index,trackedArray);this.createPropertyObserver(observerContext);return observerContext},createPropertyObserver:function(observerContext){var dependentArrayObserver=this;observerContext.beforeObserver=function(obj,keyName){return dependentArrayObserver.itemPropertyWillChange(obj,keyName,observerContext.dependentArray,observerContext)};observerContext.observer=function(obj,keyName){return dependentArrayObserver.itemPropertyDidChange(obj,keyName,observerContext.dependentArray,observerContext)}},resetTransformations:function(dependentKey,observerContexts){this.trackedArraysByGuid[dependentKey]=new TrackedArray(observerContexts)},trackAdd:function(dependentKey,index,newItems){var trackedArray=this.trackedArraysByGuid[dependentKey];if(trackedArray){trackedArray.addItems(index,newItems)}},trackRemove:function(dependentKey,index,removedCount){var trackedArray=this.trackedArraysByGuid[dependentKey];if(trackedArray){return trackedArray.removeItems(index,removedCount)}return[]},updateIndexes:function(trackedArray,array){var length=get(array,"length");trackedArray.apply(function(observerContexts,offset,operation,operationIndex){if(operation===TrackedArray.DELETE){return}if(operationIndex===0&&operation===TrackedArray.RETAIN&&observerContexts.length===length&&offset===0){return}forEach(observerContexts,function(context,index){context.index=index+offset})})},dependentArrayWillChange:function(dependentArray,index,removedCount,addedCount){if(this.suspended){return}var removedItem=this.callbacks.removedItem;var changeMeta;var guid=guidFor(dependentArray);var dependentKey=this.dependentKeysByGuid[guid];var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey]||[];var length=get(dependentArray,"length");var normalizedIndex=normalizeIndex(index,length,0);var normalizedRemoveCount=normalizeRemoveCount(normalizedIndex,length,removedCount);var item,itemIndex,sliceIndex,observerContexts;observerContexts=this.trackRemove(dependentKey,normalizedIndex,normalizedRemoveCount);function removeObservers(propertyKey){observerContexts[sliceIndex].destroyed=true;removeBeforeObserver(item,propertyKey,this,observerContexts[sliceIndex].beforeObserver);removeObserver(item,propertyKey,this,observerContexts[sliceIndex].observer)}for(sliceIndex=normalizedRemoveCount-1;sliceIndex>=0;--sliceIndex){itemIndex=normalizedIndex+sliceIndex;if(itemIndex>=length){break}item=dependentArray.objectAt(itemIndex);forEach(itemPropertyKeys,removeObservers,this);changeMeta=new ChangeMeta(dependentArray,item,itemIndex,this.instanceMeta.propertyName,this.cp,normalizedRemoveCount);this.setValue(removedItem.call(this.instanceMeta.context,this.getValue(),item,changeMeta,this.instanceMeta.sugarMeta))}},dependentArrayDidChange:function(dependentArray,index,removedCount,addedCount){if(this.suspended){return}var addedItem=this.callbacks.addedItem;var guid=guidFor(dependentArray);var dependentKey=this.dependentKeysByGuid[guid];var observerContexts=new Array(addedCount);var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey];var length=get(dependentArray,"length");var normalizedIndex=normalizeIndex(index,length,addedCount);var changeMeta,observerContext;forEach(dependentArray.slice(normalizedIndex,normalizedIndex+addedCount),function(item,sliceIndex){if(itemPropertyKeys){observerContext=observerContexts[sliceIndex]=this.createPropertyObserverContext(dependentArray,normalizedIndex+sliceIndex,this.trackedArraysByGuid[dependentKey]);forEach(itemPropertyKeys,function(propertyKey){addBeforeObserver(item,propertyKey,this,observerContext.beforeObserver);addObserver(item,propertyKey,this,observerContext.observer)},this)}changeMeta=new ChangeMeta(dependentArray,item,normalizedIndex+sliceIndex,this.instanceMeta.propertyName,this.cp,addedCount);this.setValue(addedItem.call(this.instanceMeta.context,this.getValue(),item,changeMeta,this.instanceMeta.sugarMeta))},this);this.trackAdd(dependentKey,normalizedIndex,observerContexts)},itemPropertyWillChange:function(obj,keyName,array,observerContext){var guid=guidFor(obj);if(!this.changedItems[guid]){this.changedItems[guid]={array:array,observerContext:observerContext,obj:obj,previousValues:{}}}++this.changedItemCount;this.changedItems[guid].previousValues[keyName]=get(obj,keyName)},itemPropertyDidChange:function(obj,keyName,array,observerContext){if(--this.changedItemCount===0){this.flushChanges()}},flushChanges:function(){var changedItems=this.changedItems,key,c,changeMeta;for(key in changedItems){c=changedItems[key];if(c.observerContext.destroyed){continue}this.updateIndexes(c.observerContext.trackedArray,c.observerContext.dependentArray);changeMeta=new ChangeMeta(c.array,c.obj,c.observerContext.index,this.instanceMeta.propertyName,this.cp,changedItems.length,c.previousValues);this.setValue(this.callbacks.removedItem.call(this.instanceMeta.context,this.getValue(),c.obj,changeMeta,this.instanceMeta.sugarMeta));this.setValue(this.callbacks.addedItem.call(this.instanceMeta.context,this.getValue(),c.obj,changeMeta,this.instanceMeta.sugarMeta))}this.changedItems={}}};function normalizeIndex(index,length,newItemsOffset){if(index<0){return Math.max(0,length+index)}else if(index1){args=a_slice.call(arguments,0,-1);options=a_slice.call(arguments,-1)[0]}if(typeof options!=="object"){throw new EmberError("Reduce Computed Property declared without an options hash")}if(!("initialValue"in options)){throw new EmberError("Reduce Computed Property declared without an initial value")}var cp=new ReduceComputedProperty(options);if(args){cp.property.apply(cp,args)}return cp}__exports__.reduceComputed=reduceComputed});define("ember-runtime/computed/reduce_computed_macros",["ember-metal/core","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/run_loop","ember-metal/observer","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/system/object_proxy","ember-runtime/system/subarray","ember-runtime/keys","ember-runtime/compare","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__exports__){"use strict";var Ember=__dependency1__["default"];var merge=__dependency2__["default"];var get=__dependency3__.get;var set=__dependency4__.set;var isArray=__dependency5__.isArray;var guidFor=__dependency5__.guidFor;var EmberError=__dependency6__["default"];var forEach=__dependency7__.forEach;var run=__dependency8__["default"];var addObserver=__dependency9__.addObserver;var arrayComputed=__dependency10__.arrayComputed;var reduceComputed=__dependency11__.reduceComputed;var ObjectProxy=__dependency12__["default"];var SubArray=__dependency13__["default"];var keys=__dependency14__["default"];var compare=__dependency15__["default"];var a_slice=[].slice;function sum(dependentKey){return reduceComputed(dependentKey,{initialValue:0,addedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return accumulatedValue+item},removedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return accumulatedValue-item}})}__exports__.sum=sum;function max(dependentKey){return reduceComputed(dependentKey,{initialValue:-Infinity,addedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return Math.max(accumulatedValue,item)},removedItem:function(accumulatedValue,item,changeMeta,instanceMeta){if(itemaccumulatedValue){return accumulatedValue}}})}__exports__.min=min;function map(dependentKey,callback){var options={addedItem:function(array,item,changeMeta,instanceMeta){var mapped=callback.call(this,item);array.insertAt(changeMeta.index,mapped);return array},removedItem:function(array,item,changeMeta,instanceMeta){array.removeAt(changeMeta.index,1);return array}};return arrayComputed(dependentKey,options)}__exports__.map=map;function mapBy(dependentKey,propertyKey){var callback=function(item){return get(item,propertyKey)};return map(dependentKey+".@each."+propertyKey,callback)}__exports__.mapBy=mapBy;var mapProperty=mapBy;__exports__.mapProperty=mapProperty;function filter(dependentKey,callback){var options={initialize:function(array,changeMeta,instanceMeta){instanceMeta.filteredArrayIndexes=new SubArray},addedItem:function(array,item,changeMeta,instanceMeta){var match=!!callback.call(this,item),filterIndex=instanceMeta.filteredArrayIndexes.addItem(changeMeta.index,match);if(match){array.insertAt(filterIndex,item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var filterIndex=instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);if(filterIndex>-1){array.removeAt(filterIndex)}return array}};return arrayComputed(dependentKey,options)}__exports__.filter=filter;function filterBy(dependentKey,propertyKey,value){var callback;if(arguments.length===2){callback=function(item){return get(item,propertyKey)}}else{callback=function(item){return get(item,propertyKey)===value}}return filter(dependentKey+".@each."+propertyKey,callback)}__exports__.filterBy=filterBy;var filterProperty=filterBy;__exports__.filterProperty=filterProperty;function uniq(){var args=a_slice.call(arguments);args.push({initialize:function(array,changeMeta,instanceMeta){instanceMeta.itemCounts={}},addedItem:function(array,item,changeMeta,instanceMeta){var guid=guidFor(item);if(!instanceMeta.itemCounts[guid]){instanceMeta.itemCounts[guid]=1}else{++instanceMeta.itemCounts[guid]}array.addObject(item);return array},removedItem:function(array,item,_,instanceMeta){var guid=guidFor(item),itemCounts=instanceMeta.itemCounts;if(--itemCounts[guid]===0){array.removeObject(item)}return array}});return arrayComputed.apply(null,args)}__exports__.uniq=uniq;var union=uniq;__exports__.union=union;function intersect(){var getDependentKeyGuids=function(changeMeta){return map(changeMeta.property._dependentKeys,function(dependentKey){return guidFor(dependentKey)})};var args=a_slice.call(arguments);args.push({initialize:function(array,changeMeta,instanceMeta){instanceMeta.itemCounts={}},addedItem:function(array,item,changeMeta,instanceMeta){var itemGuid=guidFor(item),dependentGuids=getDependentKeyGuids(changeMeta),dependentGuid=guidFor(changeMeta.arrayChanged),numberOfDependentArrays=changeMeta.property._dependentKeys.length,itemCounts=instanceMeta.itemCounts;if(!itemCounts[itemGuid]){itemCounts[itemGuid]={}}if(itemCounts[itemGuid][dependentGuid]===undefined){itemCounts[itemGuid][dependentGuid]=0}if(++itemCounts[itemGuid][dependentGuid]===1&&numberOfDependentArrays===keys(itemCounts[itemGuid]).length){array.addObject(item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var itemGuid=guidFor(item),dependentGuids=getDependentKeyGuids(changeMeta),dependentGuid=guidFor(changeMeta.arrayChanged),numberOfDependentArrays=changeMeta.property._dependentKeys.length,numberOfArraysItemAppearsIn,itemCounts=instanceMeta.itemCounts;if(itemCounts[itemGuid][dependentGuid]===undefined){itemCounts[itemGuid][dependentGuid]=0}if(--itemCounts[itemGuid][dependentGuid]===0){delete itemCounts[itemGuid][dependentGuid];numberOfArraysItemAppearsIn=keys(itemCounts[itemGuid]).length;if(numberOfArraysItemAppearsIn===0){delete itemCounts[itemGuid]}array.removeObject(item)}return array}});return arrayComputed.apply(null,args)}__exports__.intersect=intersect;function setDiff(setAProperty,setBProperty){if(arguments.length!==2){throw new EmberError("setDiff requires exactly two dependent arrays.")}return arrayComputed(setAProperty,setBProperty,{addedItem:function(array,item,changeMeta,instanceMeta){var setA=get(this,setAProperty),setB=get(this,setBProperty);if(changeMeta.arrayChanged===setA){if(!setB.contains(item)){array.addObject(item)}}else{array.removeObject(item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var setA=get(this,setAProperty),setB=get(this,setBProperty);if(changeMeta.arrayChanged===setB){if(setA.contains(item)){array.addObject(item)}}else{array.removeObject(item)}return array}})}__exports__.setDiff=setDiff;function binarySearch(array,item,low,high){var mid,midItem,res,guidMid,guidItem;if(arguments.length<4){high=get(array,"length")}if(arguments.length<3){low=0}if(low===high){return low}mid=low+Math.floor((high-low)/2);midItem=array.objectAt(mid);guidMid=_guidFor(midItem);guidItem=_guidFor(item);if(guidMid===guidItem){return mid}res=this.order(midItem,item);if(res===0){res=guidMid0){return this.binarySearch(array,item,low,mid)}return mid;function _guidFor(item){if(SearchProxy.detectInstance(item)){return guidFor(get(item,"content"))}return guidFor(item)}}var SearchProxy=ObjectProxy.extend();function sort(itemsKey,sortDefinition){var initFn,sortPropertiesKey;if(typeof sortDefinition==="function"){initFn=function(array,changeMeta,instanceMeta){instanceMeta.order=sortDefinition;instanceMeta.binarySearch=binarySearch}}else{sortPropertiesKey=sortDefinition;initFn=function(array,changeMeta,instanceMeta){function setupSortProperties(){var sortPropertyDefinitions=get(this,sortPropertiesKey),sortProperty,sortProperties=instanceMeta.sortProperties=[],sortPropertyAscending=instanceMeta.sortPropertyAscending={},idx,asc;changeMeta.property.clearItemPropertyKeys(itemsKey);forEach(sortPropertyDefinitions,function(sortPropertyDefinition){if((idx=sortPropertyDefinition.indexOf(":"))!==-1){sortProperty=sortPropertyDefinition.substring(0,idx);asc=sortPropertyDefinition.substring(idx+1).toLowerCase()!=="desc"}else{sortProperty=sortPropertyDefinition;asc=true}sortProperties.push(sortProperty);sortPropertyAscending[sortProperty]=asc;changeMeta.property.itemPropertyKey(itemsKey,sortProperty)});sortPropertyDefinitions.addObserver("@each",this,updateSortPropertiesOnce)}function updateSortPropertiesOnce(){run.once(this,updateSortProperties,changeMeta.propertyName)}function updateSortProperties(propertyName){setupSortProperties.call(this);changeMeta.property.recomputeOnce.call(this,propertyName)}addObserver(this,sortPropertiesKey,updateSortPropertiesOnce);setupSortProperties.call(this);instanceMeta.order=function(itemA,itemB){var isProxy=itemB instanceof SearchProxy,sortProperty,result,asc;for(var i=0;i=0&&idxidx){subController=subControllers[idx];if(subController){return subController}}fullName="controller:"+controllerClass;if(!container.has(fullName)){throw new EmberError('Could not resolve itemController: "'+controllerClass+'"')}if(this._isVirtual){parentController=get(this,"parentController")}else{parentController=this}subController=container.lookupFactory(fullName).create({target:parentController,parentController:parentController,model:object});subControllers[idx]=subController;return subController},_subControllers:null,_resetSubControllers:function(){var controller;var subControllers=this._subControllers;if(subControllers.length){for(var i=0,length=subControllers.length;length>i;i++){controller=subControllers[i];if(controller){controller.destroy()}}subControllers.length=0}},willDestroy:function(){this._resetSubControllers();this._super()}})});define("ember-runtime/controllers/controller",["ember-runtime/system/object","ember-runtime/mixins/controller","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var EmberObject=__dependency1__["default"];var Mixin=__dependency2__["default"];__exports__["default"]=EmberObject.extend(Mixin)});define("ember-runtime/controllers/object_controller",["ember-runtime/mixins/controller","ember-runtime/system/object_proxy","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var ControllerMixin=__dependency1__["default"];var ObjectProxy=__dependency2__["default"];__exports__["default"]=ObjectProxy.extend(ControllerMixin)});define("ember-runtime/copy",["ember-metal/enumerable_utils","ember-metal/utils","ember-runtime/system/object","ember-runtime/mixins/copyable","ember-metal/platform","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var indexOf=__dependency1__.indexOf;var typeOf=__dependency2__.typeOf;var EmberObject=__dependency3__["default"];var Copyable=__dependency4__["default"];var create=__dependency5__.create;function _copy(obj,deep,seen,copies){var ret,loc,key;if("object"!==typeof obj||obj===null)return obj;if(deep&&(loc=indexOf(seen,obj))>=0)return copies[loc];if(typeOf(obj)==="array"){ret=obj.slice();if(deep){loc=ret.length;while(--loc>=0)ret[loc]=_copy(ret[loc],deep,seen,copies)}}else if(Copyable&&Copyable.detect(obj)){ret=obj.copy(deep,seen,copies)}else if(obj instanceof Date){ret=new Date(obj.getTime())}else{ret={};for(key in obj){if(!obj.hasOwnProperty(key))continue;if(key.substring(0,2)==="__")continue;ret[key]=deep?_copy(obj[key],deep,seen,copies):obj[key]}}if(deep){seen.push(obj);copies.push(ret)}return ret}__exports__["default"]=function copy(obj,deep){if("object"!==typeof obj||obj===null)return obj;if(Copyable&&Copyable.detect(obj))return obj.copy(deep);return _copy(obj,deep,deep?[]:null,deep?[]:null)}});define("ember-runtime/core",["exports"],function(__exports__){"use strict";var isEqual=function isEqual(a,b){if(a&&"function"===typeof a.isEqual)return a.isEqual(b);if(a instanceof Date&&b instanceof Date){return a.getTime()===b.getTime()}return a===b};__exports__.isEqual=isEqual});define("ember-runtime/ext/function",["ember-metal/core","ember-metal/expand_properties","ember-metal/computed"],function(__dependency1__,__dependency2__,__dependency3__){"use strict";var Ember=__dependency1__["default"];var expandProperties=__dependency2__["default"];var computed=__dependency3__.computed;var a_slice=Array.prototype.slice;var FunctionPrototype=Function.prototype;if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.Function){FunctionPrototype.property=function(){var ret=computed(this);return ret.property.apply(ret,arguments)};FunctionPrototype.observes=function(){var addWatchedProperty=function(obs){watched.push(obs)};var watched=[];for(var i=0;i=0)return;if(typeof obj.hasOwnProperty==="function"&&!obj.hasOwnProperty(key))return;array.push(key)};keys=function keys(obj){var ret=[],key;for(key in obj){pushPropertyName(obj,ret,key)}for(var i=0,l=prototypeProperties.length;i=get(this,"length"))return undefined;return get(this,idx)},objectsAt:function(indexes){var self=this;return map(indexes,function(idx){return self.objectAt(idx)})},nextObject:function(idx){return this.objectAt(idx)},"[]":computed(function(key,value){if(value!==undefined)this.replace(0,get(this,"length"),value);return this}),firstObject:computed(function(){return this.objectAt(0)}),lastObject:computed(function(){return this.objectAt(get(this,"length")-1)}),contains:function(obj){return this.indexOf(obj)>=0},slice:function(beginIndex,endIndex){var ret=Ember.A();var length=get(this,"length");if(isNone(beginIndex))beginIndex=0;if(isNone(endIndex)||endIndex>length)endIndex=length;if(beginIndex<0)beginIndex=length+beginIndex;if(endIndex<0)endIndex=length+endIndex;while(beginIndex=len)startAt=len-1;if(startAt<0)startAt+=len;for(idx=startAt;idx>=0;idx--){if(this.objectAt(idx)===object)return idx}return-1},addArrayObserver:function(target,opts){var willChange=opts&&opts.willChange||"arrayWillChange",didChange=opts&&opts.didChange||"arrayDidChange";var hasObservers=get(this,"hasArrayObservers");if(!hasObservers)propertyWillChange(this,"hasArrayObservers");addListener(this,"@array:before",target,willChange);addListener(this,"@array:change",target,didChange);if(!hasObservers)propertyDidChange(this,"hasArrayObservers");return this},removeArrayObserver:function(target,opts){var willChange=opts&&opts.willChange||"arrayWillChange",didChange=opts&&opts.didChange||"arrayDidChange";var hasObservers=get(this,"hasArrayObservers");if(hasObservers)propertyWillChange(this,"hasArrayObservers");removeListener(this,"@array:before",target,willChange);removeListener(this,"@array:change",target,didChange);if(hasObservers)propertyDidChange(this,"hasArrayObservers");return this},hasArrayObservers:computed(function(){return hasListeners(this,"@array:change")||hasListeners(this,"@array:before")}),arrayContentWillChange:function(startIdx,removeAmt,addAmt){if(startIdx===undefined){startIdx=0;removeAmt=addAmt=-1}else{if(removeAmt===undefined)removeAmt=-1;if(addAmt===undefined)addAmt=-1}if(isWatching(this,"@each")){get(this,"@each")}sendEvent(this,"@array:before",[this,startIdx,removeAmt,addAmt]);var removing,lim;if(startIdx>=0&&removeAmt>=0&&get(this,"hasEnumerableObservers")){removing=[];lim=startIdx+removeAmt;for(var idx=startIdx;idx=0&&addAmt>=0&&get(this,"hasEnumerableObservers")){adding=[];lim=startIdx+addAmt;for(var idx=startIdx;idx1)args=a_slice.call(arguments,1);this.forEach(function(x,idx){var method=x&&x[methodName];if("function"===typeof method){ret[idx]=args?apply(x,method,args):x[methodName]()}},this);return ret},toArray:function(){var ret=Ember.A();this.forEach(function(o,idx){ret[idx]=o});return ret},compact:function(){return this.filter(function(value){return value!=null})},without:function(value){if(!this.contains(value))return this;var ret=Ember.A();this.forEach(function(k){if(k!==value)ret[ret.length]=k});return ret},uniq:function(){var ret=Ember.A();this.forEach(function(k){if(indexOf(ret,k)<0)ret.push(k)});return ret},"[]":computed(function(key,value){return this}),addEnumerableObserver:function(target,opts){var willChange=opts&&opts.willChange||"enumerableWillChange",didChange=opts&&opts.didChange||"enumerableDidChange";var hasObservers=get(this,"hasEnumerableObservers");if(!hasObservers)propertyWillChange(this,"hasEnumerableObservers");addListener(this,"@enumerable:before",target,willChange);addListener(this,"@enumerable:change",target,didChange);if(!hasObservers)propertyDidChange(this,"hasEnumerableObservers");return this},removeEnumerableObserver:function(target,opts){var willChange=opts&&opts.willChange||"enumerableWillChange",didChange=opts&&opts.didChange||"enumerableDidChange";var hasObservers=get(this,"hasEnumerableObservers");if(hasObservers)propertyWillChange(this,"hasEnumerableObservers");removeListener(this,"@enumerable:before",target,willChange);removeListener(this,"@enumerable:change",target,didChange);if(hasObservers)propertyDidChange(this,"hasEnumerableObservers");return this},hasEnumerableObservers:computed(function(){return hasListeners(this,"@enumerable:change")||hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(removing,adding){var removeCnt,addCnt,hasDelta;if("number"===typeof removing)removeCnt=removing;else if(removing)removeCnt=get(removing,"length");else removeCnt=removing=-1;if("number"===typeof adding)addCnt=adding;else if(adding)addCnt=get(adding,"length");else addCnt=adding=-1;hasDelta=addCnt<0||removeCnt<0||addCnt-removeCnt!==0;if(removing===-1)removing=null;if(adding===-1)adding=null;propertyWillChange(this,"[]");if(hasDelta)propertyWillChange(this,"length");sendEvent(this,"@enumerable:before",[this,removing,adding]);return this},enumerableContentDidChange:function(removing,adding){var removeCnt,addCnt,hasDelta;if("number"===typeof removing)removeCnt=removing;else if(removing)removeCnt=get(removing,"length");else removeCnt=removing=-1;if("number"===typeof adding)addCnt=adding;else if(adding)addCnt=get(adding,"length");else addCnt=adding=-1;hasDelta=addCnt<0||removeCnt<0||addCnt-removeCnt!==0;if(removing===-1)removing=null;if(adding===-1)adding=null;sendEvent(this,"@enumerable:change",[this,removing,adding]);if(hasDelta)propertyDidChange(this,"length");propertyDidChange(this,"[]");return this},sortBy:function(){var sortKeys=arguments;return this.toArray().sort(function(a,b){for(var i=0;iget(this,"length"))throw new EmberError(OUT_OF_RANGE_EXCEPTION);this.replace(idx,0,[object]);return this},removeAt:function(start,len){if("number"===typeof start){if(start<0||start>=get(this,"length")){throw new EmberError(OUT_OF_RANGE_EXCEPTION)}if(len===undefined)len=1;this.replace(start,len,EMPTY)}return this},pushObject:function(obj){this.insertAt(get(this,"length"),obj);return obj},pushObjects:function(objects){if(!(Enumerable.detect(objects)||isArray(objects))){throw new TypeError("Must pass Ember.Enumerable to Ember.MutableArray#pushObjects")}this.replace(get(this,"length"),0,objects);return this},popObject:function(){var len=get(this,"length");if(len===0)return null;var ret=this.objectAt(len-1);this.removeAt(len-1,1);return ret},shiftObject:function(){if(get(this,"length")===0)return null;var ret=this.objectAt(0);this.removeAt(0);return ret},unshiftObject:function(obj){this.insertAt(0,obj);return obj},unshiftObjects:function(objects){this.replace(0,0,objects);return this},reverseObjects:function(){var len=get(this,"length");if(len===0)return this;var objects=this.toArray().reverse();this.replace(0,len,objects);return this},setObjects:function(objects){if(objects.length===0)return this.clear();var len=get(this,"length");this.replace(0,len,objects);return this},removeObject:function(obj){var loc=get(this,"length")||0;while(--loc>=0){var curObject=this.objectAt(loc);if(curObject===obj)this.removeAt(loc)}return this},addObject:function(obj){if(!this.contains(obj))this.pushObject(obj);return this}})});define("ember-runtime/mixins/mutable_enumerable",["ember-metal/enumerable_utils","ember-runtime/mixins/enumerable","ember-metal/mixin","ember-metal/property_events","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var forEach=__dependency1__.forEach;var Enumerable=__dependency2__["default"];var Mixin=__dependency3__.Mixin;var required=__dependency3__.required;var beginPropertyChanges=__dependency4__.beginPropertyChanges;var endPropertyChanges=__dependency4__.endPropertyChanges;__exports__["default"]=Mixin.create(Enumerable,{addObject:required(Function),addObjects:function(objects){beginPropertyChanges(this);forEach(objects,function(obj){this.addObject(obj)},this);endPropertyChanges(this);return this},removeObject:required(Function),removeObjects:function(objects){beginPropertyChanges(this);for(var i=objects.length-1;i>=0;i--){this.removeObject(objects[i])}endPropertyChanges(this);return this}})});define("ember-runtime/mixins/observable",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/get_properties","ember-metal/set_properties","ember-metal/mixin","ember-metal/events","ember-metal/property_events","ember-metal/observer","ember-metal/computed","ember-metal/is_none","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var getWithDefault=__dependency2__.getWithDefault;var set=__dependency3__.set;var apply=__dependency4__.apply;var getProperties=__dependency5__["default"];var setProperties=__dependency6__["default"];var Mixin=__dependency7__.Mixin;var hasListeners=__dependency8__.hasListeners;var beginPropertyChanges=__dependency9__.beginPropertyChanges;var propertyWillChange=__dependency9__.propertyWillChange;var propertyDidChange=__dependency9__.propertyDidChange;var endPropertyChanges=__dependency9__.endPropertyChanges;var addObserver=__dependency10__.addObserver;var addBeforeObserver=__dependency10__.addBeforeObserver;var removeObserver=__dependency10__.removeObserver;var observersFor=__dependency10__.observersFor;var cacheFor=__dependency11__.cacheFor;var isNone=__dependency12__.isNone;var slice=Array.prototype.slice;__exports__["default"]=Mixin.create({get:function(keyName){return get(this,keyName)},getProperties:function(){return apply(null,getProperties,[this].concat(slice.call(arguments)))},set:function(keyName,value){set(this,keyName,value);return this},setProperties:function(hash){return setProperties(this,hash)},beginPropertyChanges:function(){beginPropertyChanges();return this},endPropertyChanges:function(){endPropertyChanges();return this},propertyWillChange:function(keyName){propertyWillChange(this,keyName);return this},propertyDidChange:function(keyName){propertyDidChange(this,keyName);return this},notifyPropertyChange:function(keyName){this.propertyWillChange(keyName);this.propertyDidChange(keyName);return this},addBeforeObserver:function(key,target,method){addBeforeObserver(this,key,target,method)},addObserver:function(key,target,method){addObserver(this,key,target,method)},removeObserver:function(key,target,method){removeObserver(this,key,target,method)},hasObserverFor:function(key){return hasListeners(this,key+":change")},getWithDefault:function(keyName,defaultValue){return getWithDefault(this,keyName,defaultValue)},incrementProperty:function(keyName,increment){if(isNone(increment)){increment=1}set(this,keyName,(parseFloat(get(this,keyName))||0)+increment);return get(this,keyName)},decrementProperty:function(keyName,decrement){if(isNone(decrement)){decrement=1}set(this,keyName,(get(this,keyName)||0)-decrement);return get(this,keyName)},toggleProperty:function(keyName){set(this,keyName,!get(this,keyName));return get(this,keyName)},cacheFor:function(keyName){return cacheFor(this,keyName)},observersForKey:function(keyName){return observersFor(this,keyName)}})});define("ember-runtime/mixins/promise_proxy",["ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/mixin","ember-metal/error","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var computed=__dependency3__.computed;var Mixin=__dependency4__.Mixin;var EmberError=__dependency5__["default"];var not=computed.not;var or=computed.or;function tap(proxy,promise){set(proxy,"isFulfilled",false);set(proxy,"isRejected",false);return promise.then(function(value){set(proxy,"isFulfilled",true);set(proxy,"content",value);return value},function(reason){set(proxy,"isRejected",true);set(proxy,"reason",reason);throw reason},"Ember: PromiseProxy")}__exports__["default"]=Mixin.create({reason:null,isPending:not("isSettled").readOnly(),isSettled:or("isRejected","isFulfilled").readOnly(),isRejected:false,isFulfilled:false,promise:computed(function(key,promise){if(arguments.length===2){return tap(this,promise)}else{throw new EmberError("PromiseProxy's promise must be set")}}),then:promiseAlias("then"),"catch":promiseAlias("catch"),"finally":promiseAlias("finally")});function promiseAlias(name){return function(){var promise=get(this,"promise");return promise[name].apply(promise,arguments)}}});define("ember-runtime/mixins/sortable",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/mutable_enumerable","ember-runtime/compare","ember-metal/observer","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var forEach=__dependency4__.forEach;var Mixin=__dependency5__.Mixin;var MutableEnumerable=__dependency6__["default"];var compare=__dependency7__["default"];var addObserver=__dependency8__.addObserver;var removeObserver=__dependency8__.removeObserver;var computed=__dependency9__.computed;var beforeObserver=__dependency5__.beforeObserver;var observer=__dependency5__.observer;__exports__["default"]=Mixin.create(MutableEnumerable,{sortProperties:null,sortAscending:true,sortFunction:compare,orderBy:function(item1,item2){var result=0,sortProperties=get(this,"sortProperties"),sortAscending=get(this,"sortAscending"),sortFunction=get(this,"sortFunction");forEach(sortProperties,function(propertyName){if(result===0){result=sortFunction.call(this,get(item1,propertyName),get(item2,propertyName));if(result!==0&&!sortAscending){result=-1*result}}},this);return result},destroy:function(){var content=get(this,"content"),sortProperties=get(this,"sortProperties");if(content&&sortProperties){forEach(content,function(item){forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super()},isSorted:computed.notEmpty("sortProperties"),arrangedContent:computed("content","sortProperties.@each",function(key,value){var content=get(this,"content"),isSorted=get(this,"isSorted"),sortProperties=get(this,"sortProperties"),self=this;if(content&&isSorted){content=content.slice();content.sort(function(item1,item2){return self.orderBy(item1,item2)});forEach(content,function(item){forEach(sortProperties,function(sortProperty){addObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this);return Ember.A(content)}return content}),_contentWillChange:beforeObserver("content",function(){var content=get(this,"content"),sortProperties=get(this,"sortProperties");if(content&&sortProperties){forEach(content,function(item){forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}this._super()}),sortPropertiesWillChange:beforeObserver("sortProperties",function(){this._lastSortAscending=undefined}),sortPropertiesDidChange:observer("sortProperties",function(){this._lastSortAscending=undefined}),sortAscendingWillChange:beforeObserver("sortAscending",function(){this._lastSortAscending=get(this,"sortAscending")}),sortAscendingDidChange:observer("sortAscending",function(){if(this._lastSortAscending!==undefined&&get(this,"sortAscending")!==this._lastSortAscending){var arrangedContent=get(this,"arrangedContent");arrangedContent.reverseObjects()}}),contentArrayWillChange:function(array,idx,removedCount,addedCount){var isSorted=get(this,"isSorted");if(isSorted){var arrangedContent=get(this,"arrangedContent");var removedObjects=array.slice(idx,idx+removedCount);var sortProperties=get(this,"sortProperties");forEach(removedObjects,function(item){arrangedContent.removeObject(item);forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(array,idx,removedCount,addedCount)},contentArrayDidChange:function(array,idx,removedCount,addedCount){var isSorted=get(this,"isSorted"),sortProperties=get(this,"sortProperties");if(isSorted){var addedObjects=array.slice(idx,idx+addedCount);forEach(addedObjects,function(item){this.insertItemSorted(item);forEach(sortProperties,function(sortProperty){addObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(array,idx,removedCount,addedCount)},insertItemSorted:function(item){var arrangedContent=get(this,"arrangedContent");var length=get(arrangedContent,"length");var idx=this._binarySearch(item,0,length);arrangedContent.insertAt(idx,item)},contentItemSortPropertyDidChange:function(item){var arrangedContent=get(this,"arrangedContent"),oldIndex=arrangedContent.indexOf(item),leftItem=arrangedContent.objectAt(oldIndex-1),rightItem=arrangedContent.objectAt(oldIndex+1),leftResult=leftItem&&this.orderBy(item,leftItem),rightResult=rightItem&&this.orderBy(item,rightItem);if(leftResult<0||rightResult>0){arrangedContent.removeObject(item);this.insertItemSorted(item)}},_binarySearch:function(item,low,high){var mid,midItem,res,arrangedContent;if(low===high){return low}arrangedContent=get(this,"arrangedContent");mid=low+Math.floor((high-low)/2);midItem=arrangedContent.objectAt(mid);res=this.orderBy(midItem,item);if(res<0){return this._binarySearch(item,mid+1,high)}else if(res>0){return this._binarySearch(item,low,mid)}return mid}})});define("ember-runtime/mixins/target_action_support",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/mixin","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var typeOf=__dependency4__.typeOf;var Mixin=__dependency5__.Mixin;var computed=__dependency6__.computed;var TargetActionSupport=Mixin.create({target:null,action:null,actionContext:null,targetObject:computed(function(){var target=get(this,"target");if(typeOf(target)==="string"){var value=get(this,target);if(value===undefined){value=get(Ember.lookup,target)}return value}else{return target}}).property("target"),actionContextObject:computed(function(){var actionContext=get(this,"actionContext");if(typeOf(actionContext)==="string"){var value=get(this,actionContext);if(value===undefined){value=get(Ember.lookup,actionContext)}return value}else{return actionContext}}).property("actionContext"),triggerAction:function(opts){opts=opts||{};var action=opts.action||get(this,"action"),target=opts.target||get(this,"targetObject"),actionContext=opts.actionContext;function args(options,actionName){var ret=[];if(actionName){ret.push(actionName)}return ret.concat(options)}if(typeof actionContext==="undefined"){actionContext=get(this,"actionContextObject")||this}if(target&&action){var ret;if(target.send){ret=target.send.apply(target,args(actionContext,action))}else{ret=target[action].apply(target,args(actionContext))}if(ret!==false)ret=true;return ret}else{return false}}});__exports__["default"]=TargetActionSupport});define("ember-runtime/system/application",["ember-runtime/system/namespace","exports"],function(__dependency1__,__exports__){"use strict";var Namespace=__dependency1__["default"];__exports__["default"]=Namespace.extend()});define("ember-runtime/system/array_proxy",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/property_events","ember-metal/error","ember-runtime/system/object","ember-runtime/mixins/mutable_array","ember-runtime/mixins/enumerable","ember-runtime/system/string","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var isArray=__dependency4__.isArray;var apply=__dependency4__.apply;var computed=__dependency5__.computed;var beforeObserver=__dependency6__.beforeObserver;var observer=__dependency6__.observer;var beginPropertyChanges=__dependency7__.beginPropertyChanges;var endPropertyChanges=__dependency7__.endPropertyChanges;var EmberError=__dependency8__["default"];var EmberObject=__dependency9__["default"];var MutableArray=__dependency10__["default"];var Enumerable=__dependency11__["default"];var fmt=__dependency12__.fmt;var OUT_OF_RANGE_EXCEPTION="Index out of range";var EMPTY=[];var alias=computed.alias;var K=Ember.K;var ArrayProxy=EmberObject.extend(MutableArray,{content:null,arrangedContent:alias("content"),objectAtContent:function(idx){return get(this,"arrangedContent").objectAt(idx)},replaceContent:function(idx,amt,objects){get(this,"content").replace(idx,amt,objects)},_contentWillChange:beforeObserver("content",function(){this._teardownContent()}),_teardownContent:function(){var content=get(this,"content");if(content){content.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})}},contentArrayWillChange:K,contentArrayDidChange:K,_contentDidChange:observer("content",function(){var content=get(this,"content");this._setupContent()}),_setupContent:function(){var content=get(this,"content");if(content){content.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})}},_arrangedContentWillChange:beforeObserver("arrangedContent",function(){var arrangedContent=get(this,"arrangedContent"),len=arrangedContent?get(arrangedContent,"length"):0;this.arrangedContentArrayWillChange(this,0,len,undefined);this.arrangedContentWillChange(this);this._teardownArrangedContent(arrangedContent)}),_arrangedContentDidChange:observer("arrangedContent",function(){var arrangedContent=get(this,"arrangedContent"),len=arrangedContent?get(arrangedContent,"length"):0;this._setupArrangedContent();this.arrangedContentDidChange(this);this.arrangedContentArrayDidChange(this,0,undefined,len)}),_setupArrangedContent:function(){var arrangedContent=get(this,"arrangedContent");if(arrangedContent){arrangedContent.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})}},_teardownArrangedContent:function(){var arrangedContent=get(this,"arrangedContent");if(arrangedContent){arrangedContent.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})}},arrangedContentWillChange:K,arrangedContentDidChange:K,objectAt:function(idx){return get(this,"content")&&this.objectAtContent(idx)},length:computed(function(){var arrangedContent=get(this,"arrangedContent");return arrangedContent?get(arrangedContent,"length"):0}),_replace:function(idx,amt,objects){var content=get(this,"content");if(content)this.replaceContent(idx,amt,objects);return this},replace:function(){if(get(this,"arrangedContent")===get(this,"content")){apply(this,this._replace,arguments)}else{throw new EmberError("Using replace on an arranged ArrayProxy is not allowed.")}},_insertAt:function(idx,object){if(idx>get(this,"content.length"))throw new EmberError(OUT_OF_RANGE_EXCEPTION);this._replace(idx,0,[object]);return this},insertAt:function(idx,object){if(get(this,"arrangedContent")===get(this,"content")){return this._insertAt(idx,object)}else{throw new EmberError("Using insertAt on an arranged ArrayProxy is not allowed.")}},removeAt:function(start,len){if("number"===typeof start){var content=get(this,"content"),arrangedContent=get(this,"arrangedContent"),indices=[],i;if(start<0||start>=get(this,"length")){throw new EmberError(OUT_OF_RANGE_EXCEPTION)}if(len===undefined)len=1;for(i=start;i=0){var baseValue=this[keyName];if(baseValue){if("function"===typeof baseValue.concat){value=baseValue.concat(value)}else{value=makeArray(baseValue).concat(value)}}else{value=makeArray(value)}}if(desc){desc.set(this,keyName,value)}else{if(typeof this.setUnknownProperty==="function"&&!(keyName in this)){this.setUnknownProperty(keyName,value)}else if(MANDATORY_SETTER){defineProperty(this,keyName,null,value)}else{this[keyName]=value}}}}}finishPartial(this,m);apply(this,this.init,arguments);m.proto=proto;finishChains(this);sendEvent(this,"init")};Class.toString=Mixin.prototype.toString;Class.willReopen=function(){if(wasApplied){Class.PrototypeMixin=Mixin.create(Class.PrototypeMixin)}wasApplied=false};Class._initMixins=function(args){initMixins=args};Class._initProperties=function(args){initProperties=args};Class.proto=function(){var superclass=Class.superclass;if(superclass){superclass.proto()}if(!wasApplied){wasApplied=true;Class.PrototypeMixin.applyPartial(Class.prototype);rewatch(Class.prototype)}return this.prototype};return Class}var CoreObject=makeCtor();CoreObject.toString=function(){return"Ember.CoreObject"};CoreObject.PrototypeMixin=Mixin.create({reopen:function(){applyMixin(this,arguments,true);return this},init:function(){},concatenatedProperties:null,isDestroyed:false,isDestroying:false,destroy:function(){if(this.isDestroying){return}this.isDestroying=true;schedule("actions",this,this.willDestroy);schedule("destroy",this,this._scheduledDestroy);return this},willDestroy:K,_scheduledDestroy:function(){if(this.isDestroyed){return}destroy(this);this.isDestroyed=true},bind:function(to,from){if(!(from instanceof Binding)){from=Binding.from(from)}from.to(to).connect(this);return from},toString:function toString(){var hasToStringExtension=typeof this.toStringExtension==="function",extension=hasToStringExtension?":"+this.toStringExtension():"";var ret="<"+this.constructor.toString()+":"+guidFor(this)+extension+">";this.toString=makeToString(ret);return ret}});CoreObject.PrototypeMixin.ownerConstructor=CoreObject;function makeToString(ret){return function(){return ret}}if(Ember.config.overridePrototypeMixin){Ember.config.overridePrototypeMixin(CoreObject.PrototypeMixin)}CoreObject.__super__=null;var ClassMixin=Mixin.create({ClassMixin:required(),PrototypeMixin:required(),isClass:true,isMethod:false,extend:function(){var Class=makeCtor(),proto;Class.ClassMixin=Mixin.create(this.ClassMixin);Class.PrototypeMixin=Mixin.create(this.PrototypeMixin);Class.ClassMixin.ownerConstructor=Class;Class.PrototypeMixin.ownerConstructor=Class;reopen.apply(Class.PrototypeMixin,arguments);Class.superclass=this;Class.__super__=this.prototype;proto=Class.prototype=o_create(this.prototype);proto.constructor=Class;generateGuid(proto);meta(proto).proto=proto;Class.ClassMixin.apply(Class);return Class},createWithMixins:function(){var C=this;if(arguments.length>0){this._initMixins(arguments)}return new C},create:function(){var C=this;if(arguments.length>0){this._initProperties(arguments)}return new C},reopen:function(){this.willReopen();apply(this.PrototypeMixin,reopen,arguments);return this},reopenClass:function(){apply(this.ClassMixin,reopen,arguments);applyMixin(this,arguments,false);return this},detect:function(obj){if("function"!==typeof obj){return false}while(obj){if(obj===this){return true}obj=obj.superclass}return false},detectInstance:function(obj){return obj instanceof this},metaForProperty:function(key){var meta=this.proto()[META_KEY],desc=meta&&meta.descs[key];return desc._meta||{}},eachComputedProperty:function(callback,binding){var proto=this.proto(),descs=meta(proto).descs,empty={},property;for(var name in descs){property=descs[name];if(property instanceof ComputedProperty){callback.call(binding||this,name,property._meta||empty)}}}});ClassMixin.ownerConstructor=CoreObject;if(Ember.config.overrideClassMixin){Ember.config.overrideClassMixin(ClassMixin)}CoreObject.ClassMixin=ClassMixin;ClassMixin.apply(CoreObject);__exports__["default"]=CoreObject});define("ember-runtime/system/deferred",["ember-runtime/mixins/deferred","ember-metal/property_get","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var DeferredMixin=__dependency1__["default"];var get=__dependency2__.get;var EmberObject=__dependency3__["default"];var Deferred=EmberObject.extend(DeferredMixin);Deferred.reopenClass({promise:function(callback,binding){var deferred=Deferred.create();callback.call(binding,deferred);return deferred}});__exports__["default"]=Deferred});define("ember-runtime/system/each_proxy",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/enumerable_utils","ember-metal/array","ember-runtime/mixins/array","ember-runtime/system/object","ember-metal/computed","ember-metal/observer","ember-metal/events","ember-metal/properties","ember-metal/property_events","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var forEach=__dependency5__.forEach;var indexOf=__dependency6__.indexOf;var EmberArray=__dependency7__["default"];var EmberObject=__dependency8__["default"];var computed=__dependency9__.computed;var addObserver=__dependency10__.addObserver;var addBeforeObserver=__dependency10__.addBeforeObserver;var removeBeforeObserver=__dependency10__.removeBeforeObserver;var removeObserver=__dependency10__.removeObserver;var typeOf=__dependency4__.typeOf;var watchedEvents=__dependency11__.watchedEvents;var defineProperty=__dependency12__.defineProperty;var beginPropertyChanges=__dependency13__.beginPropertyChanges;var propertyDidChange=__dependency13__.propertyDidChange;var propertyWillChange=__dependency13__.propertyWillChange;var endPropertyChanges=__dependency13__.endPropertyChanges;var changeProperties=__dependency13__.changeProperties;var EachArray=EmberObject.extend(EmberArray,{init:function(content,keyName,owner){this._super();this._keyName=keyName;this._owner=owner;this._content=content},objectAt:function(idx){var item=this._content.objectAt(idx);return item&&get(item,this._keyName)},length:computed(function(){var content=this._content;return content?get(content,"length"):0})});var IS_OBSERVER=/^.+:(before|change)$/;function addObserverForContentKey(content,keyName,proxy,idx,loc){var objects=proxy._objects,guid;if(!objects)objects=proxy._objects={};while(--loc>=idx){var item=content.objectAt(loc);if(item){addBeforeObserver(item,keyName,proxy,"contentKeyWillChange");addObserver(item,keyName,proxy,"contentKeyDidChange");guid=guidFor(item);if(!objects[guid])objects[guid]=[];objects[guid].push(loc)}}}function removeObserverForContentKey(content,keyName,proxy,idx,loc){var objects=proxy._objects;if(!objects)objects=proxy._objects={};var indicies,guid;while(--loc>=idx){var item=content.objectAt(loc);if(item){removeBeforeObserver(item,keyName,proxy,"contentKeyWillChange");removeObserver(item,keyName,proxy,"contentKeyDidChange");guid=guidFor(item);indicies=objects[guid];indicies[indexOf.call(indicies,loc)]=null}}}var EachProxy=EmberObject.extend({init:function(content){this._super();this._content=content;content.addArrayObserver(this);forEach(watchedEvents(this),function(eventName){this.didAddListener(eventName)},this)},unknownProperty:function(keyName,value){var ret;ret=new EachArray(this._content,keyName,this);defineProperty(this,keyName,null,ret);this.beginObservingContentKey(keyName);return ret},arrayWillChange:function(content,idx,removedCnt,addedCnt){var keys=this._keys,key,lim;lim=removedCnt>0?idx+removedCnt:-1;beginPropertyChanges(this);for(key in keys){if(!keys.hasOwnProperty(key)){continue}if(lim>0){removeObserverForContentKey(content,key,this,idx,lim)}propertyWillChange(this,key)}propertyWillChange(this._content,"@each");endPropertyChanges(this)},arrayDidChange:function(content,idx,removedCnt,addedCnt){var keys=this._keys,lim;lim=addedCnt>0?idx+addedCnt:-1;changeProperties(function(){for(var key in keys){if(!keys.hasOwnProperty(key)){continue}if(lim>0){addObserverForContentKey(content,key,this,idx,lim)}propertyDidChange(this,key)}propertyDidChange(this._content,"@each")},this)},didAddListener:function(eventName){if(IS_OBSERVER.test(eventName)){this.beginObservingContentKey(eventName.slice(0,-7))}},didRemoveListener:function(eventName){if(IS_OBSERVER.test(eventName)){this.stopObservingContentKey(eventName.slice(0,-7))}},beginObservingContentKey:function(keyName){var keys=this._keys;if(!keys)keys=this._keys={};if(!keys[keyName]){keys[keyName]=1;var content=this._content,len=get(content,"length");addObserverForContentKey(content,keyName,this,0,len)}else{keys[keyName]++}},stopObservingContentKey:function(keyName){var keys=this._keys;if(keys&&keys[keyName]>0&&--keys[keyName]<=0){var content=this._content,len=get(content,"length");removeObserverForContentKey(content,keyName,this,0,len)}},contentKeyWillChange:function(obj,keyName){propertyWillChange(this,keyName)},contentKeyDidChange:function(obj,keyName){propertyDidChange(this,keyName)}});__exports__.EachArray=EachArray;__exports__.EachProxy=EachProxy});define("ember-runtime/system/lazy_load",["ember-metal/core","ember-metal/array","ember-runtime/system/native_array","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var forEach=__dependency2__.forEach;var loadHooks=Ember.ENV.EMBER_LOAD_HOOKS||{};var loaded={};function onLoad(name,callback){var object;loadHooks[name]=loadHooks[name]||Ember.A();loadHooks[name].pushObject(callback);if(object=loaded[name]){callback(object)}}__exports__.onLoad=onLoad;function runLoadHooks(name,object){loaded[name]=object;if(typeof window==="object"&&typeof window.dispatchEvent==="function"&&typeof CustomEvent==="function"){var event=new CustomEvent(name,{detail:object,name:name});window.dispatchEvent(event)}if(loadHooks[name]){forEach.call(loadHooks[name],function(callback){callback(object)})}}__exports__.runLoadHooks=runLoadHooks});define("ember-runtime/system/namespace",["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/utils","ember-metal/mixin","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var indexOf=__dependency3__.indexOf;var GUID_KEY=__dependency4__.GUID_KEY;var guidFor=__dependency4__.guidFor;var Mixin=__dependency5__.Mixin;var EmberObject=__dependency6__["default"];var Namespace=EmberObject.extend({isNamespace:true,init:function(){Namespace.NAMESPACES.push(this);Namespace.PROCESSED=false},toString:function(){var name=get(this,"name");if(name){return name}findNamespaces();return this[NAME_KEY]},nameClasses:function(){processNamespace([this.toString()],this,{})},destroy:function(){var namespaces=Namespace.NAMESPACES,toString=this.toString();if(toString){Ember.lookup[toString]=undefined;delete Namespace.NAMESPACES_BY_ID[toString]}namespaces.splice(indexOf.call(namespaces,this),1);this._super()}});Namespace.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:false,processAll:processAllNamespaces,byName:function(name){if(!Ember.BOOTED){processAllNamespaces()}return NAMESPACES_BY_ID[name]}});var NAMESPACES_BY_ID=Namespace.NAMESPACES_BY_ID;var hasOwnProp={}.hasOwnProperty;function processNamespace(paths,root,seen){var idx=paths.length;NAMESPACES_BY_ID[paths.join(".")]=root;for(var key in root){if(!hasOwnProp.call(root,key)){continue}var obj=root[key];paths[idx]=key;if(obj&&obj.toString===classToString){obj.toString=makeToString(paths.join("."));obj[NAME_KEY]=paths.join(".")}else if(obj&&obj.isNamespace){if(seen[guidFor(obj)]){continue}seen[guidFor(obj)]=true;processNamespace(paths,obj,seen)}}paths.length=idx}var STARTS_WITH_UPPERCASE=/^[A-Z]/;function findNamespaces(){var lookup=Ember.lookup,obj,isNamespace;if(Namespace.PROCESSED){return}for(var prop in lookup){if(!STARTS_WITH_UPPERCASE.test(prop)){continue}if(lookup.hasOwnProperty&&!lookup.hasOwnProperty(prop)){continue}try{obj=lookup[prop];isNamespace=obj&&obj.isNamespace}catch(e){continue}if(isNamespace){obj[NAME_KEY]=prop}}}var NAME_KEY=Ember.NAME_KEY=GUID_KEY+"_name";function superClassString(mixin){var superclass=mixin.superclass;if(superclass){if(superclass[NAME_KEY]){return superclass[NAME_KEY]}else{return superClassString(superclass)}}else{return}}function classToString(){if(!Ember.BOOTED&&!this[NAME_KEY]){processAllNamespaces()}var ret;if(this[NAME_KEY]){ret=this[NAME_KEY]}else if(this._toString){ret=this._toString}else{var str=superClassString(this);if(str){ret="(subclass of "+str+")"}else{ret="(unknown mixin)"}this.toString=makeToString(ret)}return ret}function processAllNamespaces(){var unprocessedNamespaces=!Namespace.PROCESSED,unprocessedMixins=Ember.anyUnprocessedMixins;if(unprocessedNamespaces){findNamespaces();Namespace.PROCESSED=true}if(unprocessedNamespaces||unprocessedMixins){var namespaces=Namespace.NAMESPACES,namespace;for(var i=0,l=namespaces.length;i=0;idx--){if(this[idx]===object)return idx}return-1},copy:function(deep){if(deep){return this.map(function(item){return copy(item,true)})}return this.slice()}});var ignore=["length"];forEach(NativeArray.keys(),function(methodName){if(Array.prototype[methodName])ignore.push(methodName)});if(ignore.length>0){NativeArray=NativeArray.without.apply(NativeArray,ignore)}var A=function(arr){if(arr===undefined){arr=[]}return EmberArray.detect(arr)?arr:NativeArray.apply(arr)};NativeArray.activate=function(){NativeArray.apply(Array.prototype);A=function(arr){return arr||[]}};if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.Array){NativeArray.activate()}Ember.A=A;__exports__.A=A;__exports__.NativeArray=NativeArray;__exports__["default"]=NativeArray});define("ember-runtime/system/object",["ember-runtime/system/core_object","ember-runtime/mixins/observable","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var CoreObject=__dependency1__["default"];var Observable=__dependency2__["default"];var EmberObject=CoreObject.extend(Observable);EmberObject.toString=function(){return"Ember.Object"};__exports__["default"]=EmberObject});define("ember-runtime/system/object_proxy",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/observer","ember-metal/property_events","ember-metal/computed","ember-metal/properties","ember-metal/mixin","ember-runtime/system/string","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var meta=__dependency4__.meta;var addObserver=__dependency5__.addObserver;var removeObserver=__dependency5__.removeObserver;var addBeforeObserver=__dependency5__.addBeforeObserver;var removeBeforeObserver=__dependency5__.removeBeforeObserver;var propertyWillChange=__dependency6__.propertyWillChange;var propertyDidChange=__dependency6__.propertyDidChange;var computed=__dependency7__.computed;var defineProperty=__dependency8__.defineProperty;var observer=__dependency9__.observer;var fmt=__dependency10__.fmt;var EmberObject=__dependency11__["default"];function contentPropertyWillChange(content,contentKey){var key=contentKey.slice(8);if(key in this){return}propertyWillChange(this,key)}function contentPropertyDidChange(content,contentKey){var key=contentKey.slice(8);if(key in this){return}propertyDidChange(this,key)}var ObjectProxy=EmberObject.extend({content:null,_contentDidChange:observer("content",function(){}),isTruthy:computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(key){var contentKey="content."+key;addBeforeObserver(this,contentKey,null,contentPropertyWillChange);addObserver(this,contentKey,null,contentPropertyDidChange)},didUnwatchProperty:function(key){var contentKey="content."+key;removeBeforeObserver(this,contentKey,null,contentPropertyWillChange);removeObserver(this,contentKey,null,contentPropertyDidChange)},unknownProperty:function(key){var content=get(this,"content");if(content){return get(content,key)}},setUnknownProperty:function(key,value){var m=meta(this);if(m.proto===this){defineProperty(this,key,null,value);return value}var content=get(this,"content");return set(content,key,value)}});__exports__["default"]=ObjectProxy});define("ember-runtime/system/set",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/is_none","ember-runtime/system/string","ember-runtime/system/core_object","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/enumerable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-metal/error","ember-metal/property_events","ember-metal/mixin","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var isNone=__dependency5__.isNone;var fmt=__dependency6__.fmt;var CoreObject=__dependency7__["default"];var MutableEnumerable=__dependency8__["default"];var Enumerable=__dependency9__["default"];var Copyable=__dependency10__["default"];var Freezable=__dependency11__.Freezable;var FROZEN_ERROR=__dependency11__.FROZEN_ERROR;var EmberError=__dependency12__["default"];var propertyWillChange=__dependency13__.propertyWillChange;var propertyDidChange=__dependency13__.propertyDidChange;var aliasMethod=__dependency14__.aliasMethod;var computed=__dependency15__.computed;__exports__["default"]=CoreObject.extend(MutableEnumerable,Copyable,Freezable,{length:0,clear:function(){if(this.isFrozen){throw new EmberError(FROZEN_ERROR)}var len=get(this,"length");if(len===0){return this}var guid;this.enumerableContentWillChange(len,0);propertyWillChange(this,"firstObject");propertyWillChange(this,"lastObject");for(var i=0;i=0){if(!obj.contains(this[loc]))return false}return true},add:aliasMethod("addObject"),remove:aliasMethod("removeObject"),pop:function(){if(get(this,"isFrozen"))throw new EmberError(FROZEN_ERROR);var obj=this.length>0?this[this.length-1]:null;this.remove(obj);return obj},push:aliasMethod("addObject"),shift:aliasMethod("pop"),unshift:aliasMethod("push"),addEach:aliasMethod("addObjects"),removeEach:aliasMethod("removeObjects"),init:function(items){this._super();if(items)this.addObjects(items)},nextObject:function(idx){return this[idx]},firstObject:computed(function(){return this.length>0?this[0]:undefined}),lastObject:computed(function(){return this.length>0?this[this.length-1]:undefined}),addObject:function(obj){if(get(this,"isFrozen"))throw new EmberError(FROZEN_ERROR);if(isNone(obj))return this;var guid=guidFor(obj),idx=this[guid],len=get(this,"length"),added;if(idx>=0&&idx=0&&idx=0},copy:function(){var C=this.constructor,ret=new C,loc=get(this,"length");set(ret,"length",loc);while(--loc>=0){ret[loc]=this[loc];ret[guidFor(this[loc])]=loc}return ret},toString:function(){var len=this.length,idx,array=[];for(idx=0;idx",[array.join(",")])}})});define("ember-runtime/system/string",["ember-metal/core","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Ember=__dependency1__["default"];var isArray=__dependency2__.isArray;var emberInspect=__dependency2__.inspect;var STRING_DASHERIZE_REGEXP=/[ _]/g;var STRING_DASHERIZE_CACHE={};var STRING_DECAMELIZE_REGEXP=/([a-z\d])([A-Z])/g;var STRING_CAMELIZE_REGEXP=/(\-|_|\.|\s)+(.)?/g;var STRING_UNDERSCORE_REGEXP_1=/([a-z\d])([A-Z]+)/g;var STRING_UNDERSCORE_REGEXP_2=/\-|\s+/g;function fmt(str,formats){if(!isArray(formats)||arguments.length>2){formats=Array.prototype.slice.call(arguments,1)}var idx=0;return str.replace(/%@([0-9]+)?/g,function(s,argIndex){argIndex=argIndex?parseInt(argIndex,10)-1:idx++;s=formats[argIndex];return s===null?"(null)":s===undefined?"":emberInspect(s)})}function loc(str,formats){if(!isArray(formats)||arguments.length>2){formats=Array.prototype.slice.call(arguments,1)}str=Ember.STRINGS[str]||str;return fmt(str,formats)}function w(str){return str.split(/\s+/)}function decamelize(str){return str.replace(STRING_DECAMELIZE_REGEXP,"$1_$2").toLowerCase()}function dasherize(str){var cache=STRING_DASHERIZE_CACHE,hit=cache.hasOwnProperty(str),ret;if(hit){return cache[str]}else{ret=decamelize(str).replace(STRING_DASHERIZE_REGEXP,"-");cache[str]=ret}return ret}function camelize(str){return str.replace(STRING_CAMELIZE_REGEXP,function(match,separator,chr){return chr?chr.toUpperCase():""}).replace(/^([A-Z])/,function(match,separator,chr){return match.toLowerCase()})}function classify(str){var parts=str.split("."),out=[];for(var i=0,l=parts.length;i0){this._operations=[new Operation(RETAIN,length)]}else{this._operations=[]}}SubArray.prototype={addItem:function(index,match){var returnValue=-1,itemType=match?RETAIN:FILTER,self=this;this._findOperation(index,function(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray){var newOperation,splitOperation;if(itemType===operation.type){++operation.count}else if(index===rangeStart){self._operations.splice(operationIndex,0,new Operation(itemType,1))}else{newOperation=new Operation(itemType,1);splitOperation=new Operation(operation.type,rangeEnd-index+1);operation.count=index-rangeStart;self._operations.splice(operationIndex+1,0,newOperation,splitOperation)}if(match){if(operation.type===RETAIN){returnValue=seenInSubArray+(index-rangeStart)}else{returnValue=seenInSubArray}}self._composeAt(operationIndex)},function(seenInSubArray){self._operations.push(new Operation(itemType,1));if(match){returnValue=seenInSubArray}self._composeAt(self._operations.length-1)});return returnValue},removeItem:function(index){var returnValue=-1,self=this;this._findOperation(index,function(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray){if(operation.type===RETAIN){returnValue=seenInSubArray+(index-rangeStart)}if(operation.count>1){--operation.count}else{self._operations.splice(operationIndex,1);self._composeAt(operationIndex)}},function(){throw new EmberError("Can't remove an item that has never been added.")});return returnValue},_findOperation:function(index,foundCallback,notFoundCallback){var operationIndex,len,operation,rangeStart,rangeEnd,seenInSubArray=0;for(operationIndex=rangeStart=0,len=this._operations.length;operationIndex=rangeStart&&index<=rangeEnd){foundCallback(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray);return}else if(operation.type===RETAIN){seenInSubArray+=operation.count}}notFoundCallback(seenInSubArray)},_composeAt:function(index){var op=this._operations[index],otherOp; -if(!op){return}if(index>0){otherOp=this._operations[index-1];if(otherOp.type===op.type){op.count+=otherOp.count;this._operations.splice(index-1,1);--index}}if(indexarrayOperationRangeStart&&index<=arrayOperationRangeEnd){split=true;break}else{arrayOperationRangeStart=arrayOperationRangeEnd+1}}return new ArrayOperationMatch(arrayOperation,arrayOperationIndex,split,arrayOperationRangeStart)},_split:function(arrayOperationIndex,splitIndex,newArrayOperation){var arrayOperation=this._operations[arrayOperationIndex];var splitItems=arrayOperation.items.slice(splitIndex);var splitArrayOperation=new ArrayOperation(arrayOperation.type,splitItems.length,splitItems);arrayOperation.count=splitIndex;arrayOperation.items=arrayOperation.items.slice(0,splitIndex);this._operations.splice(arrayOperationIndex+1,0,newArrayOperation,splitArrayOperation)},_composeInsert:function(index){var newArrayOperation=this._operations[index],leftArrayOperation=this._operations[index-1],rightArrayOperation=this._operations[index+1],leftOp=leftArrayOperation&&leftArrayOperation.type,rightOp=rightArrayOperation&&rightArrayOperation.type;if(leftOp===INSERT){leftArrayOperation.count+=newArrayOperation.count;leftArrayOperation.items=leftArrayOperation.items.concat(newArrayOperation.items);if(rightOp===INSERT){leftArrayOperation.count+=rightArrayOperation.count;leftArrayOperation.items=leftArrayOperation.items.concat(rightArrayOperation.items);this._operations.splice(index,2)}else{this._operations.splice(index,1)}}else if(rightOp===INSERT){newArrayOperation.count+=rightArrayOperation.count;newArrayOperation.items=newArrayOperation.items.concat(rightArrayOperation.items);this._operations.splice(index+1,1)}},_composeDelete:function(index){var arrayOperation=this._operations[index],deletesToGo=arrayOperation.count,leftArrayOperation=this._operations[index-1],leftOp=leftArrayOperation&&leftArrayOperation.type,nextArrayOperation,nextOp,nextCount,removeNewAndNextOp=false,removedItems=[];if(leftOp===DELETE){arrayOperation=leftArrayOperation;index-=1}for(var i=index+1;deletesToGo>0;++i){nextArrayOperation=this._operations[i];nextOp=nextArrayOperation.type;nextCount=nextArrayOperation.count;if(nextOp===DELETE){arrayOperation.count+=nextCount;continue}if(nextCount>deletesToGo){removedItems=removedItems.concat(nextArrayOperation.items.splice(0,deletesToGo));nextArrayOperation.count-=deletesToGo;i-=1;nextCount=deletesToGo;deletesToGo=0}else{if(nextCount===deletesToGo){removeNewAndNextOp=true}removedItems=removedItems.concat(nextArrayOperation.items);deletesToGo-=nextCount}if(nextOp===INSERT){arrayOperation.count-=nextCount}}if(arrayOperation.count>0){this._operations.splice(index+1,i-1-index)}else{this._operations.splice(index,removeNewAndNextOp?2:1)}return removedItems},toString:function(){var str="";forEach(this._operations,function(operation){str+=" "+operation.type+":"+operation.count});return str.substring(1)}};function ArrayOperation(operation,count,items){this.type=operation;this.count=count;this.items=items}function ArrayOperationMatch(operation,index,split,rangeStart){this.operation=operation;this.index=index;this.split=split;this.rangeStart=rangeStart}});define("ember-testing",["ember-metal/core","ember-testing/initializers","ember-testing/support","ember-testing/setup_for_testing","ember-testing/test","ember-testing/adapters/adapter","ember-testing/adapters/qunit","ember-testing/helpers"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__){"use strict";var Ember=__dependency1__["default"];var setupForTesting=__dependency4__["default"];var Test=__dependency5__["default"];var Adapter=__dependency6__["default"];var QUnitAdapter=__dependency7__["default"];Ember.Test=Test;Ember.Test.Adapter=Adapter;Ember.Test.QUnitAdapter=QUnitAdapter;Ember.setupForTesting=setupForTesting});define("ember-testing/adapters/adapter",["ember-metal/core","ember-metal/utils","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var inspect=__dependency2__.inspect;var EmberObject=__dependency3__["default"];var Adapter=EmberObject.extend({asyncStart:Ember.K,asyncEnd:Ember.K,exception:function(error){throw error}});__exports__["default"]=Adapter});define("ember-testing/adapters/qunit",["ember-testing/adapters/adapter","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Adapter=__dependency1__["default"];var inspect=__dependency2__.inspect;__exports__["default"]=Adapter.extend({asyncStart:function(){QUnit.stop()},asyncEnd:function(){QUnit.start()},exception:function(error){ok(false,inspect(error))}})});define("ember-testing/helpers",["ember-metal/property_get","ember-metal/error","ember-metal/run_loop","ember-views/system/jquery","ember-testing/test"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__){"use strict";var get=__dependency1__.get;var EmberError=__dependency2__["default"];var run=__dependency3__["default"];var jQuery=__dependency4__["default"];var Test=__dependency5__["default"];var helper=Test.registerHelper;var asyncHelper=Test.registerAsyncHelper;var countAsync=0;function currentRouteName(app){var appController=app.__container__.lookup("controller:application");return get(appController,"currentRouteName")}function currentPath(app){var appController=app.__container__.lookup("controller:application");return get(appController,"currentPath")}function currentURL(app){var router=app.__container__.lookup("router:main");return get(router,"location").getURL()}function visit(app,url){var router=app.__container__.lookup("router:main");router.location.setURL(url);if(app._readinessDeferrals>0){router["initialURL"]=url;run(app,"advanceReadiness");delete router["initialURL"]}else{run(app,app.handleURL,url)}return wait(app)}function click(app,selector,context){var $el=findWithAssert(app,selector,context);run($el,"mousedown");if($el.is(":input")){var type=$el.prop("type");if(type!=="checkbox"&&type!=="radio"&&type!=="hidden"){run($el,function(){if(!document.hasFocus||document.hasFocus()){this.focus()}else{this.trigger("focusin")}})}}run($el,"mouseup");run($el,"click");return wait(app)}function triggerEvent(app,selector,context,type,options){if(arguments.length===3){type=context;context=null}if(typeof options==="undefined"){options={}}var $el=findWithAssert(app,selector,context);var event=jQuery.Event(type,options);run($el,"trigger",event);return wait(app)}function keyEvent(app,selector,context,type,keyCode){if(typeof keyCode==="undefined"){keyCode=type;type=context;context=null}return triggerEvent(app,selector,context,type,{keyCode:keyCode,which:keyCode})}function fillIn(app,selector,context,text){var $el;if(typeof text==="undefined"){text=context;context=null}$el=findWithAssert(app,selector,context);run(function(){$el.val(text).change()});return wait(app)}function findWithAssert(app,selector,context){var $el=find(app,selector,context);if($el.length===0){throw new EmberError("Element "+selector+" not found.")}return $el}function find(app,selector,context){var $el;context=context||get(app,"rootElement");$el=app.$(selector,context);return $el}function andThen(app,callback){return wait(app,callback(app))}function wait(app,value){return Test.promise(function(resolve){if(++countAsync===1){Test.adapter.asyncStart()}var watcher=setInterval(function(){var routerIsLoading=!!app.__container__.lookup("router:main").router.activeTransition;if(routerIsLoading){return}if(Test.pendingAjaxRequests){return}if(run.hasScheduledTimers()||run.currentRunLoop){return}if(Test.waiters&&Test.waiters.any(function(waiter){var context=waiter[0];var callback=waiter[1];return!callback.call(context)})){return}clearInterval(watcher);if(--countAsync===0){Test.adapter.asyncEnd()}run(null,resolve,value)},10)})}asyncHelper("visit",visit);asyncHelper("click",click);asyncHelper("keyEvent",keyEvent);asyncHelper("fillIn",fillIn);helper("find",find);helper("findWithAssert",findWithAssert);asyncHelper("wait",wait);asyncHelper("andThen",andThen);helper("currentRouteName",currentRouteName);helper("currentPath",currentPath);helper("currentURL",currentURL);asyncHelper("triggerEvent",triggerEvent)});define("ember-testing/initializers",["ember-runtime/system/lazy_load"],function(__dependency1__){"use strict";var onLoad=__dependency1__.onLoad;var name="deferReadiness in `testing` mode";onLoad("Ember.Application",function(Application){if(!Application.initializers[name]){Application.initializer({name:name,initialize:function(container,application){if(application.testing){application.deferReadiness()}}})}})});define("ember-testing/setup_for_testing",["ember-metal/core","ember-testing/adapters/qunit","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var QUnitAdapter=__dependency2__["default"];var jQuery=__dependency3__["default"];var Test,requests;function incrementAjaxPendingRequests(_,xhr){requests.push(xhr);Test.pendingAjaxRequests=requests.length}function decrementAjaxPendingRequests(_,xhr){for(var i=0;i').css({position:"absolute",left:"-1000px",top:"-1000px"}).appendTo("body").on("click",handler).trigger("click").remove()}$(function(){testCheckboxClick(function(){if(!this.checked&&!$.event.special.click){$.event.special.click={trigger:function(){if($.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}}}}});testCheckboxClick(function(){})})});define("ember-testing/test",["ember-metal/core","ember-metal/run_loop","ember-metal/platform","ember-runtime/compare","ember-runtime/ext/rsvp","ember-testing/setup_for_testing","ember-application/system/application","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict";var Ember=__dependency1__["default"];var emberRun=__dependency2__["default"];var create=__dependency3__.create;var compare=__dependency4__["default"];var RSVP=__dependency5__["default"];var setupForTesting=__dependency6__["default"];var EmberApplication=__dependency7__["default"];var slice=[].slice;var helpers={};var injectHelpersCallbacks=[];var Test={registerHelper:function(name,helperMethod){helpers[name]={method:helperMethod,meta:{wait:false}}},registerAsyncHelper:function(name,helperMethod){helpers[name]={method:helperMethod,meta:{wait:true}}},unregisterHelper:function(name){delete helpers[name];delete Test.Promise.prototype[name]},onInjectHelpers:function(callback){injectHelpersCallbacks.push(callback)},promise:function(resolver){return new Test.Promise(resolver)},adapter:null,resolve:function(val){return Test.promise(function(resolve){return resolve(val)})},registerWaiter:function(context,callback){if(arguments.length===1){callback=context;context=null}if(!this.waiters){this.waiters=Ember.A()}this.waiters.push([context,callback])},unregisterWaiter:function(context,callback){var pair;if(!this.waiters){return}if(arguments.length===1){callback=context;context=null}pair=[context,callback];this.waiters=Ember.A(this.waiters.filter(function(elt){return compare(elt,pair)!==0}))}};function helper(app,name){var fn=helpers[name].method,meta=helpers[name].meta;return function(){var args=slice.call(arguments),lastPromise=Test.lastPromise;args.unshift(app);if(!meta.wait){return fn.apply(app,args)}if(!lastPromise){lastPromise=fn.apply(app,args)}else{run(function(){lastPromise=Test.resolve(lastPromise).then(function(){return fn.apply(app,args)})})}return lastPromise}}function run(fn){if(!emberRun.currentRunLoop){emberRun(fn)}else{fn()}}EmberApplication.reopen({testHelpers:{},originalMethods:{},testing:false,setupForTesting:function(){setupForTesting();this.testing=true;this.Router.reopen({location:"none"})},helperContainer:window,injectTestHelpers:function(helperContainer){if(helperContainer){this.helperContainer=helperContainer}this.testHelpers={};for(var name in helpers){this.originalMethods[name]=this.helperContainer[name];this.testHelpers[name]=this.helperContainer[name]=helper(this,name);protoWrap(Test.Promise.prototype,name,helper(this,name),helpers[name].meta.wait)}for(var i=0,l=injectHelpersCallbacks.length;i"'`]/g;var POSSIBLE_CHARS_REGEXP=/[&<>"'`]/;function escapeAttribute(value){var escape={"<":"<",">":">",'"':""","'":"'","`":"`"};var escapeChar=function(chr){return escape[chr]||"&"};var string=value.toString();if(!POSSIBLE_CHARS_REGEXP.test(string)){return string}return string.replace(BAD_CHARS_REGEXP,escapeChar)}var canSetNameOnInputs=function(){var div=document.createElement("div"),el=document.createElement("input");el.setAttribute("name","foo");div.appendChild(el);return!!div.innerHTML.match("foo")}();__exports__["default"]=function RenderBuffer(tagName){return new _RenderBuffer(tagName)};function _RenderBuffer(tagName){this.tagNames=[tagName||null];this.buffer=""}_RenderBuffer.prototype={_element:null,_hasElement:true,elementClasses:null,classes:null,elementId:null,elementAttributes:null,elementProperties:null,elementTag:null,elementStyle:null,push:function(string){this.buffer+=string;return this},addClass:function(className){this.elementClasses=this.elementClasses||new ClassSet;this.elementClasses.add(className);this.classes=this.elementClasses.list;return this},setClasses:function(classNames){this.elementClasses=null;var len=classNames.length,i;for(i=0;i";this.buffer=buffer},pushClosingTag:function(){var tagName=this.tagNames.pop();if(tagName){this.buffer+=""}},currentTagName:function(){return this.tagNames[this.tagNames.length-1]},generateElement:function(){var tagName=this.tagNames.pop(),id=this.elementId,classes=this.classes,attrs=this.elementAttributes,props=this.elementProperties,style=this.elementStyle,styleBuffer="",attr,prop,tagString;if(attrs&&attrs.name&&!canSetNameOnInputs){tagString="<"+stripTagName(tagName)+' name="'+escapeAttribute(attrs.name)+'">'}else{tagString=tagName}var element=document.createElement(tagString),$element=jQuery(element);if(id){$element.attr("id",id);this.elementId=null}if(classes){$element.attr("class",classes.join(" "));this.classes=null;this.elementClasses=null}if(style){for(prop in style){if(style.hasOwnProperty(prop)){styleBuffer+=prop+":"+style[prop]+";"}}$element.attr("style",styleBuffer);this.elementStyle=null}if(attrs){for(attr in attrs){if(attrs.hasOwnProperty(attr)){$element.attr(attr,attrs[attr])}}this.elementAttributes=null}if(props){for(prop in props){if(props.hasOwnProperty(prop)){$element.prop(prop,props[prop])}}this.elementProperties=null}return element},element:function(){var html=this.innerString();if(html){this._element=setInnerHTML(this._element,html)}return this._element},string:function(){if(this._hasElement&&this._element){var thisElement=this.element(),outerHTML=thisElement.outerHTML;if(typeof outerHTML==="undefined"){return jQuery("
    ").append(thisElement).html()}return outerHTML}else{return this.innerString()}},innerString:function(){return this.buffer}}});define("ember-views/system/utils",["ember-metal/core","exports"],function(__dependency1__,__exports__){"use strict";var Ember=__dependency1__["default"];var needsShy=typeof document!=="undefined"&&function(){var testEl=document.createElement("div");testEl.innerHTML="
    ";testEl.firstChild.innerHTML="";return testEl.firstChild.innerHTML===""}();var movesWhitespace=typeof document!=="undefined"&&function(){var testEl=document.createElement("div");testEl.innerHTML="Test: Value";return testEl.childNodes[0].nodeValue==="Test:"&&testEl.childNodes[2].nodeValue===" Value"}();var findChildById=function(element,id){if(element.getAttribute("id")===id){return element}var len=element.childNodes.length,idx,node,found;for(idx=0;idx0){var len=matches.length,idx;for(idx=0;idxTest');canSet=el.options.length===1}innerHTMLTags[tagName]=canSet;return canSet};function setInnerHTML(element,html){var tagName=element.tagName;if(canSetInnerHTML(tagName)){setInnerHTMLWithoutFix(element,html)}else{var outerHTML=element.outerHTML||(new XMLSerializer).serializeToString(element);var startTag=outerHTML.match(new RegExp("<"+tagName+"([^>]*)>","i"))[0],endTag="";var wrapper=document.createElement("div");setInnerHTMLWithoutFix(wrapper,startTag+html+endTag);element=wrapper.firstChild;while(element.tagName!==tagName){element=element.nextSibling}}return element}__exports__.setInnerHTML=setInnerHTML;function isSimpleClick(event){var modifier=event.shiftKey||event.metaKey||event.altKey||event.ctrlKey,secondaryClick=event.which>1;return!modifier&&!secondaryClick}__exports__.isSimpleClick=isSimpleClick});define("ember-views/views/collection_view",["ember-metal/core","ember-metal/platform","ember-metal/binding","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-views/views/container_view","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-runtime/mixins/array","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var create=__dependency2__.create;var isGlobalPath=__dependency3__.isGlobalPath;var merge=__dependency4__["default"];var get=__dependency5__.get;var set=__dependency6__.set;var fmt=__dependency7__.fmt;var ContainerView=__dependency8__["default"];var CoreView=__dependency9__["default"];var View=__dependency10__["default"];var observer=__dependency11__.observer;var beforeObserver=__dependency11__.beforeObserver;var EmberArray=__dependency12__["default"];var CollectionView=ContainerView.extend({content:null,emptyViewClass:View,emptyView:null,itemViewClass:View,init:function(){var ret=this._super();this._contentDidChange();return ret},_contentWillChange:beforeObserver("content",function(){var content=this.get("content");if(content){content.removeArrayObserver(this)}var len=content?get(content,"length"):0;this.arrayWillChange(content,0,len)}),_contentDidChange:observer("content",function(){var content=get(this,"content");if(content){this._assertArrayLike(content);content.addArrayObserver(this)}var len=content?get(content,"length"):0;this.arrayDidChange(content,0,null,len)}),_assertArrayLike:function(content){},destroy:function(){if(!this._super()){return}var content=get(this,"content");if(content){content.removeArrayObserver(this)}if(this._createdEmptyView){this._createdEmptyView.destroy()}return this},arrayWillChange:function(content,start,removedCount){var emptyView=get(this,"emptyView");if(emptyView&&emptyView instanceof View){emptyView.removeFromParent()}var childViews=this._childViews,childView,idx,len;len=this._childViews.length;var removingAll=removedCount===len;if(removingAll){this.currentState.empty(this);this.invokeRecursively(function(view){view.removedFromDOM=true},false)}for(idx=start+removedCount-1;idx>=start;idx--){childView=childViews[idx];childView.destroy()}},arrayDidChange:function(content,start,removed,added){var addedViews=[],view,item,idx,len,itemViewClass,emptyView;len=content?get(content,"length"):0;if(len){itemViewClass=get(this,"itemViewClass");if("string"===typeof itemViewClass&&isGlobalPath(itemViewClass)){itemViewClass=get(itemViewClass)||itemViewClass}for(idx=start;idx0){var changedViews=views.slice(start,start+removed);this.currentState.childViewsWillChange(this,views,start,removed);this.initializeViews(changedViews,null,null)}},removeChild:function(child){this.removeObject(child);return this},childViewsDidChange:function(views,start,removed,added){if(added>0){var changedViews=views.slice(start,start+added);this.initializeViews(changedViews,this,get(this,"templateData"));this.currentState.childViewsDidChange(this,views,start,added)}this.propertyDidChange("childViews")},initializeViews:function(views,parentView,templateData){forEach(views,function(view){set(view,"_parentView",parentView);if(!view.container&&parentView){set(view,"container",parentView.container)}if(!get(view,"templateData")){set(view,"templateData",templateData)}})},currentView:null,_currentViewWillChange:beforeObserver("currentView",function(){var currentView=get(this,"currentView");if(currentView){currentView.destroy()}}),_currentViewDidChange:observer("currentView",function(){var currentView=get(this,"currentView");if(currentView){this.pushObject(currentView)}}),_ensureChildrenAreInDOM:function(){this.currentState.ensureChildrenAreInDOM(this)}});merge(states._default,{childViewsWillChange:Ember.K,childViewsDidChange:Ember.K,ensureChildrenAreInDOM:Ember.K});merge(states.inBuffer,{childViewsDidChange:function(parentView,views,start,added){throw new EmberError("You cannot modify child views while in the inBuffer state")}});merge(states.hasElement,{childViewsWillChange:function(view,views,start,removed){for(var i=start;i=lengthBefore;i--){if(childViews[i]){childViews[i].destroy()}}},_applyClassNameBindings:function(classBindings){var classNames=this.classNames,elem,newClass,dasherizedClass;forEach(classBindings,function(binding){var oldClass;var parsedPath=View._parsePropertyPath(binding);var observer=function(){newClass=this._classStringForProperty(binding);elem=this.$();if(oldClass){elem.removeClass(oldClass);classNames.removeObject(oldClass)}if(newClass){elem.addClass(newClass);oldClass=newClass}else{oldClass=null}};dasherizedClass=this._classStringForProperty(binding);if(dasherizedClass){addObject(classNames,dasherizedClass);oldClass=dasherizedClass}this.registerObserver(this,parsedPath.path,observer);this.one("willClearRender",function(){if(oldClass){classNames.removeObject(oldClass);oldClass=null}})},this)},_unspecifiedAttributeBindings:null,_applyAttributeBindings:function(buffer,attributeBindings){var attributeValue,unspecifiedAttributeBindings=this._unspecifiedAttributeBindings=this._unspecifiedAttributeBindings||{};forEach(attributeBindings,function(binding){var split=binding.split(":"),property=split[0],attributeName=split[1]||property;if(property in this){this._setupAttributeBindingObservation(property,attributeName);attributeValue=get(this,property);View.applyAttributeBindings(buffer,attributeName,attributeValue)}else{unspecifiedAttributeBindings[property]=attributeName}},this);this.setUnknownProperty=this._setUnknownProperty},_setupAttributeBindingObservation:function(property,attributeName){var attributeValue,elem;var observer=function(){elem=this.$();attributeValue=get(this,property);View.applyAttributeBindings(elem,attributeName,attributeValue)};this.registerObserver(this,property,observer)},setUnknownProperty:null,_setUnknownProperty:function(key,value){var attributeName=this._unspecifiedAttributeBindings&&this._unspecifiedAttributeBindings[key];if(attributeName){this._setupAttributeBindingObservation(key,attributeName)}defineProperty(this,key);return set(this,key,value)},_classStringForProperty:function(property){var parsedPath=View._parsePropertyPath(property);var path=parsedPath.path;var val=get(this,path);if(val===undefined&&isGlobalPath(path)){val=get(Ember.lookup,path)}return View._classStringForValue(path,val,parsedPath.className,parsedPath.falsyClassName)},element:computed("_parentView",function(key,value){if(value!==undefined){return this.currentState.setElement(this,value)}else{return this.currentState.getElement(this)}}),$:function(sel){return this.currentState.$(this,sel)},mutateChildViews:function(callback){var childViews=this._childViews,idx=childViews.length,view;while(--idx>=0){view=childViews[idx];callback(this,view,idx)}return this},forEachChildView:function(callback){var childViews=this._childViews;if(!childViews){return this}var len=childViews.length,view,idx;for(idx=0;idx=0;i--){childViews[i].removedFromDOM=true}if(viewName&&nonVirtualParentView){nonVirtualParentView.set(viewName,null)}childLen=childViews.length;for(i=childLen-1;i>=0;i--){childViews[i].destroy()}return this},createChildView:function(view,attrs){if(!view){throw new TypeError("createChildViews first argument must exist")}if(view.isView&&view._parentView===this&&view.container===this.container){return view}attrs=attrs||{};attrs._parentView=this;if(CoreView.detect(view)){attrs.templateData=attrs.templateData||get(this,"templateData");attrs.container=this.container;view=view.create(attrs);if(view.viewName){set(get(this,"concreteView"),view.viewName,view)}}else if("string"===typeof view){var fullName="view:"+view;var ViewKlass=this.container.lookupFactory(fullName);attrs.templateData=get(this,"templateData");view=ViewKlass.create(attrs)}else{attrs.container=this.container;if(!get(view,"templateData")){attrs.templateData=get(this,"templateData")}setProperties(view,attrs)}return view},becameVisible:Ember.K,becameHidden:Ember.K,_isVisibleDidChange:observer("isVisible",function(){if(this._isVisible===get(this,"isVisible")){return}run.scheduleOnce("render",this,this._toggleVisibility)}),_toggleVisibility:function(){var $el=this.$();if(!$el){return}var isVisible=get(this,"isVisible");if(this._isVisible===isVisible){return}$el.toggle(isVisible);this._isVisible=isVisible;if(this._isAncestorHidden()){return}if(isVisible){this._notifyBecameVisible()}else{this._notifyBecameHidden()}},_notifyBecameVisible:function(){this.trigger("becameVisible");this.forEachChildView(function(view){var isVisible=get(view,"isVisible");if(isVisible||isVisible===null){view._notifyBecameVisible()}})},_notifyBecameHidden:function(){this.trigger("becameHidden");this.forEachChildView(function(view){var isVisible=get(view,"isVisible");if(isVisible||isVisible===null){view._notifyBecameHidden()}})},_isAncestorHidden:function(){var parent=get(this,"parentView");while(parent){if(get(parent,"isVisible")===false){return true}parent=get(parent,"parentView")}return false},clearBuffer:function(){this.invokeRecursively(nullViewsBuffer)},transitionTo:function(state,children){this._transitionTo(state,children)},_transitionTo:function(state,children){var priorState=this.currentState;var currentState=this.currentState=this._states[state];this._state=state;if(priorState&&priorState.exit){priorState.exit(this)}if(currentState.enter){currentState.enter(this)}if(state==="inDOM"){meta(this).cache.element=undefined}if(children!==false){this.forEachChildView(function(view){view._transitionTo(state)})}},handleEvent:function(eventName,evt){return this.currentState.handleEvent(this,eventName,evt)},registerObserver:function(root,path,target,observer){if(!observer&&"function"===typeof target){observer=target;target=null}if(!root||typeof root!=="object"){return}var view=this,stateCheckedObserver=function(){view.currentState.invokeObserver(this,observer)},scheduledObserver=function(){run.scheduleOnce("render",this,stateCheckedObserver)};addObserver(root,path,target,scheduledObserver);this.one("willClearRender",function(){removeObserver(root,path,target,scheduledObserver)})}});function notifyMutationListeners(){run.once(View,"notifyMutationListeners")}var DOMManager={prepend:function(view,html){view.$().prepend(html);notifyMutationListeners()},after:function(view,html){view.$().after(html);notifyMutationListeners()},html:function(view,html){view.$().html(html);notifyMutationListeners()},replace:function(view){var element=get(view,"element");set(view,"element",null);view._insertElementLater(function(){jQuery(element).replaceWith(get(view,"element"));notifyMutationListeners()})},remove:function(view){view.$().remove();notifyMutationListeners()},empty:function(view){view.$().empty();notifyMutationListeners()}};View.reopen({domManager:DOMManager});View.reopenClass({_parsePropertyPath:function(path){var split=path.split(":"),propertyPath=split[0],classNames="",className,falsyClassName;if(split.length>1){className=split[1];if(split.length===3){falsyClassName=split[2]}classNames=":"+className;if(falsyClassName){classNames+=":"+falsyClassName}}return{path:propertyPath,classNames:classNames,className:className===""?undefined:className,falsyClassName:falsyClassName}},_classStringForValue:function(path,val,className,falsyClassName){if(isArray(val)){val=get(val,"length")!==0}if(className||falsyClassName){if(className&&!!val){return className}else if(falsyClassName&&!val){return falsyClassName}else{return null}}else if(val===true){var parts=path.split(".");return dasherize(parts[parts.length-1])}else if(val!==false&&val!=null){return val}else{return null}}});var mutation=EmberObject.extend(Evented).create();View.addMutationListener=function(callback){mutation.on("change",callback)};View.removeMutationListener=function(callback){mutation.off("change",callback)};View.notifyMutationListeners=function(){mutation.trigger("change")};View.views={};View.childViewsProperty=childViewsProperty;View.applyAttributeBindings=function(elem,name,value){var type=typeOf(value);if(name!=="value"&&(type==="string"||type==="number"&&!isNaN(value))){if(value!==elem.attr(name)){elem.attr(name,value)}}else if(name==="value"||type==="boolean"){if(isNone(value)||value===false){elem.removeAttr(name);elem.prop(name,"")}else if(value!==elem.prop(name)){elem.prop(name,value)}}else if(!value){elem.removeAttr(name)}};__exports__["default"]=View});define("ember-views/views/view_collection",["ember-metal/enumerable_utils","exports"],function(__dependency1__,__exports__){"use strict";var forEach=__dependency1__.forEach;function ViewCollection(initialViews){var views=this.views=initialViews||[];this.length=views.length}ViewCollection.prototype={length:0,trigger:function(eventName){var views=this.views,view;for(var i=0,l=views.length;i
    ";testEl.firstChild.innerHTML="";return testEl.firstChild.innerHTML===""}(),movesWhitespace=document&&function(){var testEl=document.createElement("div");testEl.innerHTML="Test: Value";return testEl.childNodes[0].nodeValue==="Test:"&&testEl.childNodes[2].nodeValue===" Value"}();var Metamorph=function(html){var self;if(this instanceof Metamorph){self=this}else{self=new K}self.innerHTML=html;var myGuid="metamorph-"+guid++;self.start=myGuid+"-start";self.end=myGuid+"-end";return self};K.prototype=Metamorph.prototype;var rangeFor,htmlFunc,removeFunc,outerHTMLFunc,appendToFunc,afterFunc,prependFunc,startTagFunc,endTagFunc;outerHTMLFunc=function(){return this.startTag()+this.innerHTML+this.endTag()};startTagFunc=function(){return""};endTagFunc=function(){return""};if(supportsRange){rangeFor=function(morph,outerToo){var range=document.createRange();var before=document.getElementById(morph.start);var after=document.getElementById(morph.end);if(outerToo){range.setStartBefore(before);range.setEndAfter(after)}else{range.setStartAfter(before);range.setEndBefore(after)}return range};htmlFunc=function(html,outerToo){var range=rangeFor(this,outerToo);range.deleteContents();var fragment=range.createContextualFragment(html);range.insertNode(fragment)};removeFunc=function(){var range=rangeFor(this,true);range.deleteContents()};appendToFunc=function(node){var range=document.createRange();range.setStart(node);range.collapse(false);var frag=range.createContextualFragment(this.outerHTML());node.appendChild(frag)};afterFunc=function(html){var range=document.createRange();var after=document.getElementById(this.end);range.setStartAfter(after);range.setEndAfter(after);var fragment=range.createContextualFragment(html);range.insertNode(fragment)};prependFunc=function(html){var range=document.createRange();var start=document.getElementById(this.start);range.setStartAfter(start);range.setEndAfter(start);var fragment=range.createContextualFragment(html);range.insertNode(fragment)}}else{Metamorph._wrapMap={select:[1,""],fieldset:[1,"
    ","
    "],table:[1,"","
    "],tbody:[2,"","
    "],tr:[3,"","
    "],colgroup:[2,"","
    "],map:[1,"",""],_default:[0,"",""]};var findChildById=function(element,id){if(element.getAttribute("id")===id){return element}var len=element.childNodes.length,idx,node,found;for(idx=0;idx0){var len=matches.length,idx;for(idx=0;idx2&&key.slice(keyLength-2)==="[]"){isArray=true;key=key.slice(0,keyLength-2);if(!queryParams[key]){queryParams[key]=[]}}value=pair[1]?decodeURIComponent(pair[1]):""}if(isArray){queryParams[key].push(value)}else{queryParams[key]=decodeURIComponent(value)}}return queryParams},recognize:function(path){var states=[this.rootState],pathLen,i,l,queryStart,queryParams={},isSlashDropped=false;path=decodeURI(path);queryStart=path.indexOf("?");if(queryStart!==-1){var queryString=path.substr(queryStart+1,path.length);path=path.substr(0,queryStart);queryParams=this.parseQueryString(queryString)}if(path.charAt(0)!=="/"){path="/"+path}pathLen=path.length;if(pathLen>1&&path.charAt(pathLen-1)==="/"){path=path.substr(0,pathLen-1);isSlashDropped=true}for(i=0,l=path.length;i=0&&proceed;--i){var route=routes[i];recognizer.add(routes,{as:route.handler});proceed=route.path==="/"||route.path===""||route.handler.slice(-6)===".index"}})},hasRoute:function(route){return this.recognizer.hasRoute(route)},queryParamsTransition:function(changelist,wasTransitioning,oldState,newState){var router=this;fireQueryParamDidChange(this,newState,changelist);if(!wasTransitioning&&this.activeTransition){return this.activeTransition}else{var newTransition=new Transition(this);newTransition.queryParamsOnly=true;oldState.queryParams=finalizeQueryParamChange(this,newState.handlerInfos,newState.queryParams,newTransition);newTransition.promise=newTransition.promise.then(function(result){updateURL(newTransition,oldState,true);if(router.didTransition){router.didTransition(router.currentHandlerInfos)}return result},null,promiseLabel("Transition complete"));return newTransition}},transitionByIntent:function(intent,isIntermediate){var wasTransitioning=!!this.activeTransition;var oldState=wasTransitioning?this.activeTransition.state:this.state;var newTransition;var router=this;try{var newState=intent.applyToState(oldState,this.recognizer,this.getHandler,isIntermediate);var queryParamChangelist=getChangelist(oldState.queryParams,newState.queryParams);if(handlerInfosEqual(newState.handlerInfos,oldState.handlerInfos)){if(queryParamChangelist){newTransition=this.queryParamsTransition(queryParamChangelist,wasTransitioning,oldState,newState);if(newTransition){return newTransition}}return new Transition(this)}if(isIntermediate){setupContexts(this,newState);return}newTransition=new Transition(this,intent,newState);if(this.activeTransition){this.activeTransition.abort()}this.activeTransition=newTransition;newTransition.promise=newTransition.promise.then(function(result){return finalizeTransition(newTransition,result.state)},null,promiseLabel("Settle transition promise when transition is finalized"));if(!wasTransitioning){notifyExistingHandlers(this,newState,newTransition)}fireQueryParamDidChange(this,newState,queryParamChangelist);return newTransition}catch(e){return new Transition(this,intent,null,e)}},reset:function(){if(this.state){forEach(this.state.handlerInfos,function(handlerInfo){var handler=handlerInfo.handler;if(handler.exit){handler.exit()}})}this.state=new TransitionState;this.currentHandlerInfos=null},activeTransition:null,handleURL:function(url){var args=slice.call(arguments);if(url.charAt(0)!=="/"){args[0]="/"+url}return doTransition(this,args).method(null)},updateURL:function(){throw new Error("updateURL is not implemented")},replaceURL:function(url){this.updateURL(url)},transitionTo:function(name){return doTransition(this,arguments)},intermediateTransitionTo:function(name){doTransition(this,arguments,true)},refresh:function(pivotHandler){var state=this.activeTransition?this.activeTransition.state:this.state;var handlerInfos=state.handlerInfos;var params={};for(var i=0,len=handlerInfos.length;i=0;--i){var handlerInfo=handlerInfos[i];merge(params,handlerInfo.params);if(handlerInfo.handler.inaccessibleByURL){urlMethod=null}}if(urlMethod){params.queryParams=transition._visibleQueryParams||state.queryParams;var url=router.recognizer.generate(handlerName,params);if(urlMethod==="replace"){router.replaceURL(url)}else{router.updateURL(url)}}}function finalizeTransition(transition,newState){try{log(transition.router,transition.sequence,"Resolved all models on destination route; finalizing transition.");var router=transition.router,handlerInfos=newState.handlerInfos,seq=transition.sequence;setupContexts(router,newState,transition);if(transition.isAborted){router.state.handlerInfos=router.currentHandlerInfos;return Promise.reject(logAbort(transition))}updateURL(transition,newState,transition.intent.url);transition.isActive=false;router.activeTransition=null;trigger(router,router.currentHandlerInfos,true,["didTransition"]);if(router.didTransition){router.didTransition(router.currentHandlerInfos)}log(router,transition.sequence,"TRANSITION COMPLETE.");return handlerInfos[handlerInfos.length-1].handler}catch(e){if(!(e instanceof TransitionAborted)){var infos=transition.state.handlerInfos;transition.trigger(true,"error",e,transition,infos[infos.length-1].handler);transition.abort()}throw e}}function doTransition(router,args,isIntermediate){var name=args[0]||"/";var lastArg=args[args.length-1];var queryParams={};if(lastArg&&lastArg.hasOwnProperty("queryParams")){queryParams=pop.call(args).queryParams}var intent;if(args.length===0){log(router,"Updating query params");var handlerInfos=router.state.handlerInfos;intent=new NamedTransitionIntent({name:handlerInfos[handlerInfos.length-1].name,contexts:[],queryParams:queryParams})}else if(name.charAt(0)==="/"){log(router,"Attempting URL transition to "+name);intent=new URLTransitionIntent({url:name})}else{log(router,"Attempting transition to "+name);intent=new NamedTransitionIntent({name:args[0],contexts:slice.call(args,1),queryParams:queryParams})}return router.transitionByIntent(intent,isIntermediate)}function handlerInfosEqual(handlerInfos,otherHandlerInfos){if(handlerInfos.length!==otherHandlerInfos.length){return false}for(var i=0,len=handlerInfos.length;i0){router._triggerWillChangeContext(changing,newTransition)}trigger(router,oldHandlers,true,["willTransition",newTransition])}__exports__["default"]=Router});define("router/transition-intent",["./utils","exports"],function(__dependency1__,__exports__){"use strict";var merge=__dependency1__.merge;function TransitionIntent(props){this.initialize(props);this.data=this.data||{}}TransitionIntent.prototype={initialize:null,applyToState:null};__exports__["default"]=TransitionIntent});define("router/transition-intent/named-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var TransitionIntent=__dependency1__["default"];var TransitionState=__dependency2__["default"];var handlerInfoFactory=__dependency3__["default"];var isParam=__dependency4__.isParam;var extractQueryParams=__dependency4__.extractQueryParams;var merge=__dependency4__.merge;var subclass=__dependency4__.subclass;__exports__["default"]=subclass(TransitionIntent,{name:null,pivotHandler:null,contexts:null,queryParams:null,initialize:function(props){this.name=props.name;this.pivotHandler=props.pivotHandler;this.contexts=props.contexts||[];this.queryParams=props.queryParams},applyToState:function(oldState,recognizer,getHandler,isIntermediate){var partitionedArgs=extractQueryParams([this.name].concat(this.contexts)),pureArgs=partitionedArgs[0],queryParams=partitionedArgs[1],handlers=recognizer.handlersFor(pureArgs[0]);var targetRouteName=handlers[handlers.length-1].handler;return this.applyToHandlers(oldState,handlers,getHandler,targetRouteName,isIntermediate)},applyToHandlers:function(oldState,handlers,getHandler,targetRouteName,isIntermediate,checkingIfActive){var i;var newState=new TransitionState;var objects=this.contexts.slice(0);var invalidateIndex=handlers.length;if(this.pivotHandler){for(i=0;i=0;--i){var result=handlers[i];var name=result.handler;var handler=getHandler(name);var oldHandlerInfo=oldState.handlerInfos[i];var newHandlerInfo=null;if(result.names.length>0){if(i>=invalidateIndex){newHandlerInfo=this.createParamHandlerInfo(name,handler,result.names,objects,oldHandlerInfo)}else{newHandlerInfo=this.getHandlerInfoForDynamicSegment(name,handler,result.names,objects,oldHandlerInfo,targetRouteName,i)}}else{newHandlerInfo=this.createParamHandlerInfo(name,handler,result.names,objects,oldHandlerInfo)}if(checkingIfActive){newHandlerInfo=newHandlerInfo.becomeResolved(null,newHandlerInfo.context);var oldContext=oldHandlerInfo&&oldHandlerInfo.context;if(result.names.length>0&&newHandlerInfo.context===oldContext){newHandlerInfo.params=oldHandlerInfo&&oldHandlerInfo.params}newHandlerInfo.context=oldContext}var handlerToUse=oldHandlerInfo;if(i>=invalidateIndex||newHandlerInfo.shouldSupercede(oldHandlerInfo)){invalidateIndex=Math.min(i,invalidateIndex);handlerToUse=newHandlerInfo}if(isIntermediate&&!checkingIfActive){handlerToUse=handlerToUse.becomeResolved(null,handlerToUse.context)}newState.handlerInfos.unshift(handlerToUse)}if(objects.length>0){throw new Error("More context objects were passed than there are dynamic segments for the route: "+targetRouteName)}if(!isIntermediate){this.invalidateChildren(newState.handlerInfos,invalidateIndex)}merge(newState.queryParams,this.queryParams||{});return newState},invalidateChildren:function(handlerInfos,invalidateIndex){for(var i=invalidateIndex,l=handlerInfos.length;i0){objectToUse=objects[objects.length-1];if(isParam(objectToUse)){return this.createParamHandlerInfo(name,handler,names,objects,oldHandlerInfo)}else{objects.pop()}}else if(oldHandlerInfo&&oldHandlerInfo.name===name){return oldHandlerInfo}else{if(this.preTransitionState){var preTransitionHandlerInfo=this.preTransitionState.handlerInfos[i];objectToUse=preTransitionHandlerInfo&&preTransitionHandlerInfo.context}else{return oldHandlerInfo}}return handlerInfoFactory("object",{name:name,handler:handler,context:objectToUse,names:names})},createParamHandlerInfo:function(name,handler,names,objects,oldHandlerInfo){var params={};var numNames=names.length;while(numNames--){var oldParams=oldHandlerInfo&&name===oldHandlerInfo.name&&oldHandlerInfo.params||{};var peek=objects[objects.length-1];var paramName=names[numNames];if(isParam(peek)){params[paramName]=""+objects.pop()}else{if(oldParams.hasOwnProperty(paramName)){params[paramName]=oldParams[paramName]}else{throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route "+name)}}}return handlerInfoFactory("param",{name:name,handler:handler,params:params})}})});define("router/transition-intent/url-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var TransitionIntent=__dependency1__["default"];var TransitionState=__dependency2__["default"];var handlerInfoFactory=__dependency3__["default"];var oCreate=__dependency4__.oCreate;var merge=__dependency4__.merge;var subclass=__dependency4__.subclass;__exports__["default"]=subclass(TransitionIntent,{url:null,initialize:function(props){this.url=props.url},applyToState:function(oldState,recognizer,getHandler){var newState=new TransitionState;var results=recognizer.recognize(this.url),queryParams={},i,len;if(!results){throw new UnrecognizedURLError(this.url)}var statesDiffer=false;for(i=0,len=results.length;i=handlerInfos.length?handlerInfos.length-1:payload.resolveIndex;return Promise.reject({error:error,handlerWithError:currentState.handlerInfos[errorHandlerIndex].handler,wasAborted:wasAborted,state:currentState})}function proceed(resolvedHandlerInfo){var wasAlreadyResolved=currentState.handlerInfos[payload.resolveIndex].isResolved;currentState.handlerInfos[payload.resolveIndex++]=resolvedHandlerInfo;if(!wasAlreadyResolved){var handler=resolvedHandlerInfo.handler;if(handler&&handler.redirect){handler.redirect(resolvedHandlerInfo.context,payload)}}return innerShouldContinue().then(resolveOneHandlerInfo,null,promiseLabel("Resolve handler"))}function resolveOneHandlerInfo(){if(payload.resolveIndex===currentState.handlerInfos.length){return{error:null,state:currentState}}var handlerInfo=currentState.handlerInfos[payload.resolveIndex];return handlerInfo.resolve(innerShouldContinue,payload).then(proceed,null,promiseLabel("Proceed"))}}};__exports__["default"]=TransitionState});define("router/transition",["rsvp/promise","./handler-info","./utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Promise=__dependency1__["default"];var ResolvedHandlerInfo=__dependency2__.ResolvedHandlerInfo;var trigger=__dependency3__.trigger;var slice=__dependency3__.slice;var log=__dependency3__.log;var promiseLabel=__dependency3__.promiseLabel;function Transition(router,intent,state,error){var transition=this; -this.state=state||router.state;this.intent=intent;this.router=router;this.data=this.intent&&this.intent.data||{};this.resolvedModels={};this.queryParams={};if(error){this.promise=Promise.reject(error);return}if(state){this.params=state.params;this.queryParams=state.queryParams;this.handlerInfos=state.handlerInfos;var len=state.handlerInfos.length;if(len){this.targetName=state.handlerInfos[state.handlerInfos.length-1].name}for(var i=0;i0&&array[len-1]&&array[len-1].hasOwnProperty("queryParams")){queryParams=array[len-1].queryParams;head=slice.call(array,0,len-1);return[head,queryParams]}else{return[array,null]}}__exports__.extractQueryParams=extractQueryParams;function coerceQueryParamsToString(queryParams){for(var key in queryParams){if(typeof queryParams[key]==="number"){queryParams[key]=""+queryParams[key]}else if(isArray(queryParams[key])){for(var i=0,l=queryParams[key].length;i=0;i--){var handlerInfo=handlerInfos[i],handler=handlerInfo.handler;if(handler.events&&handler.events[name]){if(handler.events[name].apply(handler,args)===true){eventWasHandled=true}else{return}}}if(!eventWasHandled&&!ignoreFailure){throw new Error("Nothing handled the event '"+name+"'.")}}__exports__.trigger=trigger;function getChangelist(oldObject,newObject){var key;var results={all:{},changed:{},removed:{}};merge(results.all,newObject);var didChange=false;coerceQueryParamsToString(oldObject);coerceQueryParamsToString(newObject);for(key in oldObject){if(oldObject.hasOwnProperty(key)){if(!newObject.hasOwnProperty(key)){didChange=true;results.removed[key]=oldObject[key]}}}for(key in newObject){if(newObject.hasOwnProperty(key)){if(isArray(oldObject[key])&&isArray(newObject[key])){if(oldObject[key].length!==newObject[key].length){results.changed[key]=newObject[key];didChange=true}else{for(var i=0,l=oldObject[key].length;i3?slice.call(arguments,3):undefined;if(!this.currentInstance){createAutorun(this)}return this.currentInstance.schedule(queueName,target,method,args,false,stack)},deferOnce:function(queueName,target,method){if(!method){method=target;target=null}if(isString(method)){method=target[method]}var stack=this.DEBUG?new Error:undefined,args=arguments.length>3?slice.call(arguments,3):undefined;if(!this.currentInstance){createAutorun(this)}return this.currentInstance.schedule(queueName,target,method,args,true,stack)},setTimeout:function(){var args=slice.call(arguments),length=args.length,method,wait,target,methodOrTarget,methodOrWait,methodOrArgs;if(length===0){return}else if(length===1){method=args.shift();wait=0}else if(length===2){methodOrTarget=args[0];methodOrWait=args[1];if(isFunction(methodOrWait)||isFunction(methodOrTarget[methodOrWait])){target=args.shift();method=args.shift();wait=0}else if(isCoercableNumber(methodOrWait)){method=args.shift();wait=args.shift()}else{method=args.shift();wait=0}}else{var last=args[args.length-1];if(isCoercableNumber(last)){wait=args.pop()}else{wait=0}methodOrTarget=args[0];methodOrArgs=args[1];if(isFunction(methodOrArgs)||isString(methodOrArgs)&&methodOrTarget!==null&&methodOrArgs in methodOrTarget){target=args.shift();method=args.shift()}else{method=args.shift()}}var executeAt=+new Date+parseInt(wait,10);if(isString(method)){method=target[method]}var onError=getOnError(this.options);function fn(){if(onError){try{method.apply(target,args)}catch(e){onError(e)}}else{method.apply(target,args)}}var i=searchTimer(executeAt,timers);timers.splice(i,0,executeAt,fn);updateLaterTimer(this,executeAt,wait);return fn},throttle:function(target,method){var self=this,args=arguments,immediate=pop.call(args),wait,throttler,index,timer;if(isNumber(immediate)||isString(immediate)){wait=immediate;immediate=true}else{wait=pop.call(args)}wait=parseInt(wait,10);index=findThrottler(target,method,this._throttlers);if(index>-1){return this._throttlers[index]}timer=global.setTimeout(function(){if(!immediate){self.run.apply(self,args)}var index=findThrottler(target,method,self._throttlers);if(index>-1){self._throttlers.splice(index,1)}},wait);if(immediate){self.run.apply(self,args)}throttler=[target,method,timer];this._throttlers.push(throttler);return throttler},debounce:function(target,method){var self=this,args=arguments,immediate=pop.call(args),wait,index,debouncee,timer;if(isNumber(immediate)||isString(immediate)){wait=immediate;immediate=false}else{wait=pop.call(args)}wait=parseInt(wait,10);index=findDebouncee(target,method,this._debouncees);if(index>-1){debouncee=this._debouncees[index];this._debouncees.splice(index,1);clearTimeout(debouncee[2])}timer=global.setTimeout(function(){if(!immediate){self.run.apply(self,args)}var index=findDebouncee(target,method,self._debouncees);if(index>-1){self._debouncees.splice(index,1)}},wait);if(immediate&&index===-1){self.run.apply(self,args)}debouncee=[target,method,timer];self._debouncees.push(debouncee);return debouncee},cancelTimers:function(){var clearItems=function(item){clearTimeout(item[2])};each(this._throttlers,clearItems);this._throttlers=[];each(this._debouncees,clearItems);this._debouncees=[];if(this._laterTimer){clearTimeout(this._laterTimer);this._laterTimer=null}timers=[];if(this._autorun){clearTimeout(this._autorun);this._autorun=null}},hasTimers:function(){return!!timers.length||!!this._debouncees.length||!!this._throttlers.length||this._autorun},cancel:function(timer){var timerType=typeof timer;if(timer&&timerType==="object"&&timer.queue&&timer.method){return timer.queue.cancel(timer)}else if(timerType==="function"){for(var i=0,l=timers.length;i-1){item=array[index];if(item[2]===timer[2]){array.splice(index,1);clearTimeout(timer[2]);return true}}return false}};Backburner.prototype.schedule=Backburner.prototype.defer;Backburner.prototype.scheduleOnce=Backburner.prototype.deferOnce;Backburner.prototype.later=Backburner.prototype.setTimeout;if(needsIETryCatchFix){var originalRun=Backburner.prototype.run;Backburner.prototype.run=wrapInTryCatch(originalRun);var originalEnd=Backburner.prototype.end;Backburner.prototype.end=wrapInTryCatch(originalEnd)}function wrapInTryCatch(func){return function(){try{return func.apply(this,arguments)}catch(e){throw e}}}function getOnError(options){return options.onError||options.onErrorTarget&&options.onErrorTarget[options.onErrorMethod]}function createAutorun(backburner){backburner.begin();backburner._autorun=global.setTimeout(function(){backburner._autorun=null;backburner.end()})}function updateLaterTimer(self,executeAt,wait){if(!self._laterTimer||executeAt=timers[middle]){start=middle+2}else{end=middle}}return time>=timers[start]?start+2:start}__exports__.Backburner=Backburner});define("backburner/deferred_action_queues",["backburner/utils","backburner/queue","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Utils=__dependency1__["default"];var Queue=__dependency2__.Queue;var each=Utils.each,isString=Utils.isString;function DeferredActionQueues(queueNames,options){var queues=this.queues={};this.queueNames=queueNames=queueNames||[];this.options=options;each(queueNames,function(queueName){queues[queueName]=new Queue(this,queueName,options)})}DeferredActionQueues.prototype={queueNames:null,queues:null,options:null,schedule:function(queueName,target,method,args,onceFlag,stack){var queues=this.queues,queue=queues[queueName];if(!queue){throw new Error("You attempted to schedule an action in a queue ("+queueName+") that doesn't exist")}if(onceFlag){return queue.pushUnique(target,method,args,stack)}else{return queue.push(target,method,args,stack)}},invoke:function(target,method,args,_){if(args&&args.length>0){method.apply(target,args)}else{method.call(target)}},invokeWithOnError:function(target,method,args,onError){try{if(args&&args.length>0){method.apply(target,args)}else{method.call(target)}}catch(error){onError(error)}},flush:function(){var queues=this.queues,queueNames=this.queueNames,queueName,queue,queueItems,priorQueueNameIndex,queueNameIndex=0,numberOfQueues=queueNames.length,options=this.options,onError=options.onError||options.onErrorTarget&&options.onErrorTarget[options.onErrorMethod],invoke=onError?this.invokeWithOnError:this.invoke;outerloop:while(queueNameIndex0){if(onError){try{method.apply(target,args)}catch(e){onError(e)}}else{method.apply(target,args)}}else{if(onError){try{method.call(target)}catch(e){onError(e)}}else{method.call(target)}}}if(l&&after){after()}if(queue.length>l){this._queue=queue.slice(l);this.flush()}else{this._queue.length=0}},cancel:function(actionToCancel){var queue=this._queue,currentTarget,currentMethod,i,l;for(i=0,l=queue.length;i-1){try{if(fs.existsSync(headFilePath)){var headFile=fs.readFileSync(headFilePath,{encoding:"utf8"});var branchName=headFile.split("/").slice(-1)[0].trim();var refPath=headFile.split(" ")[1];var branchSHA;if(refPath){var branchPath=path.join(gitPath,refPath.trim());branchSHA=fs.readFileSync(branchPath)}else{branchSHA=branchName}output.push(branchSHA.slice(0,10))}}catch(err){console.error(err.stack)}return output.join(".")}else{return packageVersion}}});define("container",["container/container","exports"],function(__dependency1__,__exports__){"use strict";Ember.MODEL_FACTORY_INJECTIONS=false;if(Ember.ENV&&typeof Ember.ENV.MODEL_FACTORY_INJECTIONS!=="undefined"){Ember.MODEL_FACTORY_INJECTIONS=!!Ember.ENV.MODEL_FACTORY_INJECTIONS}var Container=__dependency1__["default"];__exports__["default"]=Container});define("container/container",["ember-metal/core","ember-metal/dictionary","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Ember=__dependency1__["default"];var dictionary=__dependency2__["default"];function Container(parent){this.parent=parent;this.children=[];this.resolver=parent&&parent.resolver||function(){};this.registry=dictionary(parent?parent.registry:null);this.cache=dictionary(parent?parent.cache:null);this.factoryCache=dictionary(parent?parent.factoryCache:null);this.resolveCache=dictionary(parent?parent.resolveCache:null);this.typeInjections=dictionary(parent?parent.typeInjections:null);this.injections=dictionary(null);this.normalizeCache=dictionary(null);this.factoryTypeInjections=dictionary(parent?parent.factoryTypeInjections:null);this.factoryInjections=dictionary(null);this._options=dictionary(parent?parent._options:null);this._typeOptions=dictionary(parent?parent._typeOptions:null)}Container.prototype={parent:null,children:null,resolver:null,registry:null,cache:null,typeInjections:null,injections:null,_options:null,_typeOptions:null,child:function(){var container=new Container(this);this.children.push(container);return container},set:function(object,key,value){object[key]=value},register:function(fullName,factory,options){if(factory===undefined){throw new TypeError("Attempting to register an unknown factory: `"+fullName+"`")}var normalizedName=this.normalize(fullName);if(normalizedName in this.cache){throw new Error("Cannot re-register: `"+fullName+"`, as it has already been looked up.")}this.registry[normalizedName]=factory;this._options[normalizedName]=options||{}},unregister:function(fullName){var normalizedName=this.normalize(fullName);delete this.registry[normalizedName];delete this.cache[normalizedName];delete this.factoryCache[normalizedName];delete this.resolveCache[normalizedName];delete this._options[normalizedName]},resolve:function(fullName){return resolve(this,this.normalize(fullName))},describe:function(fullName){return fullName},normalizeFullName:function(fullName){return fullName},normalize:function(fullName){return this.normalizeCache[fullName]||(this.normalizeCache[fullName]=this.normalizeFullName(fullName))},makeToString:function(factory,fullName){return factory.toString()},lookup:function(fullName,options){return lookup(this,this.normalize(fullName),options)},lookupFactory:function(fullName){return factoryFor(this,this.normalize(fullName))},has:function(fullName){return has(this,this.normalize(fullName))},optionsForType:function(type,options){if(this.parent){illegalChildOperation("optionsForType")}this._typeOptions[type]=options},options:function(type,options){this.optionsForType(type,options)},typeInjection:function(type,property,fullName){if(this.parent){illegalChildOperation("typeInjection")}var fullNameType=fullName.split(":")[0];if(fullNameType===type){throw new Error("Cannot inject a `"+fullName+"` on other "+type+"(s). Register the `"+fullName+"` as a different type and perform the typeInjection.")}addTypeInjection(this.typeInjections,type,property,fullName)},injection:function(fullName,property,injectionName){if(this.parent){illegalChildOperation("injection")}validateFullName(injectionName);var normalizedInjectionName=this.normalize(injectionName);if(fullName.indexOf(":")===-1){return this.typeInjection(fullName,property,normalizedInjectionName)}var normalizedName=this.normalize(fullName);if(this.cache[normalizedName]){throw new Error("Attempted to register an injection for a type that has already been looked up. ('"+normalizedName+"', '"+property+"', '"+injectionName+"')")}addInjection(this.injections,normalizedName,property,normalizedInjectionName)},factoryTypeInjection:function(type,property,fullName){if(this.parent){illegalChildOperation("factoryTypeInjection")}addTypeInjection(this.factoryTypeInjections,type,property,this.normalize(fullName))},factoryInjection:function(fullName,property,injectionName){if(this.parent){illegalChildOperation("injection")}var normalizedName=this.normalize(fullName);var normalizedInjectionName=this.normalize(injectionName);validateFullName(injectionName);if(fullName.indexOf(":")===-1){return this.factoryTypeInjection(normalizedName,property,normalizedInjectionName)}if(this.factoryCache[normalizedName]){throw new Error("Attempted to register a factoryInjection for a type that has already "+"been looked up. ('"+normalizedName+"', '"+property+"', '"+injectionName+"')")}addInjection(this.factoryInjections,normalizedName,property,normalizedInjectionName)},destroy:function(){for(var i=0,length=this.children.length;i1?"they":"it")+" could not be found")}}var defaultControllersComputedProperty=computed(function(){var controller=this;return{needs:get(controller,"needs"),container:get(controller,"container"),unknownProperty:function(controllerName){var needs=this.needs,dependency,i,l;for(i=0,l=needs.length;i0){if(this.container){verifyNeedsDependencies(this,this.container,needs)}get(this,"controllers")}this._super.apply(this,arguments)},controllerFor:function(controllerName){return controllerFor(get(this,"container"),controllerName)},controllers:defaultControllersComputedProperty});__exports__["default"]=ControllerMixin});define("ember-application/system/application",["ember-metal","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/lazy_load","ember-application/system/dag","ember-runtime/system/namespace","ember-runtime/mixins/deferred","ember-application/system/resolver","ember-metal/platform","ember-metal/run_loop","ember-metal/utils","container/container","ember-runtime/controllers/controller","ember-metal/enumerable_utils","ember-runtime/controllers/object_controller","ember-runtime/controllers/array_controller","ember-views/system/event_dispatcher","ember-views/system/jquery","ember-routing/system/route","ember-routing/system/router","ember-routing/location/hash_location","ember-routing/location/history_location","ember-routing/location/auto_location","ember-routing/location/none_location","ember-routing/system/cache","ember-metal/core","ember-handlebars-compiler","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__dependency17__,__dependency18__,__dependency19__,__dependency20__,__dependency21__,__dependency22__,__dependency23__,__dependency24__,__dependency25__,__dependency26__,__dependency27__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var runLoadHooks=__dependency4__.runLoadHooks;var DAG=__dependency5__["default"];var Namespace=__dependency6__["default"];var DeferredMixin=__dependency7__["default"];var DefaultResolver=__dependency8__["default"];var create=__dependency9__.create;var run=__dependency10__["default"];var canInvoke=__dependency11__.canInvoke;var Container=__dependency12__["default"];var Controller=__dependency13__["default"];var EnumerableUtils=__dependency14__["default"];var ObjectController=__dependency15__["default"];var ArrayController=__dependency16__["default"];var EventDispatcher=__dependency17__["default"];var jQuery=__dependency18__["default"];var Route=__dependency19__["default"];var Router=__dependency20__["default"];var HashLocation=__dependency21__["default"];var HistoryLocation=__dependency22__["default"];var AutoLocation=__dependency23__["default"];var NoneLocation=__dependency24__["default"];var BucketCache=__dependency25__["default"];var K=__dependency26__.K;var EmberHandlebars=__dependency27__["default"];var ContainerDebugAdapter;var Application=Namespace.extend(DeferredMixin,{_suppressDeferredDeprecation:true,rootElement:"body",eventDispatcher:null,customEvents:null,_readinessDeferrals:1,init:function(){if(!this.$){this.$=jQuery}this.__container__=this.buildContainer();this.Router=this.defaultRouter();this._super();this.scheduleInitialize();Ember.libraries.registerCoreLibrary("Handlebars"+(EmberHandlebars.compile?"":"-runtime"),EmberHandlebars.VERSION);Ember.libraries.registerCoreLibrary("jQuery",jQuery().jquery);if(Ember.LOG_VERSION){Ember.LOG_VERSION=false;var nameLengths=EnumerableUtils.map(Ember.libraries,function(item){return get(item,"name.length")});var maxNameLength=Math.max.apply(this,nameLengths);Ember.libraries.each(function(name,version){var spaces=new Array(maxNameLength-name.length+1).join(" ")})}},buildContainer:function(){var container=this.__container__=Application.buildContainer(this); +return container},defaultRouter:function(){if(this.Router===false){return}var container=this.__container__;if(this.Router){container.unregister("router:main");container.register("router:main",this.Router)}return container.lookupFactory("router:main")},scheduleInitialize:function(){var self=this;if(!this.$||this.$.isReady){run.schedule("actions",self,"_initialize")}else{this.$().ready(function runInitialize(){run(self,"_initialize")})}},deferReadiness:function(){this._readinessDeferrals++},advanceReadiness:function(){this._readinessDeferrals--;if(this._readinessDeferrals===0){run.once(this,this.didBecomeReady)}},register:function(){var container=this.__container__;container.register.apply(container,arguments)},inject:function(){var container=this.__container__;container.injection.apply(container,arguments)},initialize:function(){},_initialize:function(){if(this.isDestroyed){return}if(this.Router){var container=this.__container__;container.unregister("router:main");container.register("router:main",this.Router)}this.runInitializers();runLoadHooks("application",this);this.advanceReadiness();return this},reset:function(){this._readinessDeferrals=1;function handleReset(){var router=this.__container__.lookup("router:main");router.reset();run(this.__container__,"destroy");this.buildContainer();run.schedule("actions",this,function(){this._initialize()})}run.join(this,handleReset)},runInitializers:function(){var initializers=get(this.constructor,"initializers");var container=this.__container__;var graph=new DAG;var namespace=this;var name,initializer;for(name in initializers){initializer=initializers[name];graph.addEdges(initializer.name,initializer.initialize,initializer.before,initializer.after)}graph.topsort(function(vertex){var initializer=vertex.value;initializer(container,namespace)})},didBecomeReady:function(){this.setupEventDispatcher();this.ready();this.startRouting();if(!Ember.testing){Ember.Namespace.processAll();Ember.BOOTED=true}this.resolve(this)},setupEventDispatcher:function(){var customEvents=get(this,"customEvents");var rootElement=get(this,"rootElement");var dispatcher=this.__container__.lookup("event_dispatcher:main");set(this,"eventDispatcher",dispatcher);dispatcher.setup(customEvents,rootElement)},startRouting:function(){var router=this.__container__.lookup("router:main");if(!router){return}router.startRouting()},handleURL:function(url){var router=this.__container__.lookup("router:main");router.handleURL(url)},ready:K,resolver:null,Resolver:null,willDestroy:function(){Ember.BOOTED=false;this.__container__.lookup("router:main").reset();this.__container__.destroy()},initializer:function(options){this.constructor.initializer(options)},then:function(){this._super.apply(this,arguments)}});Application.reopenClass({initializers:{},initializer:function(initializer){if(this.superclass.initializers!==undefined&&this.superclass.initializers===this.initializers){this.reopenClass({initializers:create(this.initializers)})}this.initializers[initializer.name]=initializer},buildContainer:function(namespace){var container=new Container;container.set=set;container.resolver=resolverFor(namespace);container.normalizeFullName=container.resolver.normalize;container.describe=container.resolver.describe;container.makeToString=container.resolver.makeToString;container.optionsForType("component",{singleton:false});container.optionsForType("view",{singleton:false});container.optionsForType("template",{instantiate:false});container.optionsForType("helper",{instantiate:false});container.register("application:main",namespace,{instantiate:false});container.register("controller:basic",Controller,{instantiate:false});container.register("controller:object",ObjectController,{instantiate:false});container.register("controller:array",ArrayController,{instantiate:false});container.register("route:basic",Route,{instantiate:false});container.register("event_dispatcher:main",EventDispatcher);container.register("router:main",Router);container.injection("router:main","namespace","application:main");container.register("location:auto",AutoLocation);container.register("location:hash",HashLocation);container.register("location:history",HistoryLocation);container.register("location:none",NoneLocation);container.injection("controller","target","router:main");container.injection("controller","namespace","application:main");container.register("-bucket-cache:main",BucketCache);container.injection("router","_bucketCache","-bucket-cache:main");container.injection("route","_bucketCache","-bucket-cache:main");container.injection("controller","_bucketCache","-bucket-cache:main");container.injection("route","router","router:main");container.injection("location","rootURL","-location-setting:root-url");container.register("resolver-for-debugging:main",container.resolver.__resolver__,{instantiate:false});container.injection("container-debug-adapter:main","resolver","resolver-for-debugging:main");container.injection("data-adapter:main","containerDebugAdapter","container-debug-adapter:main");if(!ContainerDebugAdapter){ContainerDebugAdapter=requireModule("ember-extension-support/container_debug_adapter")["default"]}container.register("container-debug-adapter:main",ContainerDebugAdapter);return container}});function resolverFor(namespace){if(namespace.get("resolver")){}var ResolverClass=namespace.get("resolver")||namespace.get("Resolver")||DefaultResolver;var resolver=ResolverClass.create({namespace:namespace});function resolve(fullName){return resolver.resolve(fullName)}resolve.describe=function(fullName){return resolver.lookupDescription(fullName)};resolve.makeToString=function(factory,fullName){return resolver.makeToString(factory,fullName)};resolve.normalize=function(fullName){if(resolver.normalize){return resolver.normalize(fullName)}else{return fullName}};resolve.__resolver__=resolver;return resolve}__exports__["default"]=Application});define("ember-application/system/dag",["ember-metal/error","exports"],function(__dependency1__,__exports__){"use strict";var EmberError=__dependency1__["default"];function visit(vertex,fn,visited,path){var name=vertex.name;var vertices=vertex.incoming;var names=vertex.incomingNames;var len=names.length;var i;if(!visited){visited={}}if(!path){path=[]}if(visited.hasOwnProperty(name)){return}path.push(name);visited[name]=true;for(i=0;i-1){result=result.replace(/\.(.)/g,function(m){return m.charAt(1).toUpperCase()})}if(name.indexOf("_")>-1){result=result.replace(/_(.)/g,function(m){return m.charAt(1).toUpperCase()})}return type+":"+result}else{return fullName}},resolve:function(fullName){var parsedName=this.parseName(fullName);var resolveMethodName=parsedName.resolveMethodName;var resolved;if(!(parsedName.name&&parsedName.type)){throw new TypeError("Invalid fullName: `"+fullName+"`, must be of the form `type:name` ")}if(this[resolveMethodName]){resolved=this[resolveMethodName](parsedName)}if(!resolved){resolved=this.resolveOther(parsedName)}if(parsedName.root&&parsedName.root.LOG_RESOLVER){this._logLookup(resolved,parsedName)}return resolved},parseName:function(fullName){return this._parseNameCache[fullName]||(this._parseNameCache[fullName]=this._parseName(fullName))},_parseName:function(fullName){var nameParts=fullName.split(":");var type=nameParts[0],fullNameWithoutType=nameParts[1];var name=fullNameWithoutType;var namespace=get(this,"namespace");var root=namespace;if(type!=="template"&&name.indexOf("/")!==-1){var parts=name.split("/");name=parts[parts.length-1];var namespaceName=capitalize(parts.slice(0,-1).join("."));root=Namespace.byName(namespaceName)}return{fullName:fullName,type:type,fullNameWithoutType:fullNameWithoutType,name:name,root:root,resolveMethodName:"resolve"+classify(type)}},lookupDescription:function(fullName){var parsedName=this.parseName(fullName);if(parsedName.type==="template"){return"template at "+parsedName.fullNameWithoutType.replace(/\./g,"/")}var description=parsedName.root+"."+classify(parsedName.name);if(parsedName.type!=="model"){description+=classify(parsedName.type)}return description},makeToString:function(factory,fullName){return factory.toString()},useRouterNaming:function(parsedName){parsedName.name=parsedName.name.replace(/\./g,"_");if(parsedName.name==="basic"){parsedName.name=""}},resolveTemplate:function(parsedName){var templateName=parsedName.fullNameWithoutType.replace(/\./g,"/");if(Ember.TEMPLATES[templateName]){return Ember.TEMPLATES[templateName]}templateName=decamelize(templateName);if(Ember.TEMPLATES[templateName]){return Ember.TEMPLATES[templateName]}},resolveView:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveController:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveRoute:function(parsedName){this.useRouterNaming(parsedName);return this.resolveOther(parsedName)},resolveModel:function(parsedName){var className=classify(parsedName.name);var factory=get(parsedName.root,className);if(factory){return factory}},resolveHelper:function(parsedName){return this.resolveOther(parsedName)||EmberHandlebars.helpers[parsedName.fullNameWithoutType]},resolveOther:function(parsedName){var className=classify(parsedName.name)+classify(parsedName.type);var factory=get(parsedName.root,className);if(factory){return factory}},_logLookup:function(found,parsedName){var symbol,padding;if(found){symbol="[✓]"}else{symbol="[ ]"}if(parsedName.fullName.length>60){padding="."}else{padding=new Array(60-parsedName.fullName.length).join(".")}Logger.info(symbol,parsedName.fullName,padding,this.lookupDescription(parsedName.fullName))}})});define("ember-extension-support",["ember-metal/core","ember-extension-support/data_adapter","ember-extension-support/container_debug_adapter"],function(__dependency1__,__dependency2__,__dependency3__){"use strict";var Ember=__dependency1__["default"];var DataAdapter=__dependency2__["default"];var ContainerDebugAdapter=__dependency3__["default"];Ember.DataAdapter=DataAdapter;Ember.ContainerDebugAdapter=ContainerDebugAdapter});define("ember-extension-support/container_debug_adapter",["ember-metal/core","ember-runtime/system/native_array","ember-metal/utils","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var emberA=__dependency2__.A;var typeOf=__dependency3__.typeOf;var dasherize=__dependency4__.dasherize;var classify=__dependency4__.classify;var Namespace=__dependency5__["default"];var EmberObject=__dependency6__["default"];__exports__["default"]=EmberObject.extend({container:null,resolver:null,canCatalogEntriesByType:function(type){if(type==="model"||type==="template")return false;return true},catalogEntriesByType:function(type){var namespaces=emberA(Namespace.NAMESPACES),types=emberA(),self=this;var typeSuffixRegex=new RegExp(classify(type)+"$");namespaces.forEach(function(namespace){if(namespace!==Ember){for(var key in namespace){if(!namespace.hasOwnProperty(key)){continue}if(typeSuffixRegex.test(key)){var klass=namespace[key];if(typeOf(klass)==="class"){types.push(dasherize(key.replace(typeSuffixRegex,"")))}}}}});return types}})});define("ember-extension-support/data_adapter",["ember-metal/core","ember-metal/property_get","ember-metal/run_loop","ember-runtime/system/string","ember-runtime/system/namespace","ember-runtime/system/object","ember-runtime/system/native_array","ember-application/system/application","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var run=__dependency3__["default"];var dasherize=__dependency4__.dasherize;var Namespace=__dependency5__["default"];var EmberObject=__dependency6__["default"];var emberA=__dependency7__.A;var Application=__dependency8__["default"];__exports__["default"]=EmberObject.extend({init:function(){this._super();this.releaseMethods=emberA()},container:null,containerDebugAdapter:undefined,attributeLimit:3,releaseMethods:emberA(),getFilters:function(){return emberA()},watchModelTypes:function(typesAdded,typesUpdated){var modelTypes=this.getModelTypes(),self=this,typesToSend,releaseMethods=emberA();typesToSend=modelTypes.map(function(type){var klass=type.klass;var wrapped=self.wrapModelType(klass,type.name);releaseMethods.push(self.observeModelType(klass,typesUpdated));return wrapped});typesAdded(typesToSend);var release=function(){releaseMethods.forEach(function(fn){fn()});self.releaseMethods.removeObject(release)};this.releaseMethods.pushObject(release);return release},_nameToClass:function(type){if(typeof type==="string"){type=this.container.lookupFactory("model:"+type)}return type},watchRecords:function(type,recordsAdded,recordsUpdated,recordsRemoved){var self=this,releaseMethods=emberA(),records=this.getRecords(type),release;var recordUpdated=function(updatedRecord){recordsUpdated([updatedRecord])};var recordsToSend=records.map(function(record){releaseMethods.push(self.observeRecord(record,recordUpdated));return self.wrapRecord(record)});var contentDidChange=function(array,idx,removedCount,addedCount){for(var i=idx;i-1}else{return content==selection}}).property("content","parentView.selection"),labelPathDidChange:observer("parentView.optionLabelPath",function(){var labelPath=get(this,"parentView.optionLabelPath");if(!labelPath){return}defineProperty(this,"label",computed(function(){return get(this,labelPath)}).property(labelPath))}),valuePathDidChange:observer("parentView.optionValuePath",function(){var valuePath=get(this,"parentView.optionValuePath");if(!valuePath){return}defineProperty(this,"value",computed(function(){return get(this,valuePath)}).property(valuePath))})});var SelectOptgroup=CollectionView.extend({instrumentDisplay:"Ember.SelectOptgroup",tagName:"optgroup",attributeBindings:["label"],selectionBinding:"parentView.selection",multipleBinding:"parentView.multiple",optionLabelPathBinding:"parentView.optionLabelPath",optionValuePathBinding:"parentView.optionValuePath",itemViewClassBinding:"parentView.optionView"});var Select=View.extend({instrumentDisplay:"Ember.Select",tagName:"select",classNames:["ember-select"],defaultTemplate:Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"];helpers=this.merge(helpers,Ember.Handlebars.helpers);data=data||{};var buffer="",stack1,escapeExpression=this.escapeExpression,self=this;function program1(depth0,data){var buffer="",stack1;data.buffer.push('");return buffer}function program3(depth0,data){var stack1;stack1=helpers.each.call(depth0,"view.groupedContent",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(4,program4,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}else{data.buffer.push("")}}function program4(depth0,data){data.buffer.push(escapeExpression(helpers.view.call(depth0,"view.groupView",{hash:{content:"content",label:"label"},hashTypes:{content:"ID",label:"ID"},hashContexts:{content:depth0,label:depth0},contexts:[depth0],types:["ID"],data:data})))}function program6(depth0,data){var stack1;stack1=helpers.each.call(depth0,"view.content",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(7,program7,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}else{data.buffer.push("")}}function program7(depth0,data){data.buffer.push(escapeExpression(helpers.view.call(depth0,"view.optionView",{hash:{content:""},hashTypes:{content:"ID"},hashContexts:{content:depth0},contexts:[depth0],types:["ID"],data:data})))}stack1=helpers["if"].call(depth0,"view.prompt",{hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(1,program1,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}stack1=helpers["if"].call(depth0,"view.optionGroupPath",{hash:{},hashTypes:{},hashContexts:{},inverse:self.program(6,program6,data),fn:self.program(3,program3,data),contexts:[depth0],types:["ID"],data:data});if(stack1||stack1===0){data.buffer.push(stack1)}return buffer}),attributeBindings:["multiple","disabled","tabindex","name","required","autofocus","form","size"],multiple:false,disabled:false,required:false,content:null,selection:null,value:computed(function(key,value){if(arguments.length===2){return value}var valuePath=get(this,"optionValuePath").replace(/^content\.?/,"");return valuePath?get(this,"selection."+valuePath):get(this,"selection")}).property("selection"),prompt:null,optionLabelPath:"content",optionValuePath:"content",optionGroupPath:null,groupView:SelectOptgroup,groupedContent:computed(function(){var groupPath=get(this,"optionGroupPath");var groupedContent=emberA();var content=get(this,"content")||[];forEach(content,function(item){var label=get(item,groupPath);if(get(groupedContent,"lastObject.label")!==label){groupedContent.pushObject({label:label,content:emberA()})}get(groupedContent,"lastObject.content").push(item)});return groupedContent}).property("optionGroupPath","content.@each"),optionView:SelectOption,_change:function(){if(get(this,"multiple")){this._changeMultiple()}else{this._changeSingle()}},selectionDidChange:observer("selection.@each",function(){var selection=get(this,"selection");if(get(this,"multiple")){if(!isArray(selection)){set(this,"selection",emberA([selection]));return}this._selectionDidChangeMultiple()}else{this._selectionDidChangeSingle()}}),valueDidChange:observer("value",function(){var content=get(this,"content"),value=get(this,"value"),valuePath=get(this,"optionValuePath").replace(/^content\.?/,""),selectedValue=valuePath?get(this,"selection."+valuePath):get(this,"selection"),selection;if(value!==selectedValue){selection=content?content.find(function(obj){return value===(valuePath?get(obj,valuePath):obj)}):null;this.set("selection",selection)}}),_triggerChange:function(){var selection=get(this,"selection");var value=get(this,"value");if(!isNone(selection)){this.selectionDidChange()}if(!isNone(value)){this.valueDidChange()}this._change()},_changeSingle:function(){var selectedIndex=this.$()[0].selectedIndex,content=get(this,"content"),prompt=get(this,"prompt");if(!content||!get(content,"length")){return}if(prompt&&selectedIndex===0){set(this,"selection",null);return}if(prompt){selectedIndex-=1}set(this,"selection",content.objectAt(selectedIndex))},_changeMultiple:function(){var options=this.$("option:selected"),prompt=get(this,"prompt"),offset=prompt?1:0,content=get(this,"content"),selection=get(this,"selection");if(!content){return}if(options){var selectedIndexes=options.map(function(){return this.index-offset}).toArray();var newSelection=content.objectsAt(selectedIndexes);if(isArray(selection)){replace(selection,0,get(selection,"length"),newSelection)}else{set(this,"selection",newSelection)}}},_selectionDidChangeSingle:function(){var el=this.get("element");if(!el){return}var content=get(this,"content"),selection=get(this,"selection"),selectionIndex=content?indexOf(content,selection):-1,prompt=get(this,"prompt");if(prompt){selectionIndex+=1}if(el){el.selectedIndex=selectionIndex}},_selectionDidChangeMultiple:function(){var content=get(this,"content"),selection=get(this,"selection"),selectedIndexes=content?indexesOf(content,selection):[-1],prompt=get(this,"prompt"),offset=prompt?1:0,options=this.$("option"),adjusted;if(options){options.each(function(){adjusted=this.index>-1?this.index-offset:-1;this.selected=indexOf(selectedIndexes,adjusted)>-1})}},init:function(){this._super();this.on("didInsertElement",this,this._triggerChange);this.on("change",this,this._change)}});__exports__["default"]=Select;__exports__.Select=Select;__exports__.SelectOption=SelectOption;__exports__.SelectOptgroup=SelectOptgroup});define("ember-handlebars/controls/text_area",["ember-metal/property_get","ember-views/views/component","ember-handlebars/controls/text_support","ember-metal/mixin","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var Component=__dependency2__["default"];var TextSupport=__dependency3__["default"];var observer=__dependency4__.observer;__exports__["default"]=Component.extend(TextSupport,{instrumentDisplay:"{{textarea}}",classNames:["ember-text-area"],tagName:"textarea",attributeBindings:["rows","cols","name","selectionEnd","selectionStart","wrap"],rows:null,cols:null,_updateElementValue:observer("value",function(){var value=get(this,"value"),$el=this.$();if($el&&value!==$el.val()){$el.val(value)}}),init:function(){this._super();this.on("didInsertElement",this,this._updateElementValue)}})});define("ember-handlebars/controls/text_field",["ember-metal/property_get","ember-metal/property_set","ember-views/views/component","ember-handlebars/controls/text_support","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var Component=__dependency3__["default"];var TextSupport=__dependency4__["default"];__exports__["default"]=Component.extend(TextSupport,{instrumentDisplay:'{{input type="text"}}',classNames:["ember-text-field"],tagName:"input",attributeBindings:["type","value","size","pattern","name","min","max","accept","autocomplete","autosave","formaction","formenctype","formmethod","formnovalidate","formtarget","height","inputmode","list","multiple","step","width"],value:"",type:"text",size:null,pattern:null,min:null,max:null})});define("ember-handlebars/controls/text_support",["ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-runtime/mixins/target_action_support","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var Mixin=__dependency3__.Mixin;var TargetActionSupport=__dependency4__["default"];var TextSupport=Mixin.create(TargetActionSupport,{value:"",attributeBindings:["placeholder","disabled","maxlength","tabindex","readonly","autofocus","form","selectionDirection","spellcheck","required","title","autocapitalize","autocorrect"],placeholder:null,disabled:false,maxlength:null,init:function(){this._super();this.on("focusOut",this,this._elementValueDidChange);this.on("change",this,this._elementValueDidChange);this.on("paste",this,this._elementValueDidChange);this.on("cut",this,this._elementValueDidChange);this.on("input",this,this._elementValueDidChange);this.on("keyUp",this,this.interpretKeyEvents)},action:null,onEvent:"enter",bubbles:false,interpretKeyEvents:function(event){var map=TextSupport.KEY_EVENTS;var method=map[event.keyCode];this._elementValueDidChange();if(method){return this[method](event)}},_elementValueDidChange:function(){set(this,"value",this.$().val())},insertNewline:function(event){sendAction("enter",this,event);sendAction("insert-newline",this,event)},cancel:function(event){sendAction("escape-press",this,event)},focusIn:function(event){sendAction("focus-in",this,event)},focusOut:function(event){sendAction("focus-out",this,event)},keyPress:function(event){sendAction("key-press",this,event)}});TextSupport.KEY_EVENTS={13:"insertNewline",27:"cancel"};function sendAction(eventName,view,event){var action=get(view,eventName),on=get(view,"onEvent"),value=get(view,"value");if(on===eventName||on==="keyPress"&&eventName==="key-press"){view.sendAction("action",value)}view.sendAction(eventName,value);if(action||on===eventName){if(!get(view,"bubbles")){event.stopPropagation()}}}__exports__["default"]=TextSupport});define("ember-handlebars/ext",["ember-metal/core","ember-runtime/system/string","ember-handlebars-compiler","ember-metal/property_get","ember-metal/binding","ember-metal/error","ember-metal/mixin","ember-metal/is_empty","ember-metal/cache","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__exports__){"use strict";var Ember=__dependency1__["default"];var fmt=__dependency2__.fmt;var EmberHandlebars=__dependency3__["default"];var helpers=EmberHandlebars.helpers;var get=__dependency4__.get;var isGlobalPath=__dependency5__.isGlobalPath;var EmberError=__dependency6__["default"];var IS_BINDING=__dependency7__.IS_BINDING;var resolveHelper,SimpleHandlebarsView;var isEmpty=__dependency8__["default"];var slice=[].slice,originalTemplate=EmberHandlebars.template;var Cache=__dependency9__["default"];var FIRST_SEGMENT_CACHE=new Cache(1e3,function(path){return path.split(".",1)[0]});function normalizePath(root,path,data){var keywords=data&&data.keywords||{};var keyword,isKeyword;keyword=FIRST_SEGMENT_CACHE.get(path);if(keywords.hasOwnProperty(keyword)){root=keywords[keyword];isKeyword=true;if(path===keyword){path=""}else{path=path.substr(keyword.length+1)}}return{root:root,path:path,isKeyword:isKeyword}}function handlebarsGet(root,path,options){var data=options&&options.data;var normalizedPath=normalizePath(root,path,data);var value;root=normalizedPath.root;path=normalizedPath.path;value=get(root,path);if(isGlobalPath(path)){if(value===undefined&&root!==Ember.lookup){root=Ember.lookup;value=get(root,path)}if(root===Ember.lookup||root===null){}}return value}function getEscaped(root,path,options){var result=handlebarsGet(root,path,options);if(result===null||result===undefined){result=""}else if(!(result instanceof Handlebars.SafeString)){result=String(result)}if(!options.hash.unescaped){result=Handlebars.Utils.escapeExpression(result)}return result}__exports__.getEscaped=getEscaped;function resolveParams(context,params,options){var resolvedParams=[],types=options.types,param,type;for(var i=0,l=params.length;i2){options.data.isUnbound=true;helper=resolveHelper(container,property)||helpers.helperMissing;out=helper.apply(ctx,slice.call(arguments,1));delete options.data.isUnbound;return out}context=fn.contexts&&fn.contexts.length?fn.contexts[0]:ctx;return handlebarsGet(context,property,fn)}});define("ember-handlebars/helpers/view",["ember-metal/core","ember-runtime/system/object","ember-metal/property_get","ember-metal/property_set","ember-metal/mixin","ember-views/system/jquery","ember-views/views/view","ember-metal/binding","ember-metal/merge","ember-handlebars/ext","ember-runtime/system/string","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__exports__){"use strict";var Ember=__dependency1__["default"];var EmberObject=__dependency2__["default"];var get=__dependency3__.get;var set=__dependency4__.set;var IS_BINDING=__dependency5__.IS_BINDING;var jQuery=__dependency6__["default"];var View=__dependency7__["default"];var isGlobalPath=__dependency8__.isGlobalPath;var merge=__dependency9__["default"];var normalizePath=__dependency10__.normalizePath;var handlebarsGet=__dependency10__.handlebarsGet;var EmberString=__dependency11__["default"];var LOWERCASE_A_Z=/^[a-z]/,VIEW_PREFIX=/^view\./;function makeBindings(thisContext,options){var hash=options.hash,hashType=options.hashTypes;for(var prop in hash){if(hashType[prop]==="ID"){var value=hash[prop];if(IS_BINDING.test(prop)){}else{hash[prop+"Binding"]=value;hashType[prop+"Binding"]="STRING";delete hash[prop];delete hashType[prop]}}}if(hash.hasOwnProperty("idBinding")){options.silenceGlobalDeprecation=true;hash.id=handlebarsGet(thisContext,hash.idBinding,options);hashType.id="STRING";delete hash.idBinding;delete hashType.idBinding}}var ViewHelper=EmberObject.create({propertiesFromHTMLOptions:function(options){var hash=options.hash,data=options.data;var extensions={},classes=hash["class"],dup=false;if(hash.id){extensions.elementId=hash.id;dup=true}if(hash.tag){extensions.tagName=hash.tag;dup=true}if(classes){classes=classes.split(" ");extensions.classNames=classes;dup=true}if(hash.classBinding){extensions.classNameBindings=hash.classBinding.split(" ");dup=true}if(hash.classNameBindings){if(extensions.classNameBindings===undefined)extensions.classNameBindings=[];extensions.classNameBindings=extensions.classNameBindings.concat(hash.classNameBindings.split(" "));dup=true}if(hash.attributeBindings){extensions.attributeBindings=null;dup=true}if(dup){hash=merge({},hash);delete hash.id;delete hash.tag;delete hash["class"];delete hash.classBinding}var path;for(var prop in hash){if(!hash.hasOwnProperty(prop)){continue}if(IS_BINDING.test(prop)&&typeof hash[prop]==="string"){path=this.contextualizeBindingPath(hash[prop],data);if(path){hash[prop]=path}}}if(extensions.classNameBindings){for(var b in extensions.classNameBindings){var full=extensions.classNameBindings[b];if(typeof full==="string"){var parsedPath=View._parsePropertyPath(full);path=this.contextualizeBindingPath(parsedPath.path,data);if(path){extensions.classNameBindings[b]=path+parsedPath.classNames}}}}return merge(hash,extensions)},contextualizeBindingPath:function(path,data){var normalized=normalizePath(null,path,data);if(normalized.isKeyword){return"templateData.keywords."+path}else if(isGlobalPath(path)){return null}else if(path==="this"||path===""){return"_parentView.context"}else{return"_parentView.context."+path}},helper:function(thisContext,path,options){var data=options.data,fn=options.fn,newView;makeBindings(thisContext,options);if("string"===typeof path){var lookup;if(options.types[0]==="STRING"&&LOWERCASE_A_Z.test(path)&&!VIEW_PREFIX.test(path)){lookup=path}else{options.silenceGlobalDeprecation=true;newView=handlebarsGet(thisContext,path,options);if(typeof newView==="string"){lookup=newView}}if(lookup){newView=data.view.container.lookupFactory("view:"+lookup)}}else{newView=path}var viewOptions=this.propertiesFromHTMLOptions(options,thisContext);var currentView=data.view;viewOptions.templateData=data;var newViewProto=newView.proto?newView.proto():newView;if(fn){viewOptions.template=fn}if(!newViewProto.controller&&!newViewProto.controllerBinding&&!viewOptions.controller&&!viewOptions.controllerBinding){viewOptions._context=thisContext}if(options.helperName){viewOptions.helperName=options.helperName}currentView.appendChild(newView,viewOptions)}});__exports__.ViewHelper=ViewHelper;function viewHelper(path,options){if(path&&path.data&&path.data.isRenderData){options=path;if(options.data&&options.data.view&&options.data.view.container){path=options.data.view.container.lookupFactory("view:toplevel")}else{path=View}}options.helperName=options.helperName||"view";return ViewHelper.helper(this,path,options)}__exports__.viewHelper=viewHelper});define("ember-handlebars/helpers/yield",["ember-metal/core","ember-metal/property_get","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;__exports__["default"]=function yieldHelper(options){var view=options.data.view;while(view&&!get(view,"layout")){if(view._contextView){view=view._contextView}else{view=get(view,"_parentView")}}view._yield(this,options)}});define("ember-handlebars/loader",["ember-handlebars/component_lookup","ember-views/system/jquery","ember-metal/error","ember-runtime/system/lazy_load","ember-handlebars-compiler","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var ComponentLookup=__dependency1__["default"];var jQuery=__dependency2__["default"];var EmberError=__dependency3__["default"];var onLoad=__dependency4__.onLoad;var EmberHandlebars=__dependency5__["default"];function bootstrap(ctx){var selectors='script[type="text/x-handlebars"], script[type="text/x-raw-handlebars"]';jQuery(selectors,ctx).each(function(){var script=jQuery(this);var compile=script.attr("type")==="text/x-raw-handlebars"?jQuery.proxy(Handlebars.compile,Handlebars):jQuery.proxy(EmberHandlebars.compile,EmberHandlebars),templateName=script.attr("data-template-name")||script.attr("id")||"application",template=compile(script.html());if(Ember.TEMPLATES[templateName]!==undefined){throw new EmberError('Template named "'+templateName+'" already exists.')}Ember.TEMPLATES[templateName]=template;script.remove()})}function _bootstrap(){bootstrap(jQuery(document))}function registerComponentLookup(container){container.register("component-lookup:main",ComponentLookup)}onLoad("Ember.Application",function(Application){Application.initializer({name:"domTemplates",initialize:_bootstrap});Application.initializer({name:"registerComponentLookup",after:"domTemplates",initialize:registerComponentLookup})});__exports__["default"]=bootstrap});define("ember-handlebars/string",["ember-runtime/system/string","exports"],function(__dependency1__,__exports__){"use strict";var EmberStringUtils=__dependency1__["default"];function htmlSafe(str){return new Handlebars.SafeString(str)}EmberStringUtils.htmlSafe=htmlSafe;if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.String){String.prototype.htmlSafe=function(){return htmlSafe(this)}}__exports__["default"]=htmlSafe});define("ember-handlebars/views/handlebars_bound_view",["ember-handlebars-compiler","ember-metal/core","ember-metal/error","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-views/views/view","ember-views/views/states","ember-handlebars/views/metamorph_view","ember-handlebars/ext","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__exports__){"use strict";var EmberHandlebars=__dependency1__["default"];var SafeString=EmberHandlebars.SafeString;var Ember=__dependency2__["default"];var K=Ember.K;var Metamorph=requireModule("metamorph");var EmberError=__dependency3__["default"];var get=__dependency4__.get;var set=__dependency5__.set;var merge=__dependency6__["default"];var run=__dependency7__["default"];var computed=__dependency8__.computed;var View=__dependency9__["default"];var cloneStates=__dependency10__.cloneStates;var states=__dependency10__.states;var viewStates=states;var _MetamorphView=__dependency11__["default"];var handlebarsGet=__dependency12__.handlebarsGet;var uuid=__dependency13__.uuid;function SimpleHandlebarsView(path,pathRoot,isEscaped,templateData){this.path=path;this.pathRoot=pathRoot;this.isEscaped=isEscaped;this.templateData=templateData;this[Ember.GUID_KEY]=uuid();this._lastNormalizedValue=undefined;this.morph=Metamorph();this.state="preRender";this.updateId=null;this._parentView=null;this.buffer=null}SimpleHandlebarsView.prototype={isVirtual:true,isView:true,destroy:function(){if(this.updateId){run.cancel(this.updateId);this.updateId=null}if(this._parentView){this._parentView.removeChild(this)}this.morph=null;this.state="destroyed"},propertyWillChange:K,propertyDidChange:K,normalizedValue:function(){var path=this.path;var pathRoot=this.pathRoot;var result,templateData;if(path===""){result=pathRoot}else{templateData=this.templateData;result=handlebarsGet(pathRoot,path,{data:templateData})}return result},renderToBuffer:function(buffer){var string="";string+=this.morph.startTag();string+=this.render();string+=this.morph.endTag();buffer.push(string)},render:function(value){var escape=this.isEscaped;var result=value||this.normalizedValue();this._lastNormalizedValue=result;if(result===null||result===undefined){result=""}else if(!(result instanceof SafeString)){result=String(result)}if(escape){result=Handlebars.Utils.escapeExpression(result)}return result},rerender:function(){switch(this.state){case"preRender":case"destroyed":break;case"inBuffer":throw new EmberError("Something you did tried to replace an {{expression}} before it was inserted into the DOM.");case"hasElement":case"inDOM":this.updateId=run.scheduleOnce("render",this,"update");break}return this},update:function(){this.updateId=null;var value=this.normalizedValue();if(value!==this._lastNormalizedValue){this.morph.html(this.render(value))}},_transitionTo:function(state){this.state=state}};states=cloneStates(viewStates);merge(states._default,{rerenderIfNeeded:K});merge(states.inDOM,{rerenderIfNeeded:function(view){if(view.normalizedValue()!==view._lastNormalizedValue){view.rerender()}}});var _HandlebarsBoundView=_MetamorphView.extend({instrumentName:"boundHandlebars",_states:states,shouldDisplayFunc:null,preserveContext:false,previousContext:null,displayTemplate:null,inverseTemplate:null,path:null,pathRoot:null,normalizedValue:function(){var path=get(this,"path");var pathRoot=get(this,"pathRoot");var valueNormalizer=get(this,"valueNormalizerFunc");var result,templateData;if(path===""){result=pathRoot}else{templateData=get(this,"templateData");result=handlebarsGet(pathRoot,path,{data:templateData})}return valueNormalizer?valueNormalizer(result):result},rerenderIfNeeded:function(){this.currentState.rerenderIfNeeded(this)},render:function(buffer){var escape=get(this,"isEscaped");var shouldDisplay=get(this,"shouldDisplayFunc");var preserveContext=get(this,"preserveContext");var context=get(this,"previousContext");var inverseTemplate=get(this,"inverseTemplate");var displayTemplate=get(this,"displayTemplate");var result=this.normalizedValue();this._lastNormalizedValue=result;if(shouldDisplay(result)){set(this,"template",displayTemplate);if(preserveContext){set(this,"_context",context)}else{if(displayTemplate){set(this,"_context",result)}else{if(result===null||result===undefined){result=""}else if(!(result instanceof SafeString)){result=String(result)}if(escape){result=Handlebars.Utils.escapeExpression(result)}buffer.push(result);return}}}else if(inverseTemplate){set(this,"template",inverseTemplate);if(preserveContext){set(this,"_context",context)}else{set(this,"_context",result)}}else{set(this,"template",function(){return""})}return this._super(buffer)}});__exports__._HandlebarsBoundView=_HandlebarsBoundView;__exports__.SimpleHandlebarsView=SimpleHandlebarsView});define("ember-handlebars/views/metamorph_view",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-metal/run_loop","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__["default"];var CoreView=__dependency4__["default"];var View=__dependency5__["default"];var Mixin=__dependency6__.Mixin;var run=__dependency7__["default"];var Metamorph=requireModule("metamorph");function notifyMutationListeners(){run.once(View,"notifyMutationListeners")}var DOMManager={remove:function(view){view.morph.remove();notifyMutationListeners()},prepend:function(view,html){view.morph.prepend(html);notifyMutationListeners()},after:function(view,html){view.morph.after(html);notifyMutationListeners()},html:function(view,html){view.morph.html(html);notifyMutationListeners()},replace:function(view){var morph=view.morph;view._transitionTo("preRender");run.schedule("render",this,function renderMetamorphView(){if(view.isDestroying){return}view.clearRenderedChildren();var buffer=view.renderToBuffer();view.invokeRecursively(function(view){view.propertyWillChange("element")});view.triggerRecursively("willInsertElement");morph.replaceWith(buffer.string());view._transitionTo("inDOM");view.invokeRecursively(function(view){view.propertyDidChange("element")});view.triggerRecursively("didInsertElement");notifyMutationListeners()})},empty:function(view){view.morph.html("");notifyMutationListeners()}};var _Metamorph=Mixin.create({isVirtual:true,tagName:"",instrumentName:"metamorph",init:function(){this._super();this.morph=Metamorph()},beforeRender:function(buffer){buffer.push(this.morph.startTag());buffer.pushOpeningTag()},afterRender:function(buffer){buffer.pushClosingTag();buffer.push(this.morph.endTag())},createElement:function(){var buffer=this.renderToBuffer();this.outerHTML=buffer.string();this.clearBuffer()},domManager:DOMManager});__exports__._Metamorph=_Metamorph;var _wrapMap=Metamorph._wrapMap;__exports__._wrapMap=_wrapMap;var _MetamorphView=View.extend(_Metamorph);__exports__._MetamorphView=_MetamorphView;var _SimpleMetamorphView=CoreView.extend(_Metamorph);__exports__._SimpleMetamorphView=_SimpleMetamorphView;__exports__["default"]=View.extend(_Metamorph)});define("ember-metal",["ember-metal/core","ember-metal/merge","ember-metal/instrumentation","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/cache","ember-metal/platform","ember-metal/array","ember-metal/logger","ember-metal/property_get","ember-metal/events","ember-metal/observer_set","ember-metal/property_events","ember-metal/properties","ember-metal/property_set","ember-metal/map","ember-metal/get_properties","ember-metal/set_properties","ember-metal/watch_key","ember-metal/chains","ember-metal/watch_path","ember-metal/watching","ember-metal/expand_properties","ember-metal/computed","ember-metal/computed_macros","ember-metal/observer","ember-metal/mixin","ember-metal/binding","ember-metal/run_loop","ember-metal/libraries","ember-metal/is_none","ember-metal/is_empty","ember-metal/is_blank","ember-metal/is_present","ember-metal/keys","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__dependency17__,__dependency18__,__dependency19__,__dependency20__,__dependency21__,__dependency22__,__dependency23__,__dependency24__,__dependency25__,__dependency26__,__dependency27__,__dependency28__,__dependency29__,__dependency30__,__dependency31__,__dependency32__,__dependency33__,__dependency34__,__dependency35__,__dependency36__,__exports__){"use strict";var Ember=__dependency1__["default"];var merge=__dependency2__["default"];var instrument=__dependency3__.instrument;var subscribe=__dependency3__.subscribe;var unsubscribe=__dependency3__.unsubscribe; +var reset=__dependency3__.reset;var generateGuid=__dependency4__.generateGuid;var GUID_KEY=__dependency4__.GUID_KEY;var guidFor=__dependency4__.guidFor;var META_DESC=__dependency4__.META_DESC;var EMPTY_META=__dependency4__.EMPTY_META;var meta=__dependency4__.meta;var getMeta=__dependency4__.getMeta;var setMeta=__dependency4__.setMeta;var metaPath=__dependency4__.metaPath;var inspect=__dependency4__.inspect;var typeOf=__dependency4__.typeOf;var tryCatchFinally=__dependency4__.tryCatchFinally;var isArray=__dependency4__.isArray;var makeArray=__dependency4__.makeArray;var canInvoke=__dependency4__.canInvoke;var tryInvoke=__dependency4__.tryInvoke;var tryFinally=__dependency4__.tryFinally;var wrap=__dependency4__.wrap;var apply=__dependency4__.apply;var applyStr=__dependency4__.applyStr;var EmberError=__dependency5__["default"];var EnumerableUtils=__dependency6__["default"];var Cache=__dependency7__["default"];var create=__dependency8__.create;var platform=__dependency8__.platform;var map=__dependency9__.map;var forEach=__dependency9__.forEach;var filter=__dependency9__.filter;var indexOf=__dependency9__.indexOf;var Logger=__dependency10__["default"];var get=__dependency11__.get;var getWithDefault=__dependency11__.getWithDefault;var normalizeTuple=__dependency11__.normalizeTuple;var _getPath=__dependency11__._getPath;var on=__dependency12__.on;var addListener=__dependency12__.addListener;var removeListener=__dependency12__.removeListener;var suspendListener=__dependency12__.suspendListener;var suspendListeners=__dependency12__.suspendListeners;var sendEvent=__dependency12__.sendEvent;var hasListeners=__dependency12__.hasListeners;var watchedEvents=__dependency12__.watchedEvents;var listenersFor=__dependency12__.listenersFor;var listenersDiff=__dependency12__.listenersDiff;var listenersUnion=__dependency12__.listenersUnion;var ObserverSet=__dependency13__["default"];var propertyWillChange=__dependency14__.propertyWillChange;var propertyDidChange=__dependency14__.propertyDidChange;var overrideChains=__dependency14__.overrideChains;var beginPropertyChanges=__dependency14__.beginPropertyChanges;var endPropertyChanges=__dependency14__.endPropertyChanges;var changeProperties=__dependency14__.changeProperties;var Descriptor=__dependency15__.Descriptor;var defineProperty=__dependency15__.defineProperty;var set=__dependency16__.set;var trySet=__dependency16__.trySet;var OrderedSet=__dependency17__.OrderedSet;var Map=__dependency17__.Map;var MapWithDefault=__dependency17__.MapWithDefault;var getProperties=__dependency18__["default"];var setProperties=__dependency19__["default"];var watchKey=__dependency20__.watchKey;var unwatchKey=__dependency20__.unwatchKey;var flushPendingChains=__dependency21__.flushPendingChains;var removeChainWatcher=__dependency21__.removeChainWatcher;var ChainNode=__dependency21__.ChainNode;var finishChains=__dependency21__.finishChains;var watchPath=__dependency22__.watchPath;var unwatchPath=__dependency22__.unwatchPath;var watch=__dependency23__.watch;var isWatching=__dependency23__.isWatching;var unwatch=__dependency23__.unwatch;var rewatch=__dependency23__.rewatch;var destroy=__dependency23__.destroy;var expandProperties=__dependency24__["default"];var ComputedProperty=__dependency25__.ComputedProperty;var computed=__dependency25__.computed;var cacheFor=__dependency25__.cacheFor;var addObserver=__dependency27__.addObserver;var observersFor=__dependency27__.observersFor;var removeObserver=__dependency27__.removeObserver;var addBeforeObserver=__dependency27__.addBeforeObserver;var _suspendBeforeObserver=__dependency27__._suspendBeforeObserver;var _suspendObserver=__dependency27__._suspendObserver;var _suspendBeforeObservers=__dependency27__._suspendBeforeObservers;var _suspendObservers=__dependency27__._suspendObservers;var beforeObserversFor=__dependency27__.beforeObserversFor;var removeBeforeObserver=__dependency27__.removeBeforeObserver;var IS_BINDING=__dependency28__.IS_BINDING;var mixin=__dependency28__.mixin;var Mixin=__dependency28__.Mixin;var required=__dependency28__.required;var aliasMethod=__dependency28__.aliasMethod;var observer=__dependency28__.observer;var immediateObserver=__dependency28__.immediateObserver;var beforeObserver=__dependency28__.beforeObserver;var Binding=__dependency29__.Binding;var isGlobalPath=__dependency29__.isGlobalPath;var bind=__dependency29__.bind;var oneWay=__dependency29__.oneWay;var run=__dependency30__["default"];var libraries=__dependency31__["default"];var isNone=__dependency32__.isNone;var none=__dependency32__.none;var isEmpty=__dependency33__.isEmpty;var empty=__dependency33__.empty;var isBlank=__dependency34__["default"];var isPresent=__dependency35__["default"];var keys=__dependency36__["default"];var EmberInstrumentation=Ember.Instrumentation={};EmberInstrumentation.instrument=instrument;EmberInstrumentation.subscribe=subscribe;EmberInstrumentation.unsubscribe=unsubscribe;EmberInstrumentation.reset=reset;Ember.instrument=instrument;Ember.subscribe=subscribe;Ember._Cache=Cache;Ember.generateGuid=generateGuid;Ember.GUID_KEY=GUID_KEY;Ember.create=create;Ember.keys=keys;Ember.platform=platform;var EmberArrayPolyfills=Ember.ArrayPolyfills={};EmberArrayPolyfills.map=map;EmberArrayPolyfills.forEach=forEach;EmberArrayPolyfills.filter=filter;EmberArrayPolyfills.indexOf=indexOf;Ember.Error=EmberError;Ember.guidFor=guidFor;Ember.META_DESC=META_DESC;Ember.EMPTY_META=EMPTY_META;Ember.meta=meta;Ember.getMeta=getMeta;Ember.setMeta=setMeta;Ember.metaPath=metaPath;Ember.inspect=inspect;Ember.typeOf=typeOf;Ember.tryCatchFinally=tryCatchFinally;Ember.isArray=isArray;Ember.makeArray=makeArray;Ember.canInvoke=canInvoke;Ember.tryInvoke=tryInvoke;Ember.tryFinally=tryFinally;Ember.wrap=wrap;Ember.apply=apply;Ember.applyStr=applyStr;Ember.Logger=Logger;Ember.get=get;Ember.getWithDefault=getWithDefault;Ember.normalizeTuple=normalizeTuple;Ember._getPath=_getPath;Ember.EnumerableUtils=EnumerableUtils;Ember.on=on;Ember.addListener=addListener;Ember.removeListener=removeListener;Ember._suspendListener=suspendListener;Ember._suspendListeners=suspendListeners;Ember.sendEvent=sendEvent;Ember.hasListeners=hasListeners;Ember.watchedEvents=watchedEvents;Ember.listenersFor=listenersFor;Ember.listenersDiff=listenersDiff;Ember.listenersUnion=listenersUnion;Ember._ObserverSet=ObserverSet;Ember.propertyWillChange=propertyWillChange;Ember.propertyDidChange=propertyDidChange;Ember.overrideChains=overrideChains;Ember.beginPropertyChanges=beginPropertyChanges;Ember.endPropertyChanges=endPropertyChanges;Ember.changeProperties=changeProperties;Ember.Descriptor=Descriptor;Ember.defineProperty=defineProperty;Ember.set=set;Ember.trySet=trySet;Ember.OrderedSet=OrderedSet;Ember.Map=Map;Ember.MapWithDefault=MapWithDefault;Ember.getProperties=getProperties;Ember.setProperties=setProperties;Ember.watchKey=watchKey;Ember.unwatchKey=unwatchKey;Ember.flushPendingChains=flushPendingChains;Ember.removeChainWatcher=removeChainWatcher;Ember._ChainNode=ChainNode;Ember.finishChains=finishChains;Ember.watchPath=watchPath;Ember.unwatchPath=unwatchPath;Ember.watch=watch;Ember.isWatching=isWatching;Ember.unwatch=unwatch;Ember.rewatch=rewatch;Ember.destroy=destroy;Ember.expandProperties=expandProperties;Ember.ComputedProperty=ComputedProperty;Ember.computed=computed;Ember.cacheFor=cacheFor;Ember.addObserver=addObserver;Ember.observersFor=observersFor;Ember.removeObserver=removeObserver;Ember.addBeforeObserver=addBeforeObserver;Ember._suspendBeforeObserver=_suspendBeforeObserver;Ember._suspendBeforeObservers=_suspendBeforeObservers;Ember._suspendObserver=_suspendObserver;Ember._suspendObservers=_suspendObservers;Ember.beforeObserversFor=beforeObserversFor;Ember.removeBeforeObserver=removeBeforeObserver;Ember.IS_BINDING=IS_BINDING;Ember.required=required;Ember.aliasMethod=aliasMethod;Ember.observer=observer;Ember.immediateObserver=immediateObserver;Ember.beforeObserver=beforeObserver;Ember.mixin=mixin;Ember.Mixin=Mixin;Ember.oneWay=oneWay;Ember.bind=bind;Ember.Binding=Binding;Ember.isGlobalPath=isGlobalPath;Ember.run=run;Ember.libraries=libraries;Ember.libraries.registerCoreLibrary("Ember",Ember.VERSION);Ember.isNone=isNone;Ember.none=none;Ember.isEmpty=isEmpty;Ember.empty=empty;Ember.isBlank=isBlank;if(Ember.FEATURES.isEnabled("ember-metal-is-present")){Ember.isPresent=isPresent}Ember.merge=merge;Ember.onerror=null;if(Ember.__loader.registry["ember-debug"]){requireModule("ember-debug")}__exports__["default"]=Ember});define("ember-metal/alias",["ember-metal/property_get","ember-metal/property_set","ember-metal/error","ember-metal/properties","ember-metal/computed","ember-metal/platform","ember-metal/utils","ember-metal/dependent_keys","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var EmberError=__dependency3__["default"];var Descriptor=__dependency4__.Descriptor;var defineProperty=__dependency4__.defineProperty;var ComputedProperty=__dependency5__.ComputedProperty;var create=__dependency6__.create;var meta=__dependency7__.meta;var inspect=__dependency7__.inspect;var addDependentKeys=__dependency8__.addDependentKeys;var removeDependentKeys=__dependency8__.removeDependentKeys;function alias(altKey){return new AliasedProperty(altKey)}__exports__.alias=alias;function AliasedProperty(altKey){this.altKey=altKey;this._dependentKeys=[altKey]}__exports__.AliasedProperty=AliasedProperty;AliasedProperty.prototype=create(Descriptor.prototype);AliasedProperty.prototype.get=function AliasedProperty_get(obj,keyName){return get(obj,this.altKey)};AliasedProperty.prototype.set=function AliasedProperty_set(obj,keyName,value){return set(obj,this.altKey,value)};AliasedProperty.prototype.willWatch=function(obj,keyName){addDependentKeys(this,obj,keyName,meta(obj))};AliasedProperty.prototype.didUnwatch=function(obj,keyName){removeDependentKeys(this,obj,keyName,meta(obj))};AliasedProperty.prototype.setup=function(obj,keyName){var m=meta(obj);if(m.watching[keyName]){addDependentKeys(this,obj,keyName,m)}};AliasedProperty.prototype.teardown=function(obj,keyName){var m=meta(obj);if(m.watching[keyName]){removeDependentKeys(this,obj,keyName,m)}};AliasedProperty.prototype.readOnly=function(){this.set=AliasedProperty_readOnlySet;return this};function AliasedProperty_readOnlySet(obj,keyName,value){throw new EmberError('Cannot set read-only property "'+keyName+'" on object: '+inspect(obj))}AliasedProperty.prototype.oneWay=function(){this.set=AliasedProperty_oneWaySet;return this};function AliasedProperty_oneWaySet(obj,keyName,value){defineProperty(obj,keyName,null);return set(obj,keyName,value)}AliasedProperty.prototype._meta=undefined;AliasedProperty.prototype.meta=ComputedProperty.prototype.meta});define("ember-metal/array",["exports"],function(__exports__){"use strict";var ArrayPrototype=Array.prototype;var isNativeFunc=function(func){return func&&Function.prototype.toString.call(func).indexOf("[native code]")>-1};var defineNativeShim=function(nativeFunc,shim){if(isNativeFunc(nativeFunc)){return nativeFunc}return shim};var map=defineNativeShim(ArrayPrototype.map,function(fun){if(this===void 0||this===null||typeof fun!=="function"){throw new TypeError}var t=Object(this);var len=t.length>>>0;var res=new Array(len);var thisp=arguments[1];for(var i=0;i>>0;var thisp=arguments[1];for(var i=0;i=0;idx--){if(this[idx]===obj)return idx}return-1});var filter=defineNativeShim(ArrayPrototype.filter,function(fn,context){var i,value,result=[],length=this.length;for(i=0;i("+this._from+" -> "+this._to+")"+oneWay},connect:function(obj){var fromPath=this._from,toPath=this._to;trySet(obj,toPath,getWithGlobals(obj,fromPath));addObserver(obj,fromPath,this,this.fromDidChange);if(!this._oneWay){addObserver(obj,toPath,this,this.toDidChange)}this._readyToSync=true;return this},disconnect:function(obj){var twoWay=!this._oneWay;removeObserver(obj,this._from,this,this.fromDidChange);if(twoWay){removeObserver(obj,this._to,this,this.toDidChange)}this._readyToSync=false;return this},fromDidChange:function(target){this._scheduleSync(target,"fwd")},toDidChange:function(target){this._scheduleSync(target,"back")},_scheduleSync:function(obj,dir){var directionMap=this._directionMap;var existingDir=directionMap.get(obj);if(!existingDir){run.schedule("sync",this,this._sync,obj);directionMap.set(obj,dir)}if(existingDir==="back"&&dir==="fwd"){directionMap.set(obj,"fwd")}},_sync:function(obj){var log=Ember.LOG_BINDINGS;if(obj.isDestroyed||!this._readyToSync){return}var directionMap=this._directionMap;var direction=directionMap.get(obj);var fromPath=this._from,toPath=this._to;directionMap.remove(obj);if(direction==="fwd"){var fromValue=getWithGlobals(obj,this._from);if(log){Ember.Logger.log(" ",this.toString(),"->",fromValue,obj)}if(this._oneWay){trySet(obj,toPath,fromValue)}else{_suspendObserver(obj,toPath,this,this.toDidChange,function(){trySet(obj,toPath,fromValue)})}}else if(direction==="back"){var toValue=get(obj,this._to);if(log){Ember.Logger.log(" ",this.toString(),"<-",toValue,obj)}_suspendObserver(obj,fromPath,this,this.fromDidChange,function(){trySet(isGlobalPath(fromPath)?Ember.lookup:obj,fromPath,toValue)})}}};function mixinProperties(to,from){for(var key in from){if(from.hasOwnProperty(key)){to[key]=from[key]}}}mixinProperties(Binding,{from:function(){var C=this,binding=new C;return binding.from.apply(binding,arguments)},to:function(){var C=this,binding=new C;return binding.to.apply(binding,arguments)},oneWay:function(from,flag){var C=this,binding=new C(null,from);return binding.oneWay(flag)}});function bind(obj,to,from){return new Binding(to,from).connect(obj)}__exports__.bind=bind;function oneWay(obj,to,from){return new Binding(to,from).oneWay().connect(obj)}__exports__.oneWay=oneWay;__exports__.Binding=Binding;__exports__.isGlobalPath=isGlobalPath});define("ember-metal/cache",["ember-metal/dictionary","exports"],function(__dependency1__,__exports__){"use strict";var dictionary=__dependency1__["default"];__exports__["default"]=Cache;function Cache(limit,func){this.store=dictionary(null);this.size=0;this.misses=0;this.hits=0;this.limit=limit;this.func=func}var FALSE=function(){};var ZERO=function(){};var UNDEFINED=function(){};var NULL=function(){};Cache.prototype={set:function(key,value){if(this.limit>this.size){this.size++;if(value===undefined){this.store[key]=UNDEFINED}else{this.store[key]=value}}return value},get:function(key){var value=this.store[key];if(value===undefined){this.misses++;value=this.set(key,this.func(key))}else if(value===UNDEFINED){this.hits++;value=UNDEFINED}else{this.hits++}return value},purge:function(){this.store=dictionary(null);this.size=0;this.hits=0;this.misses=0}}});define("ember-metal/chains",["ember-metal/core","ember-metal/property_get","ember-metal/utils","ember-metal/array","ember-metal/watch_key","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var normalizeTuple=__dependency2__.normalizeTuple;var meta=__dependency3__.meta;var forEach=__dependency4__.forEach;var watchKey=__dependency5__.watchKey;var unwatchKey=__dependency5__.unwatchKey;var metaFor=meta,warn=Ember.warn,FIRST_KEY=/^([^\.]+)/;function firstKey(path){return path.match(FIRST_KEY)[0]}var pendingQueue=[];function flushPendingChains(){if(pendingQueue.length===0){return}var queue=pendingQueue;pendingQueue=[];forEach.call(queue,function(q){q[0].add(q[1])});warn("Watching an undefined global, Ember expects watched globals to be setup by the time the run loop is flushed, check for typos",pendingQueue.length===0)}__exports__.flushPendingChains=flushPendingChains;function addChainWatcher(obj,keyName,node){if(!obj||"object"!==typeof obj){return}var m=metaFor(obj),nodes=m.chainWatchers;if(!m.hasOwnProperty("chainWatchers")){nodes=m.chainWatchers={}}if(!nodes[keyName]){nodes[keyName]=[]}nodes[keyName].push(node);watchKey(obj,keyName,m)}function removeChainWatcher(obj,keyName,node){if(!obj||"object"!==typeof obj){return}var m=obj["__ember_meta__"];if(m&&!m.hasOwnProperty("chainWatchers")){return}var nodes=m&&m.chainWatchers;if(nodes&&nodes[keyName]){nodes=nodes[keyName];for(var i=0,l=nodes.length;i0){paths[path]--}obj=this.value();tuple=normalizeTuple(obj,path);if(tuple[0]===obj){path=tuple[1];key=firstKey(path);path=path.slice(key.length+1)}else{src=tuple[0];key=path.slice(0,0-(tuple[1].length+1));path=tuple[1]}tuple.length=0;this.unchain(key,path)};ChainNodePrototype.count=0;ChainNodePrototype.chain=function(key,path,src){var chains=this._chains,node;if(!chains){chains=this._chains={}}node=chains[key];if(!node){node=chains[key]=new ChainNode(this,key,src)}node.count++;if(path){key=firstKey(path);path=path.slice(key.length+1);node.chain(key,path)}};ChainNodePrototype.unchain=function(key,path){var chains=this._chains,node=chains[key];if(path&&path.length>1){key=firstKey(path);path=path.slice(key.length+1);node.unchain(key,path)}node.count--;if(node.count<=0){delete chains[node._key];node.destroy()}};ChainNodePrototype.willChange=function(events){var chains=this._chains;if(chains){for(var key in chains){if(!chains.hasOwnProperty(key)){continue}chains[key].willChange(events)}}if(this._parent){this._parent.chainWillChange(this,this._key,1,events)}};ChainNodePrototype.chainWillChange=function(chain,path,depth,events){if(this._key){path=this._key+"."+path}if(this._parent){this._parent.chainWillChange(this,path,depth+1,events)}else{if(depth>1){events.push(this.value(),path)}path="this."+path;if(this._paths[path]>0){events.push(this.value(),path)}}};ChainNodePrototype.chainDidChange=function(chain,path,depth,events){if(this._key){path=this._key+"."+path}if(this._parent){this._parent.chainDidChange(this,path,depth+1,events)}else{if(depth>1){events.push(this.value(),path)}path="this."+path;if(this._paths[path]>0){events.push(this.value(),path)}}};ChainNodePrototype.didChange=function(events){if(this._watching){var obj=this._parent.value();if(obj!==this._object){removeChainWatcher(this._object,this._key,this);this._object=obj;addChainWatcher(obj,this._key,this)}this._value=undefined;if(this._parent&&this._parent._key==="@each")this.value()}var chains=this._chains;if(chains){for(var key in chains){if(!chains.hasOwnProperty(key)){continue}chains[key].didChange(events)}}if(events===null){return}if(this._parent){this._parent.chainDidChange(this,this._key,1,events)}};function finishChains(obj){var m=obj["__ember_meta__"],chains=m&&m.chains;if(chains){if(chains.value()!==obj){metaFor(obj).chains=chains=chains.copy(obj)}else{chains.didChange(null)}}}__exports__.finishChains=finishChains;__exports__.removeChainWatcher=removeChainWatcher;__exports__.ChainNode=ChainNode});define("ember-metal/computed",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/expand_properties","ember-metal/error","ember-metal/properties","ember-metal/property_events","ember-metal/dependent_keys","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var meta=__dependency4__.meta;var inspect=__dependency4__.inspect;var expandProperties=__dependency5__["default"];var EmberError=__dependency6__["default"];var Descriptor=__dependency7__.Descriptor;var defineProperty=__dependency7__.defineProperty;var propertyWillChange=__dependency8__.propertyWillChange;var propertyDidChange=__dependency8__.propertyDidChange;var addDependentKeys=__dependency9__.addDependentKeys;var removeDependentKeys=__dependency9__.removeDependentKeys;var metaFor=meta,a_slice=[].slice;function UNDEFINED(){}function ComputedProperty(func,opts){func.__ember_arity__=func.length;this.func=func;this._cacheable=opts&&opts.cacheable!==undefined?opts.cacheable:true;this._dependentKeys=opts&&opts.dependentKeys;this._readOnly=opts&&(opts.readOnly!==undefined||!!opts.readOnly)||false}ComputedProperty.prototype=new Descriptor;var ComputedPropertyPrototype=ComputedProperty.prototype;ComputedPropertyPrototype._dependentKeys=undefined;ComputedPropertyPrototype._suspended=undefined;ComputedPropertyPrototype._meta=undefined;ComputedPropertyPrototype.cacheable=function(aFlag){this._cacheable=aFlag!==false;return this};ComputedPropertyPrototype["volatile"]=function(){return this.cacheable(false)};ComputedPropertyPrototype.readOnly=function(readOnly){this._readOnly=readOnly===undefined||!!readOnly;return this};ComputedPropertyPrototype.property=function(){var args;var addArg=function(property){args.push(property)};args=[];for(var i=0,l=arguments.length;i1){args=a_slice.call(arguments);func=args.pop()}if(typeof func!=="function"){throw new EmberError("Computed Property declared without a property function")}var cp=new ComputedProperty(func);if(args){cp.property.apply(cp,args)}return cp}function cacheFor(obj,key){var meta=obj["__ember_meta__"];var cache=meta&&meta.cache;var ret=cache&&cache[key];if(ret===UNDEFINED){return undefined}return ret}cacheFor.set=function(cache,key,value){if(value===undefined){cache[key]=UNDEFINED}else{cache[key]=value}};cacheFor.get=function(cache,key){var ret=cache[key];if(ret===UNDEFINED){return undefined}return ret};cacheFor.remove=function(cache,key){cache[key]=undefined};__exports__.ComputedProperty=ComputedProperty;__exports__.computed=computed;__exports__.cacheFor=cacheFor});define("ember-metal/computed_macros",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/computed","ember-metal/is_empty","ember-metal/is_none","ember-metal/alias"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var computed=__dependency4__.computed;var isEmpty=__dependency5__["default"];var isNone=__dependency6__.isNone;var alias=__dependency7__.alias;var a_slice=[].slice;function getProperties(self,propertyNames){var ret={};for(var i=0;ivalue});registerComputed("gte",function(dependentKey,value){return get(this,dependentKey)>=value});registerComputed("lt",function(dependentKey,value){return get(this,dependentKey)1){set(this,dependentKey,value);return value}else{return get(this,dependentKey)}})}});define("ember-metal/core",["exports"],function(__exports__){"use strict";if("undefined"===typeof Ember){Ember={}}var imports=Ember.imports=Ember.imports||this;var exports=Ember.exports=Ember.exports||this;var lookup=Ember.lookup=Ember.lookup||this;exports.Em=exports.Ember=Ember;Ember.isNamespace=true;Ember.toString=function(){return"Ember"};Ember.VERSION="1.8.0-beta.1+canary.919cf869";if(Ember.ENV){}else if("undefined"!==typeof EmberENV){Ember.ENV=EmberENV}else if("undefined"!==typeof ENV){Ember.ENV=ENV}else{Ember.ENV={}}Ember.config=Ember.config||{};if("undefined"===typeof Ember.ENV.DISABLE_RANGE_API){Ember.ENV.DISABLE_RANGE_API=true}if("undefined"===typeof MetamorphENV){exports.MetamorphENV={}}MetamorphENV.DISABLE_RANGE_API=Ember.ENV.DISABLE_RANGE_API;Ember.FEATURES=Ember.ENV.FEATURES||{};Ember.FEATURES.isEnabled=function(feature){var featureValue=Ember.FEATURES[feature];if(Ember.ENV.ENABLE_ALL_FEATURES){return true}else if(featureValue===true||featureValue===false||featureValue===undefined){return featureValue}else if(Ember.ENV.ENABLE_OPTIONAL_FEATURES){return true}else{return false}};Ember.EXTEND_PROTOTYPES=Ember.ENV.EXTEND_PROTOTYPES;if(typeof Ember.EXTEND_PROTOTYPES==="undefined"){Ember.EXTEND_PROTOTYPES=true}Ember.LOG_STACKTRACE_ON_DEPRECATION=Ember.ENV.LOG_STACKTRACE_ON_DEPRECATION!==false;Ember.SHIM_ES5=Ember.ENV.SHIM_ES5===false?false:Ember.EXTEND_PROTOTYPES;Ember.LOG_VERSION=Ember.ENV.LOG_VERSION===false?false:true;var K=function(){return this};var K=K;__exports__.K=K;Ember.K=K;if("undefined"===typeof Ember.assert){Ember.assert=Ember.K}if("undefined"===typeof Ember.warn){Ember.warn=Ember.K}if("undefined"===typeof Ember.debug){Ember.debug=Ember.K}if("undefined"===typeof Ember.runInDebug){Ember.runInDebug=Ember.K}if("undefined"===typeof Ember.deprecate){Ember.deprecate=Ember.K}if("undefined"===typeof Ember.deprecateFunc){Ember.deprecateFunc=function(_,func){return func}}__exports__["default"]=Ember});define("ember-metal/dependent_keys",["ember-metal/platform","ember-metal/watching","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var create=__dependency1__.create;var watch=__dependency2__.watch;var unwatch=__dependency2__.unwatch;var o_create=create;function keysForDep(depsMeta,depKey){var keys=depsMeta[depKey];if(!keys){keys=depsMeta[depKey]={}}else if(!depsMeta.hasOwnProperty(depKey)){keys=depsMeta[depKey]=o_create(keys)}return keys}function metaForDeps(meta){return keysForDep(meta,"deps")}function addDependentKeys(desc,obj,keyName,meta){var depKeys=desc._dependentKeys,depsMeta,idx,len,depKey,keys;if(!depKeys)return;depsMeta=metaForDeps(meta);for(idx=0,len=depKeys.length;idxsize?size:ends;if(count<=0){count=0}chunk=args.splice(0,size);chunk=[start,count].concat(chunk);start+=size;ends-=count;ret=ret.concat(splice.apply(array,chunk))}return ret}__exports__._replace=_replace;function replace(array,idx,amt,objects){if(array.replace){return array.replace(idx,amt,objects)}else{return _replace(array,idx,amt,objects)}}__exports__.replace=replace;function intersection(array1,array2){var result=[];forEach(array1,function(element){if(indexOf(array2,element)>=0){result.push(element)}});return result}__exports__.intersection=intersection;__exports__["default"]={_replace:_replace,addObject:addObject,filter:filter,forEach:forEach,indexOf:indexOf,indexesOf:indexesOf,intersection:intersection,map:map,removeObject:removeObject,replace:replace}});define("ember-metal/error",["ember-metal/platform","exports"],function(__dependency1__,__exports__){"use strict";var create=__dependency1__.create;var errorProps=["description","fileName","lineNumber","message","name","number","stack"];function EmberError(){var tmp=Error.apply(this,arguments);if(Error.captureStackTrace){Error.captureStackTrace(this,Ember.Error)}for(var idx=0;idx=0;i-=3){if(target===array[i]&&method===array[i+1]){index=i;break}}return index}function actionsFor(obj,eventName){var meta=metaFor(obj,true),actions;if(!meta.listeners){meta.listeners={}}if(!meta.hasOwnProperty("listeners")){meta.listeners=create(meta.listeners)}actions=meta.listeners[eventName];if(actions&&!meta.listeners.hasOwnProperty(eventName)){actions=meta.listeners[eventName]=meta.listeners[eventName].slice()}else if(!actions){actions=meta.listeners[eventName]=[]}return actions}function listenersUnion(obj,eventName,otherActions){var meta=obj["__ember_meta__"],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2],actionIndex=indexOf(otherActions,target,method);if(actionIndex===-1){otherActions.push(target,method,flags)}}}__exports__.listenersUnion=listenersUnion;function listenersDiff(obj,eventName,otherActions){var meta=obj["__ember_meta__"],actions=meta&&meta.listeners&&meta.listeners[eventName],diffActions=[];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2],actionIndex=indexOf(otherActions,target,method);if(actionIndex!==-1){continue}otherActions.push(target,method,flags);diffActions.push(target,method,flags)}return diffActions}__exports__.listenersDiff=listenersDiff;function addListener(obj,eventName,target,method,once){if(!method&&"function"===typeof target){method=target;target=null}var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method),flags=0;if(once)flags|=ONCE;if(actionIndex!==-1){return}actions.push(target,method,flags);if("function"===typeof obj.didAddListener){obj.didAddListener(eventName,target,method)}}__exports__.addListener=addListener;function removeListener(obj,eventName,target,method){if(!method&&"function"===typeof target){method=target;target=null}function _removeListener(target,method){var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method);if(actionIndex===-1){return}actions.splice(actionIndex,3);if("function"===typeof obj.didRemoveListener){obj.didRemoveListener(eventName,target,method)}}if(method){_removeListener(target,method)}else{var meta=obj["__ember_meta__"],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return}for(var i=actions.length-3;i>=0;i-=3){_removeListener(actions[i],actions[i+1])}}}function suspendListener(obj,eventName,target,method,callback){if(!method&&"function"===typeof target){method=target;target=null}var actions=actionsFor(obj,eventName),actionIndex=indexOf(actions,target,method);if(actionIndex!==-1){actions[actionIndex+2]|=SUSPENDED}function tryable(){return callback.call(target)}function finalizer(){if(actionIndex!==-1){actions[actionIndex+2]&=~SUSPENDED}}return tryFinally(tryable,finalizer)}__exports__.suspendListener=suspendListener;function suspendListeners(obj,eventNames,target,method,callback){if(!method&&"function"===typeof target){method=target;target=null}var suspendedActions=[],actionsList=[],eventName,actions,i,l;for(i=0,l=eventNames.length;i=0;i-=3){var target=actions[i],method=actions[i+1],flags=actions[i+2];if(!method){continue}if(flags&SUSPENDED){continue}if(flags&ONCE){removeListener(obj,eventName,target,method)}if(!target){target=obj}if("string"===typeof method){if(params){applyStr(target,method,params)}else{target[method]()}}else{if(params){apply(target,method,params)}else{method.call(target)}}}return true}__exports__.sendEvent=sendEvent;function hasListeners(obj,eventName){var meta=obj["__ember_meta__"],actions=meta&&meta.listeners&&meta.listeners[eventName];return!!(actions&&actions.length)}__exports__.hasListeners=hasListeners;function listenersFor(obj,eventName){var ret=[];var meta=obj["__ember_meta__"],actions=meta&&meta.listeners&&meta.listeners[eventName];if(!actions){return ret}for(var i=0,l=actions.length;i-1){throw new EmberError("Brace expanded properties cannot contain spaces, "+"e.g. `user.{firstName, lastName}` should be `user.{firstName,lastName}`")}if(Ember.FEATURES.isEnabled("property-brace-expansion-improvement")){return newExpandProperties(pattern,callback)}else{return oldExpandProperties(pattern,callback)}};function oldExpandProperties(pattern,callback){var match,prefix,list;if(match=BRACE_EXPANSION.exec(pattern)){prefix=match[1];list=match[2];forEach(list.split(","),function(suffix){callback(prefix+suffix)})}else{callback(pattern)}}function newExpandProperties(pattern,callback){if("string"===Ember.typeOf(pattern)){var parts=pattern.split(SPLIT_REGEX),properties=[parts];forEach(parts,function(part,index){if(part.indexOf(",")>=0){properties=duplicateAndReplace(properties,part.split(","),index)}});forEach(properties,function(property){callback(property.join(""))})}else{callback(pattern)}}function duplicateAndReplace(properties,currentParts,index){var all=[];forEach(properties,function(property){forEach(currentParts,function(part){var current=property.slice(0);current[index]=part;all.push(current)})});return all}});define("ember-metal/get_properties",["ember-metal/property_get","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var get=__dependency1__.get;var typeOf=__dependency2__.typeOf;__exports__["default"]=function getProperties(obj){var ret={},propertyNames=arguments,i=1;if(arguments.length===2&&typeOf(arguments[1])==="array"){i=0;propertyNames=arguments[1]}for(var len=propertyNames.length;i=0){return}if(typeof obj.hasOwnProperty==="function"&&!obj.hasOwnProperty(key)){return}array.push(key)};keys=function keys(obj){var ret=[];var key;for(key in obj){pushPropertyName(obj,ret,key)}for(var i=0,l=prototypeProperties.length;i-1){list.splice(index,1)}},isEmpty:function(){return this.list.length===0},has:function(obj){var guid=guidFor(obj);var presenceSet=this.presenceSet;return presenceSet[guid]},forEach:function(fn,self){var list=this.toArray();for(var i=0,j=list.length;i0){mixin.mixins=a_map.call(args,function(x){if(x instanceof Mixin){return x}var mixin=new Mixin;mixin.properties=x;return mixin})}return mixin}function isMethod(obj){return"function"===typeof obj&&obj.isMethod!==false&&obj!==Boolean&&obj!==Object&&obj!==Number&&obj!==Array&&obj!==Date&&obj!==String}var CONTINUE={};function mixinProperties(mixinsMeta,mixin){var guid;if(mixin instanceof Mixin){guid=guidFor(mixin);if(mixinsMeta[guid]){return CONTINUE}mixinsMeta[guid]=mixin;return mixin.properties}else{return mixin}}function concatenatedMixinProperties(concatProp,props,values,base){var concats;concats=values[concatProp]||base[concatProp];if(props[concatProp]){concats=concats?concats.concat(props[concatProp]):props[concatProp]}return concats}function giveDescriptorSuper(meta,key,property,values,descs){var superProperty;if(values[key]===undefined){superProperty=descs[key]}superProperty=superProperty||meta.descs[key];if(!superProperty||!(superProperty instanceof ComputedProperty)){return property}property=o_create(property);property.func=wrap(property.func,superProperty.func);return property}function giveMethodSuper(obj,key,method,values,descs){var superMethod;if(descs[key]===undefined){superMethod=values[key]}superMethod=superMethod||obj[key];if("function"!==typeof superMethod){return method}return wrap(method,superMethod)}function applyConcatenatedProperties(obj,key,value,values){var baseValue=values[key]||obj[key];if(baseValue){if("function"===typeof baseValue.concat){return baseValue.concat(value)}else{return makeArray(baseValue).concat(value)}}else{return makeArray(value)}}function applyMergedProperties(obj,key,value,values){var baseValue=values[key]||obj[key];if(!baseValue){return value}var newBase=merge({},baseValue),hasFunction=false;for(var prop in value){if(!value.hasOwnProperty(prop)){continue}var propValue=value[prop];if(isMethod(propValue)){hasFunction=true;newBase[prop]=giveMethodSuper(obj,prop,propValue,baseValue,{})}else{newBase[prop]=propValue}}if(hasFunction){newBase._super=superFunction}return newBase}function addNormalizedProperty(base,key,value,meta,descs,values,concats,mergings){if(value instanceof Descriptor){if(value===REQUIRED&&descs[key]){return CONTINUE}if(value.func){value=giveDescriptorSuper(meta,key,value,values,descs)}descs[key]=value;values[key]=undefined}else{if(concats&&a_indexOf.call(concats,key)>=0||key==="concatenatedProperties"||key==="mergedProperties"){value=applyConcatenatedProperties(base,key,value,values)}else if(mergings&&a_indexOf.call(mergings,key)>=0){value=applyMergedProperties(base,key,value,values)}else if(isMethod(value)){value=giveMethodSuper(base,key,value,values,descs)}descs[key]=undefined;values[key]=value}}function mergeMixins(mixins,m,descs,values,base,keys){var mixin,props,key,concats,mergings,meta;function removeKeys(keyName){delete descs[keyName];delete values[keyName]}for(var i=0,l=mixins.length;i=0){if(_detect(mixins[loc],targetMixin,seen)){return true}}return false}MixinPrototype.detect=function(obj){if(!obj){return false}if(obj instanceof Mixin){return _detect(obj,this,{})}var m=obj["__ember_meta__"],mixins=m&&m.mixins;if(mixins){return!!mixins[guidFor(this)]}return false};MixinPrototype.without=function(){var ret=new Mixin(this);ret._without=a_slice.call(arguments);return ret};function _keys(ret,mixin,seen){if(seen[guidFor(mixin)]){return}seen[guidFor(mixin)]=true;if(mixin.properties){var props=mixin.properties;for(var key in props){if(props.hasOwnProperty(key)){ret[key]=true}}}else if(mixin.mixins){a_forEach.call(mixin.mixins,function(x){_keys(ret,x,seen)})}}MixinPrototype.keys=function(){var keys={},seen={},ret=[];_keys(keys,this,seen);for(var key in keys){if(keys.hasOwnProperty(key)){ret.push(key)}}return ret};Mixin.mixins=function(obj){var m=obj["__ember_meta__"],mixins=m&&m.mixins,ret=[];if(!mixins){return ret}for(var key in mixins){var mixin=mixins[key];if(!mixin.properties){ret.push(mixin)}}return ret};REQUIRED=new Descriptor;REQUIRED.toString=function(){return"(Required Property)"};function required(){return REQUIRED}__exports__.required=required;function Alias(methodName){this.methodName=methodName}Alias.prototype=new Descriptor;function aliasMethod(methodName){return new Alias(methodName)}__exports__.aliasMethod=aliasMethod;function observer(){var func=a_slice.call(arguments,-1)[0];var paths;var addWatchedProperty=function(path){paths.push(path)};var _paths=a_slice.call(arguments,0,-1);if(typeof func!=="function"){func=arguments[0];_paths=a_slice.call(arguments,1)}paths=[];for(var i=0;i<_paths.length;++i){expandProperties(_paths[i],addWatchedProperty)}if(typeof func!=="function"){throw new Ember.Error("Ember.observer called without a function")}func.__ember_observes__=paths;return func}__exports__.observer=observer;function immediateObserver(){for(var i=0,l=arguments.length;i0;if(existingDesc instanceof Descriptor){existingDesc.teardown(obj,keyName)}if(desc instanceof Descriptor){value=desc;descs[keyName]=desc;if(MANDATORY_SETTER&&watching){objectDefineProperty(obj,keyName,{configurable:true,enumerable:true,writable:true,value:undefined})}else{obj[keyName]=undefined}if(desc.setup){desc.setup(obj,keyName)}}else{descs[keyName]=undefined;if(desc==null){value=data;if(MANDATORY_SETTER&&watching){meta.values[keyName]=data;objectDefineProperty(obj,keyName,{configurable:true,enumerable:true,set:MANDATORY_SETTER_FUNCTION,get:DEFAULT_GETTER_FUNCTION(keyName)})}else{obj[keyName]=data}}else{value=desc;objectDefineProperty(obj,keyName,desc)}}if(watching){overrideChains(obj,keyName,meta)}if(obj.didDefineProperty){obj.didDefineProperty(obj,keyName,value)}return this}__exports__.defineProperty=defineProperty;function deprecateProperty(object,deprecatedKey,newKey){function deprecate(){}if(platform.hasPropertyAccessors){defineProperty(object,deprecatedKey,{configurable:true,enumerable:false,set:function(value){deprecate();set(object,newKey,value)},get:function(){deprecate();return get(object,newKey)}})}}__exports__.deprecateProperty=deprecateProperty});define("ember-metal/property_events",["ember-metal/utils","ember-metal/events","ember-metal/observer_set","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var guidFor=__dependency1__.guidFor;var tryFinally=__dependency1__.tryFinally;var sendEvent=__dependency2__.sendEvent;var listenersUnion=__dependency2__.listenersUnion;var listenersDiff=__dependency2__.listenersDiff;var ObserverSet=__dependency3__["default"];var beforeObserverSet=new ObserverSet;var observerSet=new ObserverSet;var deferred=0;function propertyWillChange(obj,keyName){var m=obj["__ember_meta__"];var watching=m&&m.watching[keyName]>0||keyName==="length";var proto=m&&m.proto;var desc=m&&m.descs[keyName];if(!watching){return}if(proto===obj){return}if(desc&&desc.willChange){desc.willChange(obj,keyName)}dependentKeysWillChange(obj,keyName,m);chainsWillChange(obj,keyName,m);notifyBeforeObservers(obj,keyName)}function propertyDidChange(obj,keyName){var m=obj["__ember_meta__"];var watching=m&&m.watching[keyName]>0||keyName==="length";var proto=m&&m.proto;var desc=m&&m.descs[keyName];if(proto===obj){return}if(desc&&desc.didChange){desc.didChange(obj,keyName)}if(!watching&&keyName!=="length"){return}if(m&&m.deps&&m.deps[keyName]){dependentKeysDidChange(obj,keyName,m)}chainsDidChange(obj,keyName,m,false);notifyObservers(obj,keyName)}var WILL_SEEN,DID_SEEN;function dependentKeysWillChange(obj,depKey,meta){if(obj.isDestroying){return}var deps;if(meta&&meta.deps&&(deps=meta.deps[depKey])){var seen=WILL_SEEN,top=!seen;if(top){seen=WILL_SEEN={}}iterDeps(propertyWillChange,obj,deps,depKey,seen,meta);if(top){WILL_SEEN=null}}}function dependentKeysDidChange(obj,depKey,meta){if(obj.isDestroying){return}var deps;if(meta&&meta.deps&&(deps=meta.deps[depKey])){var seen=DID_SEEN,top=!seen;if(top){seen=DID_SEEN={}}iterDeps(propertyDidChange,obj,deps,depKey,seen,meta);if(top){DID_SEEN=null}}}function keysOf(obj){var keys=[];for(var key in obj)keys.push(key);return keys}function iterDeps(method,obj,deps,depKey,seen,meta){var keys,key,i,desc;var guid=guidFor(obj);var current=seen[guid];if(!current)current=seen[guid]={};if(current[depKey])return;current[depKey]=true;if(deps){keys=keysOf(deps);var descs=meta.descs;for(i=0;i0){ret=meta.values[keyName]}else{ret=obj[keyName]}if(ret===undefined&&"object"===typeof obj&&!(keyName in obj)&&"function"===typeof obj.unknownProperty){return obj.unknownProperty(keyName)}return ret}};if(Ember.config.overrideAccessors){Ember.get=get;Ember.config.overrideAccessors();get=Ember.get}function normalizeTuple(target,path){var hasThis=pathHasThis(path);var isGlobal=!hasThis&&isGlobalPath(path);var key;if(!target||isGlobal)target=Ember.lookup;if(hasThis)path=path.slice(5);if(target===Ember.lookup){key=path.match(FIRST_KEY)[0];target=get(target,key);path=path.slice(key.length+1)}if(!path||path.length===0)throw new EmberError("Path cannot be empty");return[target,path]}function _getPath(root,path){var hasThis,parts,tuple,idx,len;if(root===null&&!isPath(path)){return get(Ember.lookup,path)}hasThis=pathHasThis(path);if(!root||hasThis){tuple=normalizeTuple(root,path);root=tuple[0];path=tuple[1];tuple.length=0}parts=path.split(".");len=parts.length;for(idx=0;root!=null&&idx0){if(MANDATORY_SETTER){currentValue=meta.values[keyName]}else{currentValue=obj[keyName]}if(value!==currentValue){propertyWillChange(obj,keyName);if(MANDATORY_SETTER){if(currentValue===undefined&&!(keyName in obj)||!obj.propertyIsEnumerable(keyName)){defineProperty(obj,keyName,null,value)}else{meta.values[keyName]=value}}else{obj[keyName]=value}propertyDidChange(obj,keyName)}}else{obj[keyName]=value}}return value};if(Ember.config.overrideAccessors){Ember.set=set;Ember.config.overrideAccessors();set=Ember.set}function setPath(root,path,value,tolerant){var keyName;keyName=path.slice(path.lastIndexOf(".")+1);path=path===keyName?keyName:path.slice(0,path.length-(keyName.length+1));if(path!=="this"){root=getPath(root,path)}if(!keyName||keyName.length===0){throw new EmberError("Property set failed: You passed an empty path")}if(!root){if(tolerant){return}else{throw new EmberError('Property set failed: object in path "'+path+'" could not be found or was destroyed.')}}return set(root,keyName,value)}function trySet(root,path,value){return set(root,path,value,true)}__exports__.trySet=trySet;__exports__.set=set});define("ember-metal/run_loop",["ember-metal/core","ember-metal/utils","ember-metal/array","ember-metal/property_events","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var Ember=__dependency1__["default"];var apply=__dependency2__.apply;var indexOf=__dependency3__.indexOf;var beginPropertyChanges=__dependency4__.beginPropertyChanges;var endPropertyChanges=__dependency4__.endPropertyChanges;function onBegin(current){run.currentRunLoop=current}function onEnd(current,next){run.currentRunLoop=next}var Backburner=requireModule("backburner").Backburner;var backburner=new Backburner(["sync","actions","destroy"],{sync:{before:beginPropertyChanges,after:endPropertyChanges},defaultQueue:"actions",onBegin:onBegin,onEnd:onEnd,onErrorTarget:Ember,onErrorMethod:"onerror"});var slice=[].slice;var concat=[].concat;__exports__["default"]=run;function run(){return apply(backburner,backburner.run,arguments)}run.join=function(target,method){if(!run.currentRunLoop){return apply(Ember,run,arguments)}var args=slice.call(arguments);args.unshift("actions");apply(run,run.schedule,args)};run.bind=function(target,method){var args=slice.call(arguments);return function(){return apply(run,run.join,args.concat(slice.call(arguments)))}};run.backburner=backburner;run.currentRunLoop=null;run.queues=backburner.queueNames;run.begin=function(){backburner.begin()};run.end=function(){backburner.end()};run.schedule=function(queue,target,method){checkAutoRun();apply(backburner,backburner.schedule,arguments)};run.hasScheduledTimers=function(){return backburner.hasTimers()};run.cancelTimers=function(){backburner.cancelTimers()};run.sync=function(){if(backburner.currentInstance){backburner.currentInstance.queues.sync.flush()}};run.later=function(target,method){return apply(backburner,backburner.later,arguments)};run.once=function(target,method){checkAutoRun();var args=slice.call(arguments);args.unshift("actions");return apply(backburner,backburner.scheduleOnce,args)};run.scheduleOnce=function(queue,target,method){checkAutoRun();return apply(backburner,backburner.scheduleOnce,arguments)};run.next=function(){var args=slice.call(arguments);args.push(1);return apply(backburner,backburner.later,args)};run.cancel=function(timer){return backburner.cancel(timer)};run.debounce=function(){return apply(backburner,backburner.debounce,arguments)};run.throttle=function(){return apply(backburner,backburner.throttle,arguments)};function checkAutoRun(){if(!run.currentRunLoop){}}run._addQueue=function(name,after){if(indexOf.call(run.queues,name)===-1){run.queues.splice(indexOf.call(run.queues,after)+1,0,name)}}});define("ember-metal/set_properties",["ember-metal/property_events","ember-metal/property_set","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var changeProperties=__dependency1__.changeProperties;var set=__dependency2__.set;__exports__["default"]=function setProperties(self,hash){changeProperties(function(){for(var prop in hash){if(hash.hasOwnProperty(prop)){set(self,prop,hash[prop])}}});return self}});define("ember-metal/utils",["ember-metal/core","ember-metal/platform","ember-metal/array","ember-metal/keys","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var Ember=__dependency1__["default"];var platform=__dependency2__.platform;var create=__dependency2__.create;var forEach=__dependency3__.forEach;var keys=__dependency4__["default"];var _uuid=0;function uuid(){return++_uuid}__exports__.uuid=uuid;var GUID_PREFIX="ember";var o_defineProperty=platform.defineProperty;var o_create=create;var numberCache=[];var stringCache={};var MANDATORY_SETTER=Ember.ENV.MANDATORY_SETTER;function intern(string){var obj=Object.create(null);obj[string]=true;return keys(obj)[0]}var GUID_KEY=intern("__ember"+ +new Date);var GUID_DESC={writable:false,configurable:false,enumerable:false,value:null};function generateGuid(obj,prefix){if(!prefix)prefix=GUID_PREFIX;var ret=prefix+uuid();if(obj){if(obj[GUID_KEY]===null){obj[GUID_KEY]=ret}else{GUID_DESC.value=ret;o_defineProperty(obj,GUID_KEY,GUID_DESC)}}return ret}__exports__.generateGuid=generateGuid;function guidFor(obj){if(obj===undefined)return"(undefined)";if(obj===null)return"(null)";var ret;var type=typeof obj;switch(type){case"number":ret=numberCache[obj];if(!ret)ret=numberCache[obj]="nu"+obj;return ret;case"string":ret=stringCache[obj];if(!ret)ret=stringCache[obj]="st"+uuid();return ret;case"boolean":return obj?"(true)":"(false)";default:if(obj[GUID_KEY])return obj[GUID_KEY];if(obj===Object)return"(Object)";if(obj===Array)return"(Array)";ret=GUID_PREFIX+uuid();if(obj[GUID_KEY]===null){obj[GUID_KEY]=ret}else{GUID_DESC.value=ret;o_defineProperty(obj,GUID_KEY,GUID_DESC)}return ret}}__exports__.guidFor=guidFor;var META_DESC={writable:true,configurable:false,enumerable:false,value:null};var isDefinePropertySimulated=platform.defineProperty.isSimulated;function Meta(obj){this.descs={};this.watching={};this.cache={};this.cacheMeta={};this.source=obj}Meta.prototype={descs:null,deps:null,watching:null,listeners:null,cache:null,cacheMeta:null,source:null,mixins:null,bindings:null,chains:null,chainWatchers:null,values:null,proto:null};if(isDefinePropertySimulated){Meta.prototype.__preventPlainObject__=true;Meta.prototype.toJSON=function(){}}var EMPTY_META=new Meta(null);if(MANDATORY_SETTER){EMPTY_META.values={}}function meta(obj,writable){var ret=obj["__ember_meta__"];if(writable===false)return ret||EMPTY_META;if(!ret){if(!isDefinePropertySimulated)o_defineProperty(obj,"__ember_meta__",META_DESC);ret=new Meta(obj);if(MANDATORY_SETTER){ret.values={}}obj["__ember_meta__"]=ret;ret.descs.constructor=null}else if(ret.source!==obj){if(!isDefinePropertySimulated)o_defineProperty(obj,"__ember_meta__",META_DESC);ret=o_create(ret);ret.descs=o_create(ret.descs);ret.watching=o_create(ret.watching);ret.cache={};ret.cacheMeta={};ret.source=obj;if(MANDATORY_SETTER){ret.values=o_create(ret.values)}obj["__ember_meta__"]=ret}return ret}function getMeta(obj,property){var _meta=meta(obj,false);return _meta[property]}__exports__.getMeta=getMeta;function setMeta(obj,property,value){var _meta=meta(obj,true);_meta[property]=value;return value}__exports__.setMeta=setMeta;function metaPath(obj,path,writable){var _meta=meta(obj,writable),keyName,value;for(var i=0,l=path.length;i1){watching[keyName]--}}__exports__.unwatchKey=unwatchKey});define("ember-metal/watch_path",["ember-metal/utils","ember-metal/chains","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var meta=__dependency1__.meta;var typeOf=__dependency1__.typeOf;var ChainNode=__dependency2__.ChainNode;var metaFor=meta;function chainsFor(obj,meta){var m=meta||metaFor(obj),ret=m.chains;if(!ret){ret=m.chains=new ChainNode(null,null,obj)}else if(ret.value()!==obj){ret=m.chains=ret.copy(obj)}return ret}function watchPath(obj,keyPath,meta){if(keyPath==="length"&&typeOf(obj)==="array"){return}var m=meta||metaFor(obj),watching=m.watching;if(!watching[keyPath]){watching[keyPath]=1;chainsFor(obj,m).add(keyPath)}else{watching[keyPath]=(watching[keyPath]||0)+1}}__exports__.watchPath=watchPath;function unwatchPath(obj,keyPath,meta){var m=meta||metaFor(obj),watching=m.watching;if(watching[keyPath]===1){watching[keyPath]=0;chainsFor(obj,m).remove(keyPath)}else if(watching[keyPath]>1){watching[keyPath]--}}__exports__.unwatchPath=unwatchPath});define("ember-metal/watching",["ember-metal/utils","ember-metal/chains","ember-metal/watch_key","ember-metal/watch_path","ember-metal/path_cache","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var meta=__dependency1__.meta;var GUID_KEY=__dependency1__.GUID_KEY;var typeOf=__dependency1__.typeOf;var generateGuid=__dependency1__.generateGuid;var removeChainWatcher=__dependency2__.removeChainWatcher;var flushPendingChains=__dependency2__.flushPendingChains;var watchKey=__dependency3__.watchKey;var unwatchKey=__dependency3__.unwatchKey;var watchPath=__dependency4__.watchPath;var unwatchPath=__dependency4__.unwatchPath;var metaFor=meta;var isPath=__dependency5__.isPath;function watch(obj,_keyPath,m){if(_keyPath==="length"&&typeOf(obj)==="array"){return}if(!isPath(_keyPath)){watchKey(obj,_keyPath,m)}else{watchPath(obj,_keyPath,m)}}__exports__.watch=watch;function isWatching(obj,key){var meta=obj["__ember_meta__"];return(meta&&meta.watching[key])>0}__exports__.isWatching=isWatching;watch.flushPending=flushPendingChains;function unwatch(obj,_keyPath,m){if(_keyPath==="length"&&typeOf(obj)==="array"){return}if(!isPath(_keyPath)){unwatchKey(obj,_keyPath,m)}else{unwatchPath(obj,_keyPath,m)}}__exports__.unwatch=unwatch;function rewatch(obj){var m=obj["__ember_meta__"],chains=m&&m.chains;if(GUID_KEY in obj&&!obj.hasOwnProperty(GUID_KEY)){generateGuid(obj)}if(chains&&chains.value()!==obj){m.chains=chains.copy(obj)}}__exports__.rewatch=rewatch;var NODE_STACK=[];function destroy(obj){var meta=obj["__ember_meta__"],node,nodes,key,nodeObject;if(meta){obj["__ember_meta__"]=null;node=meta.chains;if(node){NODE_STACK.push(node);while(NODE_STACK.length>0){node=NODE_STACK.pop();nodes=node._chains;if(nodes){for(key in nodes){if(nodes.hasOwnProperty(key)){NODE_STACK.push(nodes[key])}}}if(node._watching){nodeObject=node._object;if(nodeObject){removeChainWatcher(nodeObject,node._key,node)}}}}}}__exports__.destroy=destroy});define("ember-routing-handlebars",["ember-metal/core","ember-handlebars","ember-routing/system/router","ember-routing-handlebars/helpers/shared","ember-routing-handlebars/helpers/link_to","ember-routing-handlebars/helpers/outlet","ember-routing-handlebars/helpers/render","ember-routing-handlebars/helpers/action","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__exports__){"use strict";var Ember=__dependency1__["default"];var EmberHandlebars=__dependency2__["default"];var Router=__dependency3__["default"];var resolvePaths=__dependency4__.resolvePaths;var resolveParams=__dependency4__.resolveParams;var deprecatedLinkToHelper=__dependency5__.deprecatedLinkToHelper;var linkToHelper=__dependency5__.linkToHelper;var LinkView=__dependency5__.LinkView;var outletHelper=__dependency6__.outletHelper;var OutletView=__dependency6__.OutletView;var renderHelper=__dependency7__["default"];var ActionHelper=__dependency8__.ActionHelper;var actionHelper=__dependency8__.actionHelper;Router.resolveParams=resolveParams;Router.resolvePaths=resolvePaths;Ember.LinkView=LinkView;EmberHandlebars.ActionHelper=ActionHelper;EmberHandlebars.OutletView=OutletView;EmberHandlebars.registerHelper("render",renderHelper);EmberHandlebars.registerHelper("action",actionHelper);EmberHandlebars.registerHelper("outlet",outletHelper);EmberHandlebars.registerHelper("link-to",linkToHelper);EmberHandlebars.registerHelper("linkTo",deprecatedLinkToHelper);__exports__["default"]=Ember});define("ember-routing-handlebars/helpers/action",["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/utils","ember-metal/run_loop","ember-views/system/utils","ember-routing/system/router","ember-handlebars","ember-handlebars/ext","ember-handlebars/helpers/view","ember-routing-handlebars/helpers/shared","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var forEach=__dependency3__.forEach;var uuid=__dependency4__.uuid;var run=__dependency5__["default"];var isSimpleClick=__dependency6__.isSimpleClick;var EmberRouter=__dependency7__["default"];var EmberHandlebars=__dependency8__["default"];var handlebarsGet=__dependency9__.handlebarsGet;var viewHelper=__dependency10__.viewHelper;var resolveParams=__dependency11__.resolveParams;var resolvePath=__dependency11__.resolvePath;var SafeString=EmberHandlebars.SafeString;var a_slice=Array.prototype.slice;function args(options,actionName){var ret=[];if(actionName){ret.push(actionName)}var types=options.options.types.slice(1),data=options.options.data;return ret.concat(resolveParams(options.context,options.params,{types:types,data:data}))}var ActionHelper={registeredActions:{}};__exports__.ActionHelper=ActionHelper;var keys=["alt","shift","meta","ctrl"];var POINTER_EVENT_TYPE_REGEX=/^click|mouse|touch/;var isAllowedEvent=function(event,allowedKeys){if(typeof allowedKeys==="undefined"){if(POINTER_EVENT_TYPE_REGEX.test(event.type)){return isSimpleClick(event)}else{allowedKeys=""}}if(allowedKeys.indexOf("any")>=0){return true}var allowed=true;forEach.call(keys,function(key){if(event[key+"Key"]&&allowedKeys.indexOf(key)===-1){allowed=false}});return allowed};function isKeyEvent(eventName){return["keyUp","keyPress","keyDown"].indexOf(eventName)!==-1}function ignoreKeyEvent(eventName,event,keyCode){var any="any";keyCode=keyCode||any;return isKeyEvent(eventName)&&keyCode!==any&&keyCode!==event.which.toString()}ActionHelper.registerAction=function(actionNameOrPath,options,allowedKeys){var actionId=uuid();ActionHelper.registeredActions[actionId]={eventName:options.eventName,handler:function handleRegisteredAction(event){if(!isAllowedEvent(event,allowedKeys)){return true}if(options.preventDefault!==false){event.preventDefault()}if(options.bubbles===false){event.stopPropagation()}var target=options.target,parameters=options.parameters,eventName=options.eventName,actionName;if(Ember.FEATURES.isEnabled("ember-routing-handlebars-action-with-key-code")){if(ignoreKeyEvent(eventName,event,options.withKeyCode)){return}}if(target.target){target=handlebarsGet(target.root,target.target,target.options)}else{target=target.root}if(options.boundProperty){actionName=resolveParams(parameters.context,[actionNameOrPath],{types:["ID"],data:parameters.options.data})[0];if(typeof actionName==="undefined"||typeof actionName==="function"){actionName=actionNameOrPath}}if(!actionName){actionName=actionNameOrPath}run(function runRegisteredAction(){if(target.send){target.send.apply(target,args(parameters,actionName))}else{target[actionName].apply(target,args(parameters))}})}};options.view.on("willClearRender",function(){delete ActionHelper.registeredActions[actionId]});return actionId};function actionHelper(actionName){var options=arguments[arguments.length-1],contexts=a_slice.call(arguments,1,-1);var hash=options.hash,controller=options.data.keywords.controller;var action={eventName:hash.on||"click",parameters:{context:this,options:options,params:contexts},view:options.data.view,bubbles:hash.bubbles,preventDefault:hash.preventDefault,target:{options:options},withKeyCode:hash.withKeyCode,boundProperty:options.types[0]==="ID"};if(hash.target){action.target.root=this;action.target.target=hash.target}else if(controller){action.target.root=controller}var actionId=ActionHelper.registerAction(actionName,action,hash.allowedKeys);return new SafeString('data-ember-action="'+actionId+'"')}__exports__.actionHelper=actionHelper});define("ember-routing-handlebars/helpers/link_to",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/merge","ember-metal/run_loop","ember-metal/computed","ember-runtime/system/lazy_load","ember-runtime/system/string","ember-runtime/system/object","ember-metal/keys","ember-views/system/utils","ember-views/views/component","ember-handlebars","ember-handlebars/helpers/view","ember-routing/system/router","ember-routing-handlebars/helpers/shared","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__dependency16__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var merge=__dependency4__["default"];var run=__dependency5__["default"];var computed=__dependency6__.computed;var onLoad=__dependency7__.onLoad;var fmt=__dependency8__.fmt;var EmberObject=__dependency9__["default"];var keys=__dependency10__["default"];var isSimpleClick=__dependency11__.isSimpleClick;var EmberComponent=__dependency12__["default"];var EmberHandlebars=__dependency13__["default"];var viewHelper=__dependency14__.viewHelper;var EmberRouter=__dependency15__["default"];var resolveParams=__dependency16__.resolveParams;var resolvePaths=__dependency16__.resolvePaths;var routeArgs=__dependency16__.routeArgs;var slice=[].slice;requireModule("ember-handlebars");var numberOfContextsAcceptedByHandler=function(handler,handlerInfos){var req=0;for(var i=0,l=handlerInfos.length;imaximumContexts){routeName=leafName}var args=routeArgs(routeName,contexts,null);var isActive=router.isActive.apply(router,args);if(!isActive){return false}if(!isCurrentWhenSpecified&&leafName===loadedParams.targetRouteName){var visibleQueryParams={};merge(visibleQueryParams,loadedParams.queryParams);router._prepareQueryParams(loadedParams.targetRouteName,loadedParams.models,visibleQueryParams);isActive=shallowEqual(visibleQueryParams,router.router.state.queryParams)}return isActive}if(Ember.FEATURES.isEnabled("ember-routing-multi-current-when")){currentWhen=currentWhen.split("|");for(var i=0,len=currentWhen.length;i2){var factory=container.lookupFactory(controllerFullName)||generateControllerFactory(container,controllerName,context);controller=factory.create({model:context,parentController:parentController,target:parentController});view.one("willDestroyElement",function(){controller.destroy()})}else{controller=container.lookup(controllerFullName)||generateController(container,controllerName);controller.setProperties({target:parentController,parentController:parentController})}var root=options.contexts[1];if(root){view.registerObserver(root,contextString,function(){controller.set("model",handlebarsGet(root,contextString,options))})}options.hash.viewName=camelize(name);var templateName="template:"+name;options.hash.template=container.lookup(templateName);options.hash.controller=controller;if(router&&!context){router._connectActiveView(name,view)}options.helperName=options.helperName||'render "'+name+'"';viewHelper.call(this,view,options)}});define("ember-routing-handlebars/helpers/shared",["ember-metal/property_get","ember-metal/array","ember-runtime/mixins/controller","ember-handlebars/ext","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var get=__dependency1__.get;var map=__dependency2__.map;var ControllerMixin=__dependency3__["default"];var handlebarsResolve=__dependency4__.resolveParams;var handlebarsGet=__dependency4__.handlebarsGet;var typeOf=__dependency5__.typeOf;var get=__dependency1__.get;function routeArgs(targetRouteName,models,queryParams){var args=[];if(typeOf(targetRouteName)==="string"){args.push(""+targetRouteName)}args.push.apply(args,models);args.push({queryParams:queryParams});return args}__exports__.routeArgs=routeArgs;function getActiveTargetName(router){var handlerInfos=router.activeTransition?router.activeTransition.state.handlerInfos:router.state.handlerInfos;return handlerInfos[handlerInfos.length-1].name}__exports__.getActiveTargetName=getActiveTargetName;function resolveParams(context,params,options){return map.call(resolvePaths(context,params,options),function(path,i){if(null===path){return params[i]}else{return handlebarsGet(context,path,options)}})}__exports__.resolveParams=resolveParams;function stashParamNames(router,handlerInfos){if(handlerInfos._namesStashed){return}var targetRouteName=handlerInfos[handlerInfos.length-1].name;var recogHandlers=router.router.recognizer.handlersFor(targetRouteName);var dynamicParent=null;for(var i=0,len=handlerInfos.length;i7)},_replacePath:function(path){this._location.replace(this._getOrigin()+path)},_getRootURL:function(){return this.rootURL},_getPath:function(){var pathname=this._location.pathname;if(pathname.charAt(0)!=="/"){pathname="/"+pathname}return pathname},_getHash:EmberLocation._getHash,_getQuery:function(){return this._location.search},_getFullPath:function(){return this._getPath()+this._getQuery()+this._getHash()},_getHistoryPath:function(){var rootURL=this._getRootURL();var path=this._getPath();var hash=this._getHash();var query=this._getQuery();var rootURLIndex=path.indexOf(rootURL);var routeHash,hashParts;if(hash.substr(0,2)==="#/"){hashParts=hash.substr(1).split("#");routeHash=hashParts.shift();if(path.slice(-1)==="/"){routeHash=routeHash.substr(1)}path+=routeHash;path+=query;if(hashParts.length){path+="#"+hashParts.join("#")}}else{path+=query;path+=hash}return path},_getHashPath:function(){var rootURL=this._getRootURL();var path=rootURL;var historyPath=this._getHistoryPath();var routePath=historyPath.substr(rootURL.length);if(routePath!==""){if(routePath.charAt(0)!=="/"){routePath="/"+routePath}path+="#"+routePath}return path},create:function(options){if(options&&options.rootURL){this.rootURL=options.rootURL}var historyPath,hashPath;var cancelRouterSetup=false;var implementationClass=this._NoneLocation;var currentPath=this._getFullPath();if(this._getSupportsHistory()){historyPath=this._getHistoryPath();if(currentPath===historyPath){implementationClass=this._HistoryLocation}else{if(Ember.FEATURES.isEnabled("ember-routing-auto-location-uses-replace-state-for-history")){if(currentPath.substr(0,2)==="/#"){this._history.replaceState({path:historyPath},null,historyPath);implementationClass=this._HistoryLocation}else{cancelRouterSetup=true;this._replacePath(historyPath)}}else{cancelRouterSetup=true;this._replacePath(historyPath)}}}else if(this._getSupportsHashChange()){hashPath=this._getHashPath();if(currentPath===hashPath||currentPath==="/"&&hashPath==="/#/"){implementationClass=this._HashLocation}else{cancelRouterSetup=true;this._replacePath(hashPath)}}var implementation=implementationClass.create.apply(implementationClass,arguments);if(cancelRouterSetup){set(implementation,"cancelRouterSetup",true)}return implementation}}});define("ember-routing/location/hash_location",["ember-metal/property_get","ember-metal/property_set","ember-metal/run_loop","ember-metal/utils","ember-runtime/system/object","ember-routing/location/api","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var run=__dependency3__["default"];var guidFor=__dependency4__.guidFor;var EmberObject=__dependency5__["default"];var EmberLocation=__dependency6__["default"];var jQuery=__dependency7__["default"];__exports__["default"]=EmberObject.extend({implementation:"hash",init:function(){set(this,"location",get(this,"_location")||window.location)},getHash:EmberLocation._getHash,getURL:function(){return this.getHash().substr(1)},setURL:function(path){get(this,"location").hash=path;set(this,"lastSetURL",path)},replaceURL:function(path){get(this,"location").replace("#"+path);set(this,"lastSetURL",path)},onUpdateURL:function(callback){var self=this;var guid=guidFor(this);jQuery(window).on("hashchange.ember-location-"+guid,function(){run(function(){var path=self.getURL();if(get(self,"lastSetURL")===path){return}set(self,"lastSetURL",null);callback(path)})})},formatURL:function(url){return"#"+url},willDestroy:function(){var guid=guidFor(this);jQuery(window).off("hashchange.ember-location-"+guid)}})});define("ember-routing/location/history_location",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-runtime/system/object","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var EmberObject=__dependency5__["default"];var jQuery=__dependency6__["default"];var popstateFired=false;var supportsHistoryState=window.history&&"state"in window.history;__exports__["default"]=EmberObject.extend({implementation:"history",init:function(){set(this,"location",get(this,"location")||window.location);set(this,"baseURL",jQuery("base").attr("href")||"")},initState:function(){set(this,"history",get(this,"history")||window.history);this.replaceState(this.formatURL(this.getURL()))},rootURL:"/",getURL:function(){var rootURL=get(this,"rootURL");var location=get(this,"location");var path=location.pathname;var baseURL=get(this,"baseURL");rootURL=rootURL.replace(/\/$/,"");baseURL=baseURL.replace(/\/$/,"");var url=path.replace(baseURL,"").replace(rootURL,"");var search=location.search||"";url+=search;return url},setURL:function(path){var state=this.getState();path=this.formatURL(path);if(!state||state.path!==path){this.pushState(path)}},replaceURL:function(path){var state=this.getState();path=this.formatURL(path);if(!state||state.path!==path){this.replaceState(path)}},getState:function(){return supportsHistoryState?get(this,"history").state:this._historyState},pushState:function(path){var state={path:path};get(this,"history").pushState(state,null,path);if(!supportsHistoryState){this._historyState=state}this._previousURL=this.getURL()},replaceState:function(path){var state={path:path};get(this,"history").replaceState(state,null,path);if(!supportsHistoryState){this._historyState=state}this._previousURL=this.getURL()},onUpdateURL:function(callback){var guid=guidFor(this);var self=this;jQuery(window).on("popstate.ember-location-"+guid,function(e){if(!popstateFired){popstateFired=true;if(self.getURL()===self._previousURL){return}}callback(self.getURL())})},formatURL:function(url){var rootURL=get(this,"rootURL");var baseURL=get(this,"baseURL");if(url!==""){rootURL=rootURL.replace(/\/$/,"");baseURL=baseURL.replace(/\/$/,"")}else if(baseURL.match(/^\//)&&rootURL.match(/^\//)){baseURL=baseURL.replace(/\/$/,"")}return baseURL+rootURL+url},willDestroy:function(){var guid=guidFor(this);jQuery(window).off("popstate.ember-location-"+guid)}})});define("ember-routing/location/none_location",["ember-metal/property_get","ember-metal/property_set","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var get=__dependency1__.get;var set=__dependency2__.set;var EmberObject=__dependency3__["default"];__exports__["default"]=EmberObject.extend({implementation:"none",path:"",getURL:function(){return get(this,"path")},setURL:function(path){set(this,"path",path)},onUpdateURL:function(callback){this.updateCallback=callback},handleURL:function(url){set(this,"path",url);this.updateCallback(url)},formatURL:function(url){return url}})});define("ember-routing/system/cache",["ember-runtime/system/object","exports"],function(__dependency1__,__exports__){"use strict";var EmberObject=__dependency1__["default"];__exports__["default"]=EmberObject.extend({init:function(){this.cache={}},has:function(bucketKey){return bucketKey in this.cache},stash:function(bucketKey,key,value){var bucket=this.cache[bucketKey];if(!bucket){bucket=this.cache[bucketKey]={}}bucket[key]=value},lookup:function(bucketKey,prop,defaultValue){var cache=this.cache;if(!(bucketKey in cache)){return defaultValue}var bucket=cache[bucketKey];if(prop in bucket){return bucket[prop]}else{return defaultValue}},cache:null})});define("ember-routing/system/controller_for",["exports"],function(__exports__){"use strict";__exports__["default"]=function controllerFor(container,controllerName,lookupOptions){return container.lookup("controller:"+controllerName,lookupOptions)}});define("ember-routing/system/dsl",["ember-metal/core","exports"],function(__dependency1__,__exports__){"use strict";var Ember=__dependency1__["default"];function DSL(name){this.parent=name;this.matches=[]}__exports__["default"]=DSL;DSL.prototype={route:function(name,options,callback){if(arguments.length===2&&typeof options==="function"){callback=options;options={}}if(arguments.length===1){options={}}var type=options.resetNamespace===true?"resource":"route";if(typeof options.path!=="string"){options.path="/"+name}if(canNest(this)&&options.resetNamespace!==true){name=this.parent+"."+name}if(callback){var dsl=new DSL(name);route(dsl,"loading");route(dsl,"error",{path:"/_unused_dummy_error_path_route_"+name+"/:error"});if(callback){callback.call(dsl)}this.push(options.path,name,dsl.generate())}else{this.push(options.path,name,null)}if(Ember.FEATURES.isEnabled("ember-routing-named-substates")){route(this,name+"_loading",{resetNamespace:options.resetNamespace});route(this,name+"_error",{path:"/_unused_dummy_error_path_route_"+name+"/:error"})}},push:function(url,name,callback){var parts=name.split(".");if(url===""||url==="/"||parts[parts.length-1]==="index"){this.explicitIndex=true}this.matches.push([url,name,callback])},resource:function(name,options,callback){if(arguments.length===2&&typeof options==="function"){callback=options;options={}}if(arguments.length===1){options={}}options.resetNamespace=true;this.route(name,options,callback)},generate:function(){var dslMatches=this.matches;if(!this.explicitIndex){route(this,"index",{path:"/"})}return function(match){for(var i=0,l=dslMatches.length;i1){var qp0=qps[0].qp,qp1=qps[1].qp}var qp=qps[0].qp;queryParams[qp.urlKey]=qp.route.serializeQueryParam(qps[0].value,qp.urlKey,qp.type)}},_deserializeQueryParams:function(targetRouteName,queryParams){forEachQueryParam(this,targetRouteName,queryParams,function(key,value,qp){delete queryParams[key];queryParams[qp.prop]=qp.route.deserializeQueryParam(value,qp.urlKey,qp.type)})},_pruneDefaultQueryParamValues:function(targetRouteName,queryParams){var qps=this._queryParamsFor(targetRouteName);for(var key in queryParams){var qp=qps.map[key];if(qp&&qp.sdef===queryParams[key]){delete queryParams[key]}}},_doTransition:function(_targetRouteName,models,_queryParams){var targetRouteName=_targetRouteName||getActiveTargetName(this.router);var queryParams={};merge(queryParams,_queryParams);this._prepareQueryParams(targetRouteName,models,queryParams);var transitionArgs=routeArgs(targetRouteName,models,queryParams);var transitionPromise=this.router.transitionTo.apply(this.router,transitionArgs);listenForTransitionErrors(transitionPromise);return transitionPromise},_prepareQueryParams:function(targetRouteName,models,queryParams){this._hydrateUnsuppliedQueryParams(targetRouteName,models,queryParams);this._serializeQueryParams(targetRouteName,queryParams);this._pruneDefaultQueryParamValues(targetRouteName,queryParams)},_queryParamsFor:function(leafRouteName){if(this._qpCache[leafRouteName]){return this._qpCache[leafRouteName]}var map={},qps=[],qpCache=this._qpCache[leafRouteName]={map:map,qps:qps};var routerjs=this.router,recogHandlerInfos=routerjs.recognizer.handlersFor(leafRouteName);for(var i=0,len=recogHandlerInfos.length;i=0;--i){handlerInfo=handlerInfos[i];route=handlerInfo.handler;if(!originRouteFound){if(originRoute===route){originRouteFound=true}continue}if(callback(route,handlerInfos[i+1].handler)!==true){return false}}return true}var defaultActionHandlers={willResolveModel:function(transition,originRoute){originRoute.router._scheduleLoadingEvent(transition,originRoute)},error:function(error,transition,originRoute){var router=originRoute.router;var tryTopLevel=forEachRouteAbove(originRoute,transition,function(route,childRoute){var childErrorRouteName=findChildRouteName(route,childRoute,"error");if(childErrorRouteName){router.intermediateTransitionTo(childErrorRouteName,error);return}return true});if(tryTopLevel){if(routeHasBeenDefined(originRoute.router,"application_error")){router.intermediateTransitionTo("application_error",error);return}}logError(error,"Error while processing route: "+transition.targetName)},loading:function(transition,originRoute){var router=originRoute.router;var tryTopLevel=forEachRouteAbove(originRoute,transition,function(route,childRoute){var childLoadingRouteName=findChildRouteName(route,childRoute,"loading");if(childLoadingRouteName){router.intermediateTransitionTo(childLoadingRouteName);return}if(transition.pivotHandler!==route){return true}});if(tryTopLevel){if(routeHasBeenDefined(originRoute.router,"application_loading")){router.intermediateTransitionTo("application_loading");return}}}};function logError(error,initialMessage){var errorArgs=[];if(initialMessage){errorArgs.push(initialMessage)}if(error){if(error.message){errorArgs.push(error.message)}if(error.stack){errorArgs.push(error.stack)}if(typeof error==="string"){errorArgs.push(error)}}Ember.Logger.error.apply(this,errorArgs)}function findChildRouteName(parentRoute,originatingChildRoute,name){var router=parentRoute.router;var childName;var targetChildRouteName=originatingChildRoute.routeName.split(".").pop();var namespace=parentRoute.routeName==="application"?"":parentRoute.routeName+".";if(Ember.FEATURES.isEnabled("ember-routing-named-substates")){childName=namespace+targetChildRouteName+"_"+name;if(routeHasBeenDefined(router,childName)){return childName}}childName=namespace+name;if(routeHasBeenDefined(router,childName)){return childName}}function routeHasBeenDefined(router,name){var container=router.container;return router.hasRoute(name)&&(container.has("template:"+name)||container.has("route:"+name))}function triggerEvent(handlerInfos,ignoreFailure,args){var name=args.shift();if(!handlerInfos){if(ignoreFailure){return}throw new EmberError("Can't trigger action '"+name+"' because your app hasn't finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call `.send()` on the `Transition` object passed to the `model/beforeModel/afterModel` hooks.")}var eventWasHandled=false;var handlerInfo,handler;for(var i=handlerInfos.length-1;i>=0;i--){handlerInfo=handlerInfos[i];handler=handlerInfo.handler;if(handler._actions&&handler._actions[name]){if(handler._actions[name].apply(handler,args)===true){eventWasHandled=true}else{return}}}if(defaultActionHandlers[name]){defaultActionHandlers[name].apply(null,args);return}if(!eventWasHandled&&!ignoreFailure){throw new EmberError("Nothing handled the action '"+name+"'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.")}}function calculatePostTransitionState(emberRouter,leafRouteName,contexts){var routerjs=emberRouter.router;var state=routerjs.applyIntent(leafRouteName,contexts);var handlerInfos=state.handlerInfos;var params=state.params;for(var i=0,len=handlerInfos.length;i0)-(diff<0)}__exports__["default"]=function compare(v,w){if(v===w){return 0}var type1=typeOf(v);var type2=typeOf(w);if(Comparable){if(type1==="instance"&&Comparable.detect(v.constructor)){return v.constructor.compare(v,w)}if(type2==="instance"&&Comparable.detect(w.constructor)){return 1-w.constructor.compare(w,v)}}var res=spaceship(TYPE_ORDER[type1],TYPE_ORDER[type2]);if(res!==0){return res}switch(type1){case"boolean":case"number":return spaceship(v,w);case"string":return spaceship(v.localeCompare(w),0);case"array":var vLen=v.length;var wLen=w.length;var len=Math.min(vLen,wLen);for(var i=0;i1){args=a_slice.call(arguments,0,-1);options=a_slice.call(arguments,-1)[0]}if(typeof options!=="object"){throw new EmberError("Array Computed Property declared without an options hash")}var cp=new ArrayComputedProperty(options);if(args){cp.property.apply(cp,args)}return cp}__exports__.arrayComputed=arrayComputed;__exports__.ArrayComputedProperty=ArrayComputedProperty});define("ember-runtime/computed/reduce_computed",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/property_events","ember-metal/expand_properties","ember-metal/observer","ember-metal/computed","ember-metal/platform","ember-metal/enumerable_utils","ember-runtime/system/tracked_array","ember-runtime/mixins/array","ember-metal/run_loop","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__exports__){"use strict";var Ember=__dependency1__["default"];var e_get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var metaFor=__dependency4__.meta;var EmberError=__dependency5__["default"];var propertyWillChange=__dependency6__.propertyWillChange;var propertyDidChange=__dependency6__.propertyDidChange;var expandProperties=__dependency7__["default"];var addObserver=__dependency8__.addObserver;var observersFor=__dependency8__.observersFor;var removeObserver=__dependency8__.removeObserver;var addBeforeObserver=__dependency8__.addBeforeObserver;var removeBeforeObserver=__dependency8__.removeBeforeObserver;var ComputedProperty=__dependency9__.ComputedProperty; +var cacheFor=__dependency9__.cacheFor;var o_create=__dependency10__.create;var forEach=__dependency11__.forEach;var TrackedArray=__dependency12__["default"];var EmberArray=__dependency13__["default"];var run=__dependency14__["default"];var isArray=__dependency4__.isArray;var cacheSet=cacheFor.set;var cacheGet=cacheFor.get;var cacheRemove=cacheFor.remove;var a_slice=[].slice;var eachPropertyPattern=/^(.*)\.@each\.(.*)/;var doubleEachPropertyPattern=/(.*\.@each){2,}/;var arrayBracketPattern=/\.\[\]$/;function get(obj,key){if(key==="@this"){return obj}return e_get(obj,key)}function DependentArraysObserver(callbacks,cp,instanceMeta,context,propertyName,sugarMeta){this.callbacks=callbacks;this.cp=cp;this.instanceMeta=instanceMeta;this.dependentKeysByGuid={};this.trackedArraysByGuid={};this.suspended=false;this.changedItems={};this.changedItemCount=0}function ItemPropertyObserverContext(dependentArray,index,trackedArray){this.dependentArray=dependentArray;this.index=index;this.item=dependentArray.objectAt(index);this.trackedArray=trackedArray;this.beforeObserver=null;this.observer=null;this.destroyed=false}DependentArraysObserver.prototype={setValue:function(newValue){this.instanceMeta.setValue(newValue,true)},getValue:function(){return this.instanceMeta.getValue()},setupObservers:function(dependentArray,dependentKey){this.dependentKeysByGuid[guidFor(dependentArray)]=dependentKey;dependentArray.addArrayObserver(this,{willChange:"dependentArrayWillChange",didChange:"dependentArrayDidChange"});if(this.cp._itemPropertyKeys[dependentKey]){this.setupPropertyObservers(dependentKey,this.cp._itemPropertyKeys[dependentKey])}},teardownObservers:function(dependentArray,dependentKey){var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey]||[];delete this.dependentKeysByGuid[guidFor(dependentArray)];this.teardownPropertyObservers(dependentKey,itemPropertyKeys);dependentArray.removeArrayObserver(this,{willChange:"dependentArrayWillChange",didChange:"dependentArrayDidChange"})},suspendArrayObservers:function(callback,binding){var oldSuspended=this.suspended;this.suspended=true;callback.call(binding);this.suspended=oldSuspended},setupPropertyObservers:function(dependentKey,itemPropertyKeys){var dependentArray=get(this.instanceMeta.context,dependentKey),length=get(dependentArray,"length"),observerContexts=new Array(length);this.resetTransformations(dependentKey,observerContexts);forEach(dependentArray,function(item,index){var observerContext=this.createPropertyObserverContext(dependentArray,index,this.trackedArraysByGuid[dependentKey]);observerContexts[index]=observerContext;forEach(itemPropertyKeys,function(propertyKey){addBeforeObserver(item,propertyKey,this,observerContext.beforeObserver);addObserver(item,propertyKey,this,observerContext.observer)},this)},this)},teardownPropertyObservers:function(dependentKey,itemPropertyKeys){var dependentArrayObserver=this;var trackedArray=this.trackedArraysByGuid[dependentKey];var beforeObserver,observer,item;if(!trackedArray){return}trackedArray.apply(function(observerContexts,offset,operation){if(operation===TrackedArray.DELETE){return}forEach(observerContexts,function(observerContext){observerContext.destroyed=true;beforeObserver=observerContext.beforeObserver;observer=observerContext.observer;item=observerContext.item;forEach(itemPropertyKeys,function(propertyKey){removeBeforeObserver(item,propertyKey,dependentArrayObserver,beforeObserver);removeObserver(item,propertyKey,dependentArrayObserver,observer)})})})},createPropertyObserverContext:function(dependentArray,index,trackedArray){var observerContext=new ItemPropertyObserverContext(dependentArray,index,trackedArray);this.createPropertyObserver(observerContext);return observerContext},createPropertyObserver:function(observerContext){var dependentArrayObserver=this;observerContext.beforeObserver=function(obj,keyName){return dependentArrayObserver.itemPropertyWillChange(obj,keyName,observerContext.dependentArray,observerContext)};observerContext.observer=function(obj,keyName){return dependentArrayObserver.itemPropertyDidChange(obj,keyName,observerContext.dependentArray,observerContext)}},resetTransformations:function(dependentKey,observerContexts){this.trackedArraysByGuid[dependentKey]=new TrackedArray(observerContexts)},trackAdd:function(dependentKey,index,newItems){var trackedArray=this.trackedArraysByGuid[dependentKey];if(trackedArray){trackedArray.addItems(index,newItems)}},trackRemove:function(dependentKey,index,removedCount){var trackedArray=this.trackedArraysByGuid[dependentKey];if(trackedArray){return trackedArray.removeItems(index,removedCount)}return[]},updateIndexes:function(trackedArray,array){var length=get(array,"length");trackedArray.apply(function(observerContexts,offset,operation,operationIndex){if(operation===TrackedArray.DELETE){return}if(operationIndex===0&&operation===TrackedArray.RETAIN&&observerContexts.length===length&&offset===0){return}forEach(observerContexts,function(context,index){context.index=index+offset})})},dependentArrayWillChange:function(dependentArray,index,removedCount,addedCount){if(this.suspended){return}var removedItem=this.callbacks.removedItem;var changeMeta;var guid=guidFor(dependentArray);var dependentKey=this.dependentKeysByGuid[guid];var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey]||[];var length=get(dependentArray,"length");var normalizedIndex=normalizeIndex(index,length,0);var normalizedRemoveCount=normalizeRemoveCount(normalizedIndex,length,removedCount);var item,itemIndex,sliceIndex,observerContexts;observerContexts=this.trackRemove(dependentKey,normalizedIndex,normalizedRemoveCount);function removeObservers(propertyKey){observerContexts[sliceIndex].destroyed=true;removeBeforeObserver(item,propertyKey,this,observerContexts[sliceIndex].beforeObserver);removeObserver(item,propertyKey,this,observerContexts[sliceIndex].observer)}for(sliceIndex=normalizedRemoveCount-1;sliceIndex>=0;--sliceIndex){itemIndex=normalizedIndex+sliceIndex;if(itemIndex>=length){break}item=dependentArray.objectAt(itemIndex);forEach(itemPropertyKeys,removeObservers,this);changeMeta=new ChangeMeta(dependentArray,item,itemIndex,this.instanceMeta.propertyName,this.cp,normalizedRemoveCount);this.setValue(removedItem.call(this.instanceMeta.context,this.getValue(),item,changeMeta,this.instanceMeta.sugarMeta))}},dependentArrayDidChange:function(dependentArray,index,removedCount,addedCount){if(this.suspended){return}var addedItem=this.callbacks.addedItem;var guid=guidFor(dependentArray);var dependentKey=this.dependentKeysByGuid[guid];var observerContexts=new Array(addedCount);var itemPropertyKeys=this.cp._itemPropertyKeys[dependentKey];var length=get(dependentArray,"length");var normalizedIndex=normalizeIndex(index,length,addedCount);var endIndex=normalizedIndex+addedCount;var changeMeta,observerContext;forEach(dependentArray.slice(normalizedIndex,endIndex),function(item,sliceIndex){if(itemPropertyKeys){observerContext=this.createPropertyObserverContext(dependentArray,normalizedIndex+sliceIndex,this.trackedArraysByGuid[dependentKey]);observerContexts[sliceIndex]=observerContext;forEach(itemPropertyKeys,function(propertyKey){addBeforeObserver(item,propertyKey,this,observerContext.beforeObserver);addObserver(item,propertyKey,this,observerContext.observer)},this)}changeMeta=new ChangeMeta(dependentArray,item,normalizedIndex+sliceIndex,this.instanceMeta.propertyName,this.cp,addedCount);this.setValue(addedItem.call(this.instanceMeta.context,this.getValue(),item,changeMeta,this.instanceMeta.sugarMeta))},this);this.trackAdd(dependentKey,normalizedIndex,observerContexts)},itemPropertyWillChange:function(obj,keyName,array,observerContext){var guid=guidFor(obj);if(!this.changedItems[guid]){this.changedItems[guid]={array:array,observerContext:observerContext,obj:obj,previousValues:{}}}++this.changedItemCount;this.changedItems[guid].previousValues[keyName]=get(obj,keyName)},itemPropertyDidChange:function(obj,keyName,array,observerContext){if(--this.changedItemCount===0){this.flushChanges()}},flushChanges:function(){var changedItems=this.changedItems,key,c,changeMeta;for(key in changedItems){c=changedItems[key];if(c.observerContext.destroyed){continue}this.updateIndexes(c.observerContext.trackedArray,c.observerContext.dependentArray);changeMeta=new ChangeMeta(c.array,c.obj,c.observerContext.index,this.instanceMeta.propertyName,this.cp,changedItems.length,c.previousValues);this.setValue(this.callbacks.removedItem.call(this.instanceMeta.context,this.getValue(),c.obj,changeMeta,this.instanceMeta.sugarMeta));this.setValue(this.callbacks.addedItem.call(this.instanceMeta.context,this.getValue(),c.obj,changeMeta,this.instanceMeta.sugarMeta))}this.changedItems={}}};function normalizeIndex(index,length,newItemsOffset){if(index<0){return Math.max(0,length+index)}else if(index1){args=a_slice.call(arguments,0,-1);options=a_slice.call(arguments,-1)[0]}if(typeof options!=="object"){throw new EmberError("Reduce Computed Property declared without an options hash")}if(!("initialValue"in options)){throw new EmberError("Reduce Computed Property declared without an initial value")}var cp=new ReduceComputedProperty(options);if(args){cp.property.apply(cp,args)}return cp}__exports__.reduceComputed=reduceComputed});define("ember-runtime/computed/reduce_computed_macros",["ember-metal/core","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/error","ember-metal/enumerable_utils","ember-metal/run_loop","ember-metal/observer","ember-runtime/computed/array_computed","ember-runtime/computed/reduce_computed","ember-runtime/system/object_proxy","ember-runtime/system/subarray","ember-metal/keys","ember-runtime/compare","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__exports__){"use strict";var Ember=__dependency1__["default"];var merge=__dependency2__["default"];var get=__dependency3__.get;var set=__dependency4__.set;var isArray=__dependency5__.isArray;var guidFor=__dependency5__.guidFor;var EmberError=__dependency6__["default"];var forEach=__dependency7__.forEach;var run=__dependency8__["default"];var addObserver=__dependency9__.addObserver;var arrayComputed=__dependency10__.arrayComputed;var reduceComputed=__dependency11__.reduceComputed;var ObjectProxy=__dependency12__["default"];var SubArray=__dependency13__["default"];var keys=__dependency14__["default"];var compare=__dependency15__["default"];var a_slice=[].slice;function sum(dependentKey){return reduceComputed(dependentKey,{initialValue:0,addedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return accumulatedValue+item},removedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return accumulatedValue-item}})}__exports__.sum=sum;function max(dependentKey){return reduceComputed(dependentKey,{initialValue:-Infinity,addedItem:function(accumulatedValue,item,changeMeta,instanceMeta){return Math.max(accumulatedValue,item)},removedItem:function(accumulatedValue,item,changeMeta,instanceMeta){if(itemaccumulatedValue){return accumulatedValue}}})}__exports__.min=min;function map(dependentKey,callback){var options={addedItem:function(array,item,changeMeta,instanceMeta){var mapped=callback.call(this,item);array.insertAt(changeMeta.index,mapped);return array},removedItem:function(array,item,changeMeta,instanceMeta){array.removeAt(changeMeta.index,1);return array}};return arrayComputed(dependentKey,options)}__exports__.map=map;function mapBy(dependentKey,propertyKey){var callback=function(item){return get(item,propertyKey)};return map(dependentKey+".@each."+propertyKey,callback)}__exports__.mapBy=mapBy;var mapProperty=mapBy;__exports__.mapProperty=mapProperty;function filter(dependentKey,callback){var options={initialize:function(array,changeMeta,instanceMeta){instanceMeta.filteredArrayIndexes=new SubArray},addedItem:function(array,item,changeMeta,instanceMeta){var match=!!callback.call(this,item);var filterIndex=instanceMeta.filteredArrayIndexes.addItem(changeMeta.index,match);if(match){array.insertAt(filterIndex,item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var filterIndex=instanceMeta.filteredArrayIndexes.removeItem(changeMeta.index);if(filterIndex>-1){array.removeAt(filterIndex)}return array}};return arrayComputed(dependentKey,options)}__exports__.filter=filter;function filterBy(dependentKey,propertyKey,value){var callback;if(arguments.length===2){callback=function(item){return get(item,propertyKey)}}else{callback=function(item){return get(item,propertyKey)===value}}return filter(dependentKey+".@each."+propertyKey,callback)}__exports__.filterBy=filterBy;var filterProperty=filterBy;__exports__.filterProperty=filterProperty;function uniq(){var args=a_slice.call(arguments);args.push({initialize:function(array,changeMeta,instanceMeta){instanceMeta.itemCounts={}},addedItem:function(array,item,changeMeta,instanceMeta){var guid=guidFor(item);if(!instanceMeta.itemCounts[guid]){instanceMeta.itemCounts[guid]=1;array.pushObject(item)}else{++instanceMeta.itemCounts[guid]}return array},removedItem:function(array,item,_,instanceMeta){var guid=guidFor(item);var itemCounts=instanceMeta.itemCounts;if(--itemCounts[guid]===0){array.removeObject(item)}return array}});return arrayComputed.apply(null,args)}__exports__.uniq=uniq;var union=uniq;__exports__.union=union;function intersect(){var getDependentKeyGuids=function(changeMeta){return map(changeMeta.property._dependentKeys,function(dependentKey){return guidFor(dependentKey)})};var args=a_slice.call(arguments);args.push({initialize:function(array,changeMeta,instanceMeta){instanceMeta.itemCounts={}},addedItem:function(array,item,changeMeta,instanceMeta){var itemGuid=guidFor(item);var dependentGuids=getDependentKeyGuids(changeMeta);var dependentGuid=guidFor(changeMeta.arrayChanged);var numberOfDependentArrays=changeMeta.property._dependentKeys.length;var itemCounts=instanceMeta.itemCounts;if(!itemCounts[itemGuid]){itemCounts[itemGuid]={}}if(itemCounts[itemGuid][dependentGuid]===undefined){itemCounts[itemGuid][dependentGuid]=0}if(++itemCounts[itemGuid][dependentGuid]===1&&numberOfDependentArrays===keys(itemCounts[itemGuid]).length){array.addObject(item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var itemGuid=guidFor(item);var dependentGuids=getDependentKeyGuids(changeMeta);var dependentGuid=guidFor(changeMeta.arrayChanged);var numberOfDependentArrays=changeMeta.property._dependentKeys.length;var numberOfArraysItemAppearsIn;var itemCounts=instanceMeta.itemCounts;if(itemCounts[itemGuid][dependentGuid]===undefined){itemCounts[itemGuid][dependentGuid]=0}if(--itemCounts[itemGuid][dependentGuid]===0){delete itemCounts[itemGuid][dependentGuid];numberOfArraysItemAppearsIn=keys(itemCounts[itemGuid]).length;if(numberOfArraysItemAppearsIn===0){delete itemCounts[itemGuid]}array.removeObject(item)}return array}});return arrayComputed.apply(null,args)}__exports__.intersect=intersect;function setDiff(setAProperty,setBProperty){if(arguments.length!==2){throw new EmberError("setDiff requires exactly two dependent arrays.")}return arrayComputed(setAProperty,setBProperty,{addedItem:function(array,item,changeMeta,instanceMeta){var setA=get(this,setAProperty);var setB=get(this,setBProperty);if(changeMeta.arrayChanged===setA){if(!setB.contains(item)){array.addObject(item)}}else{array.removeObject(item)}return array},removedItem:function(array,item,changeMeta,instanceMeta){var setA=get(this,setAProperty);var setB=get(this,setBProperty);if(changeMeta.arrayChanged===setB){if(setA.contains(item)){array.addObject(item)}}else{array.removeObject(item)}return array}})}__exports__.setDiff=setDiff;function binarySearch(array,item,low,high){var mid,midItem,res,guidMid,guidItem;if(arguments.length<4){high=get(array,"length")}if(arguments.length<3){low=0}if(low===high){return low}mid=low+Math.floor((high-low)/2);midItem=array.objectAt(mid);guidMid=_guidFor(midItem);guidItem=_guidFor(item);if(guidMid===guidItem){return mid}res=this.order(midItem,item);if(res===0){res=guidMid0){return this.binarySearch(array,item,low,mid)}return mid;function _guidFor(item){if(SearchProxy.detectInstance(item)){return guidFor(get(item,"content"))}return guidFor(item)}}var SearchProxy=ObjectProxy.extend();function sort(itemsKey,sortDefinition){var initFn,sortPropertiesKey;if(typeof sortDefinition==="function"){initFn=function(array,changeMeta,instanceMeta){instanceMeta.order=sortDefinition;instanceMeta.binarySearch=binarySearch}}else{sortPropertiesKey=sortDefinition;initFn=function(array,changeMeta,instanceMeta){function setupSortProperties(){var sortPropertyDefinitions=get(this,sortPropertiesKey);var sortProperties=instanceMeta.sortProperties=[];var sortPropertyAscending=instanceMeta.sortPropertyAscending={};var sortProperty,idx,asc;changeMeta.property.clearItemPropertyKeys(itemsKey);forEach(sortPropertyDefinitions,function(sortPropertyDefinition){if((idx=sortPropertyDefinition.indexOf(":"))!==-1){sortProperty=sortPropertyDefinition.substring(0,idx);asc=sortPropertyDefinition.substring(idx+1).toLowerCase()!=="desc"}else{sortProperty=sortPropertyDefinition;asc=true}sortProperties.push(sortProperty);sortPropertyAscending[sortProperty]=asc;changeMeta.property.itemPropertyKey(itemsKey,sortProperty)});sortPropertyDefinitions.addObserver("@each",this,updateSortPropertiesOnce)}function updateSortPropertiesOnce(){run.once(this,updateSortProperties,changeMeta.propertyName)}function updateSortProperties(propertyName){setupSortProperties.call(this);changeMeta.property.recomputeOnce.call(this,propertyName)}addObserver(this,sortPropertiesKey,updateSortPropertiesOnce);setupSortProperties.call(this);instanceMeta.order=function(itemA,itemB){var isProxy=itemB instanceof SearchProxy;var sortProperty,result,asc;for(var i=0;i=0&&idxidx){subController=subControllers[idx];if(subController){return subController}}if(this._isVirtual){parentController=get(this,"parentController")}else{parentController=this}if(Ember.FEATURES.isEnabled("ember-runtime-item-controller-inline-class")){options={target:parentController,parentController:parentController,model:object};if(typeof controllerClass==="string"){fullName="controller:"+controllerClass;if(!container.has(fullName)){throw new EmberError('Could not resolve itemController: "'+controllerClass+'"')}subControllerFactory=container.lookupFactory(fullName)}else{subControllerFactory=controllerClass;options.container=container}subController=subControllerFactory.create(options)}else{fullName="controller:"+controllerClass;if(!container.has(fullName)){throw new EmberError('Could not resolve itemController: "'+controllerClass+'"')}subController=container.lookupFactory(fullName).create({target:parentController,parentController:parentController,model:object})}subControllers[idx]=subController;return subController},_subControllers:null,_resetSubControllers:function(){var controller;var subControllers=this._subControllers;if(subControllers.length){for(var i=0,length=subControllers.length;length>i;i++){controller=subControllers[i];if(controller){controller.destroy()}}subControllers.length=0}},willDestroy:function(){this._resetSubControllers();this._super()}})});define("ember-runtime/controllers/controller",["ember-runtime/system/object","ember-runtime/mixins/controller","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var EmberObject=__dependency1__["default"];var Mixin=__dependency2__["default"];__exports__["default"]=EmberObject.extend(Mixin)});define("ember-runtime/controllers/object_controller",["ember-runtime/mixins/controller","ember-runtime/system/object_proxy","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var ControllerMixin=__dependency1__["default"];var ObjectProxy=__dependency2__["default"];__exports__["default"]=ObjectProxy.extend(ControllerMixin)});define("ember-runtime/copy",["ember-metal/enumerable_utils","ember-metal/utils","ember-runtime/system/object","ember-runtime/mixins/copyable","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var indexOf=__dependency1__.indexOf;var typeOf=__dependency2__.typeOf;var EmberObject=__dependency3__["default"];var Copyable=__dependency4__["default"];function _copy(obj,deep,seen,copies){var ret,loc,key;if(typeof obj!=="object"||obj===null){return obj}if(deep&&(loc=indexOf(seen,obj))>=0){return copies[loc]}if(typeOf(obj)==="array"){ret=obj.slice();if(deep){loc=ret.length;while(--loc>=0){ret[loc]=_copy(ret[loc],deep,seen,copies)}}}else if(Copyable&&Copyable.detect(obj)){ret=obj.copy(deep,seen,copies)}else if(obj instanceof Date){ret=new Date(obj.getTime())}else{ret={};for(key in obj){if(obj.hasOwnProperty&&!obj.hasOwnProperty(key)){continue}if(key.substring(0,2)==="__"){continue}ret[key]=deep?_copy(obj[key],deep,seen,copies):obj[key]}}if(deep){seen.push(obj);copies.push(ret)}return ret}__exports__["default"]=function copy(obj,deep){if("object"!==typeof obj||obj===null){return obj}if(Copyable&&Copyable.detect(obj)){return obj.copy(deep)}return _copy(obj,deep,deep?[]:null,deep?[]:null)}});define("ember-runtime/core",["exports"],function(__exports__){"use strict";var isEqual=function isEqual(a,b){if(a&&typeof a.isEqual==="function"){return a.isEqual(b)}if(a instanceof Date&&b instanceof Date){return a.getTime()===b.getTime()}return a===b};__exports__.isEqual=isEqual});define("ember-runtime/ext/function",["ember-metal/core","ember-metal/expand_properties","ember-metal/computed"],function(__dependency1__,__dependency2__,__dependency3__){"use strict";var Ember=__dependency1__["default"];var expandProperties=__dependency2__["default"];var computed=__dependency3__.computed;var a_slice=Array.prototype.slice;var FunctionPrototype=Function.prototype;if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.Function){FunctionPrototype.property=function(){var ret=computed(this);return ret.property.apply(ret,arguments)};FunctionPrototype.observes=function(){var watched=[]; +var addWatchedProperty=function(obs){watched.push(obs)};for(var i=0;i=0){return}if(typeof obj.hasOwnProperty==="function"&&!obj.hasOwnProperty(key)){return}array.push(key)};keys=function keys(obj){var ret=[];var key;for(key in obj){pushPropertyName(obj,ret,key)}for(var i=0,l=prototypeProperties.length;i=get(this,"length"))return undefined;return get(this,idx)},objectsAt:function(indexes){var self=this;return map(indexes,function(idx){return self.objectAt(idx)})},nextObject:function(idx){return this.objectAt(idx)},"[]":computed(function(key,value){if(value!==undefined)this.replace(0,get(this,"length"),value);return this}),firstObject:computed(function(){return this.objectAt(0)}),lastObject:computed(function(){return this.objectAt(get(this,"length")-1)}),contains:function(obj){return this.indexOf(obj)>=0},slice:function(beginIndex,endIndex){var ret=Ember.A();var length=get(this,"length");if(isNone(beginIndex))beginIndex=0;if(isNone(endIndex)||endIndex>length)endIndex=length;if(beginIndex<0)beginIndex=length+beginIndex;if(endIndex<0)endIndex=length+endIndex;while(beginIndex=len)startAt=len-1;if(startAt<0)startAt+=len;for(idx=startAt;idx>=0;idx--){if(this.objectAt(idx)===object)return idx}return-1},addArrayObserver:function(target,opts){return arrayObserversHelper(this,target,opts,addListener,false)},removeArrayObserver:function(target,opts){return arrayObserversHelper(this,target,opts,removeListener,true)},hasArrayObservers:computed(function(){return hasListeners(this,"@array:change")||hasListeners(this,"@array:before")}),arrayContentWillChange:function(startIdx,removeAmt,addAmt){if(startIdx===undefined){startIdx=0;removeAmt=addAmt=-1}else{if(removeAmt===undefined)removeAmt=-1;if(addAmt===undefined)addAmt=-1}if(isWatching(this,"@each")){get(this,"@each")}sendEvent(this,"@array:before",[this,startIdx,removeAmt,addAmt]);var removing,lim;if(startIdx>=0&&removeAmt>=0&&get(this,"hasEnumerableObservers")){removing=[];lim=startIdx+removeAmt;for(var idx=startIdx;idx=0&&addAmt>=0&&get(this,"hasEnumerableObservers")){adding=[];lim=startIdx+addAmt;for(var idx=startIdx;idx1)args=a_slice.call(arguments,1);this.forEach(function(x,idx){var method=x&&x[methodName];if("function"===typeof method){ret[idx]=args?apply(x,method,args):x[methodName]()}},this);return ret},toArray:function(){var ret=Ember.A();this.forEach(function(o,idx){ret[idx]=o});return ret},compact:function(){return this.filter(function(value){return value!=null})},without:function(value){if(!this.contains(value))return this;var ret=Ember.A();this.forEach(function(k){if(k!==value)ret[ret.length]=k});return ret},uniq:function(){var ret=Ember.A();this.forEach(function(k){if(indexOf(ret,k)<0)ret.push(k)});return ret},"[]":computed(function(key,value){return this}),addEnumerableObserver:function(target,opts){var willChange=opts&&opts.willChange||"enumerableWillChange",didChange=opts&&opts.didChange||"enumerableDidChange";var hasObservers=get(this,"hasEnumerableObservers");if(!hasObservers)propertyWillChange(this,"hasEnumerableObservers");addListener(this,"@enumerable:before",target,willChange);addListener(this,"@enumerable:change",target,didChange);if(!hasObservers)propertyDidChange(this,"hasEnumerableObservers");return this},removeEnumerableObserver:function(target,opts){var willChange=opts&&opts.willChange||"enumerableWillChange",didChange=opts&&opts.didChange||"enumerableDidChange";var hasObservers=get(this,"hasEnumerableObservers");if(hasObservers)propertyWillChange(this,"hasEnumerableObservers");removeListener(this,"@enumerable:before",target,willChange);removeListener(this,"@enumerable:change",target,didChange);if(hasObservers)propertyDidChange(this,"hasEnumerableObservers");return this},hasEnumerableObservers:computed(function(){return hasListeners(this,"@enumerable:change")||hasListeners(this,"@enumerable:before")}),enumerableContentWillChange:function(removing,adding){var removeCnt,addCnt,hasDelta;if("number"===typeof removing)removeCnt=removing;else if(removing)removeCnt=get(removing,"length");else removeCnt=removing=-1;if("number"===typeof adding)addCnt=adding;else if(adding)addCnt=get(adding,"length");else addCnt=adding=-1;hasDelta=addCnt<0||removeCnt<0||addCnt-removeCnt!==0;if(removing===-1)removing=null;if(adding===-1)adding=null;propertyWillChange(this,"[]");if(hasDelta)propertyWillChange(this,"length");sendEvent(this,"@enumerable:before",[this,removing,adding]);return this},enumerableContentDidChange:function(removing,adding){var removeCnt,addCnt,hasDelta;if("number"===typeof removing)removeCnt=removing;else if(removing)removeCnt=get(removing,"length");else removeCnt=removing=-1;if("number"===typeof adding)addCnt=adding;else if(adding)addCnt=get(adding,"length");else addCnt=adding=-1;hasDelta=addCnt<0||removeCnt<0||addCnt-removeCnt!==0;if(removing===-1)removing=null;if(adding===-1)adding=null;sendEvent(this,"@enumerable:change",[this,removing,adding]);if(hasDelta)propertyDidChange(this,"length");propertyDidChange(this,"[]");return this},sortBy:function(){var sortKeys=arguments;return this.toArray().sort(function(a,b){for(var i=0;iget(this,"length"))throw new EmberError(OUT_OF_RANGE_EXCEPTION);this.replace(idx,0,[object]);return this},removeAt:function(start,len){if("number"===typeof start){if(start<0||start>=get(this,"length")){throw new EmberError(OUT_OF_RANGE_EXCEPTION)}if(len===undefined)len=1;this.replace(start,len,EMPTY)}return this},pushObject:function(obj){this.insertAt(get(this,"length"),obj);return obj},pushObjects:function(objects){if(!(Enumerable.detect(objects)||isArray(objects))){throw new TypeError("Must pass Ember.Enumerable to Ember.MutableArray#pushObjects")}this.replace(get(this,"length"),0,objects);return this},popObject:function(){var len=get(this,"length");if(len===0)return null;var ret=this.objectAt(len-1);this.removeAt(len-1,1);return ret},shiftObject:function(){if(get(this,"length")===0)return null;var ret=this.objectAt(0);this.removeAt(0);return ret},unshiftObject:function(obj){this.insertAt(0,obj);return obj},unshiftObjects:function(objects){this.replace(0,0,objects);return this},reverseObjects:function(){var len=get(this,"length");if(len===0)return this;var objects=this.toArray().reverse();this.replace(0,len,objects);return this},setObjects:function(objects){if(objects.length===0)return this.clear();var len=get(this,"length");this.replace(0,len,objects);return this},removeObject:function(obj){var loc=get(this,"length")||0;while(--loc>=0){var curObject=this.objectAt(loc);if(curObject===obj)this.removeAt(loc)}return this},addObject:function(obj){if(!this.contains(obj))this.pushObject(obj);return this}})});define("ember-runtime/mixins/mutable_enumerable",["ember-metal/enumerable_utils","ember-runtime/mixins/enumerable","ember-metal/mixin","ember-metal/property_events","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var forEach=__dependency1__.forEach;var Enumerable=__dependency2__["default"];var Mixin=__dependency3__.Mixin;var required=__dependency3__.required;var beginPropertyChanges=__dependency4__.beginPropertyChanges;var endPropertyChanges=__dependency4__.endPropertyChanges;__exports__["default"]=Mixin.create(Enumerable,{addObject:required(Function),addObjects:function(objects){beginPropertyChanges(this);forEach(objects,function(obj){this.addObject(obj)},this);endPropertyChanges(this);return this},removeObject:required(Function),removeObjects:function(objects){beginPropertyChanges(this);for(var i=objects.length-1;i>=0;i--){this.removeObject(objects[i])}endPropertyChanges(this);return this}})});define("ember-runtime/mixins/observable",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/get_properties","ember-metal/set_properties","ember-metal/mixin","ember-metal/events","ember-metal/property_events","ember-metal/observer","ember-metal/computed","ember-metal/is_none","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var getWithDefault=__dependency2__.getWithDefault;var set=__dependency3__.set;var apply=__dependency4__.apply;var getProperties=__dependency5__["default"];var setProperties=__dependency6__["default"];var Mixin=__dependency7__.Mixin;var hasListeners=__dependency8__.hasListeners;var beginPropertyChanges=__dependency9__.beginPropertyChanges;var propertyWillChange=__dependency9__.propertyWillChange;var propertyDidChange=__dependency9__.propertyDidChange;var endPropertyChanges=__dependency9__.endPropertyChanges;var addObserver=__dependency10__.addObserver;var addBeforeObserver=__dependency10__.addBeforeObserver;var removeObserver=__dependency10__.removeObserver;var observersFor=__dependency10__.observersFor;var cacheFor=__dependency11__.cacheFor;var isNone=__dependency12__.isNone;var slice=Array.prototype.slice;__exports__["default"]=Mixin.create({get:function(keyName){return get(this,keyName)},getProperties:function(){return apply(null,getProperties,[this].concat(slice.call(arguments)))},set:function(keyName,value){set(this,keyName,value);return this},setProperties:function(hash){return setProperties(this,hash)},beginPropertyChanges:function(){beginPropertyChanges();return this},endPropertyChanges:function(){endPropertyChanges();return this},propertyWillChange:function(keyName){propertyWillChange(this,keyName);return this},propertyDidChange:function(keyName){propertyDidChange(this,keyName);return this},notifyPropertyChange:function(keyName){this.propertyWillChange(keyName);this.propertyDidChange(keyName);return this},addBeforeObserver:function(key,target,method){addBeforeObserver(this,key,target,method)},addObserver:function(key,target,method){addObserver(this,key,target,method)},removeObserver:function(key,target,method){removeObserver(this,key,target,method)},hasObserverFor:function(key){return hasListeners(this,key+":change")},getWithDefault:function(keyName,defaultValue){return getWithDefault(this,keyName,defaultValue)},incrementProperty:function(keyName,increment){if(isNone(increment)){increment=1}set(this,keyName,(parseFloat(get(this,keyName))||0)+increment);return get(this,keyName)},decrementProperty:function(keyName,decrement){if(isNone(decrement)){decrement=1}set(this,keyName,(get(this,keyName)||0)-decrement);return get(this,keyName)},toggleProperty:function(keyName){set(this,keyName,!get(this,keyName));return get(this,keyName)},cacheFor:function(keyName){return cacheFor(this,keyName)},observersForKey:function(keyName){return observersFor(this,keyName)}})});define("ember-runtime/mixins/promise_proxy",["ember-metal/property_get","ember-metal/set_properties","ember-metal/computed","ember-metal/mixin","ember-metal/error","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__exports__){"use strict";var get=__dependency1__.get;var setProperties=__dependency2__["default"];var computed=__dependency3__.computed;var Mixin=__dependency4__.Mixin;var EmberError=__dependency5__["default"];var not=computed.not;var or=computed.or;function tap(proxy,promise){setProperties(proxy,{isFulfilled:false,isRejected:false});return promise.then(function(value){setProperties(proxy,{content:value,isFulfilled:true});return value},function(reason){setProperties(proxy,{reason:reason,isRejected:true});throw reason},"Ember: PromiseProxy")}__exports__["default"]=Mixin.create({reason:null,isPending:not("isSettled").readOnly(),isSettled:or("isRejected","isFulfilled").readOnly(),isRejected:false,isFulfilled:false,promise:computed(function(key,promise){if(arguments.length===2){return tap(this,promise)}else{throw new EmberError("PromiseProxy's promise must be set")}}),then:promiseAlias("then"),"catch":promiseAlias("catch"),"finally":promiseAlias("finally")});function promiseAlias(name){return function(){var promise=get(this,"promise");return promise[name].apply(promise,arguments)}}});define("ember-runtime/mixins/proxy",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/observer","ember-metal/property_events","ember-metal/computed","ember-metal/properties","ember-metal/mixin","ember-runtime/system/string","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__exports__){"use strict"; +var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var meta=__dependency4__.meta;var addObserver=__dependency5__.addObserver;var removeObserver=__dependency5__.removeObserver;var addBeforeObserver=__dependency5__.addBeforeObserver;var removeBeforeObserver=__dependency5__.removeBeforeObserver;var propertyWillChange=__dependency6__.propertyWillChange;var propertyDidChange=__dependency6__.propertyDidChange;var computed=__dependency7__.computed;var defineProperty=__dependency8__.defineProperty;var Mixin=__dependency9__.Mixin;var observer=__dependency9__.observer;var fmt=__dependency10__.fmt;var EmberObject=__dependency11__["default"];function contentPropertyWillChange(content,contentKey){var key=contentKey.slice(8);if(key in this){return}propertyWillChange(this,key)}function contentPropertyDidChange(content,contentKey){var key=contentKey.slice(8);if(key in this){return}propertyDidChange(this,key)}__exports__["default"]=Mixin.create({content:null,_contentDidChange:observer("content",function(){}),isTruthy:computed.bool("content"),_debugContainerKey:null,willWatchProperty:function(key){var contentKey="content."+key;addBeforeObserver(this,contentKey,null,contentPropertyWillChange);addObserver(this,contentKey,null,contentPropertyDidChange)},didUnwatchProperty:function(key){var contentKey="content."+key;removeBeforeObserver(this,contentKey,null,contentPropertyWillChange);removeObserver(this,contentKey,null,contentPropertyDidChange)},unknownProperty:function(key){var content=get(this,"content");if(content){return get(content,key)}},setUnknownProperty:function(key,value){var m=meta(this);if(m.proto===this){defineProperty(this,key,null,value);return value}var content=get(this,"content");return set(content,key,value)}})});define("ember-runtime/mixins/sortable",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/enumerable_utils","ember-metal/mixin","ember-runtime/mixins/mutable_enumerable","ember-runtime/compare","ember-metal/observer","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var forEach=__dependency4__.forEach;var Mixin=__dependency5__.Mixin;var MutableEnumerable=__dependency6__["default"];var compare=__dependency7__["default"];var addObserver=__dependency8__.addObserver;var removeObserver=__dependency8__.removeObserver;var computed=__dependency9__.computed;var beforeObserver=__dependency5__.beforeObserver;var observer=__dependency5__.observer;__exports__["default"]=Mixin.create(MutableEnumerable,{sortProperties:null,sortAscending:true,sortFunction:compare,orderBy:function(item1,item2){var result=0,sortProperties=get(this,"sortProperties"),sortAscending=get(this,"sortAscending"),sortFunction=get(this,"sortFunction");forEach(sortProperties,function(propertyName){if(result===0){result=sortFunction.call(this,get(item1,propertyName),get(item2,propertyName));if(result!==0&&!sortAscending){result=-1*result}}},this);return result},destroy:function(){var content=get(this,"content"),sortProperties=get(this,"sortProperties");if(content&&sortProperties){forEach(content,function(item){forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super()},isSorted:computed.notEmpty("sortProperties"),arrangedContent:computed("content","sortProperties.@each",function(key,value){var content=get(this,"content"),isSorted=get(this,"isSorted"),sortProperties=get(this,"sortProperties"),self=this;if(content&&isSorted){content=content.slice();content.sort(function(item1,item2){return self.orderBy(item1,item2)});forEach(content,function(item){forEach(sortProperties,function(sortProperty){addObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this);return Ember.A(content)}return content}),_contentWillChange:beforeObserver("content",function(){var content=get(this,"content"),sortProperties=get(this,"sortProperties");if(content&&sortProperties){forEach(content,function(item){forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}this._super()}),sortPropertiesWillChange:beforeObserver("sortProperties",function(){this._lastSortAscending=undefined}),sortPropertiesDidChange:observer("sortProperties",function(){this._lastSortAscending=undefined}),sortAscendingWillChange:beforeObserver("sortAscending",function(){this._lastSortAscending=get(this,"sortAscending")}),sortAscendingDidChange:observer("sortAscending",function(){if(this._lastSortAscending!==undefined&&get(this,"sortAscending")!==this._lastSortAscending){var arrangedContent=get(this,"arrangedContent");arrangedContent.reverseObjects()}}),contentArrayWillChange:function(array,idx,removedCount,addedCount){var isSorted=get(this,"isSorted");if(isSorted){var arrangedContent=get(this,"arrangedContent");var removedObjects=array.slice(idx,idx+removedCount);var sortProperties=get(this,"sortProperties");forEach(removedObjects,function(item){arrangedContent.removeObject(item);forEach(sortProperties,function(sortProperty){removeObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(array,idx,removedCount,addedCount)},contentArrayDidChange:function(array,idx,removedCount,addedCount){var isSorted=get(this,"isSorted"),sortProperties=get(this,"sortProperties");if(isSorted){var addedObjects=array.slice(idx,idx+addedCount);forEach(addedObjects,function(item){this.insertItemSorted(item);forEach(sortProperties,function(sortProperty){addObserver(item,sortProperty,this,"contentItemSortPropertyDidChange")},this)},this)}return this._super(array,idx,removedCount,addedCount)},insertItemSorted:function(item){var arrangedContent=get(this,"arrangedContent");var length=get(arrangedContent,"length");var idx=this._binarySearch(item,0,length);arrangedContent.insertAt(idx,item)},contentItemSortPropertyDidChange:function(item){var arrangedContent=get(this,"arrangedContent"),oldIndex=arrangedContent.indexOf(item),leftItem=arrangedContent.objectAt(oldIndex-1),rightItem=arrangedContent.objectAt(oldIndex+1),leftResult=leftItem&&this.orderBy(item,leftItem),rightResult=rightItem&&this.orderBy(item,rightItem);if(leftResult<0||rightResult>0){arrangedContent.removeObject(item);this.insertItemSorted(item)}},_binarySearch:function(item,low,high){var mid,midItem,res,arrangedContent;if(low===high){return low}arrangedContent=get(this,"arrangedContent");mid=low+Math.floor((high-low)/2);midItem=arrangedContent.objectAt(mid);res=this.orderBy(midItem,item);if(res<0){return this._binarySearch(item,mid+1,high)}else if(res>0){return this._binarySearch(item,low,mid)}return mid}})});define("ember-runtime/mixins/target_action_support",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/mixin","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var typeOf=__dependency4__.typeOf;var Mixin=__dependency5__.Mixin;var computed=__dependency6__.computed;var TargetActionSupport=Mixin.create({target:null,action:null,actionContext:null,targetObject:computed(function(){var target=get(this,"target");if(typeOf(target)==="string"){var value=get(this,target);if(value===undefined){value=get(Ember.lookup,target)}return value}else{return target}}).property("target"),actionContextObject:computed(function(){var actionContext=get(this,"actionContext");if(typeOf(actionContext)==="string"){var value=get(this,actionContext);if(value===undefined){value=get(Ember.lookup,actionContext)}return value}else{return actionContext}}).property("actionContext"),triggerAction:function(opts){opts=opts||{};var action=opts.action||get(this,"action"),target=opts.target||get(this,"targetObject"),actionContext=opts.actionContext;function args(options,actionName){var ret=[];if(actionName){ret.push(actionName)}return ret.concat(options)}if(typeof actionContext==="undefined"){actionContext=get(this,"actionContextObject")||this}if(target&&action){var ret;if(target.send){ret=target.send.apply(target,args(actionContext,action))}else{ret=target[action].apply(target,args(actionContext))}if(ret!==false)ret=true;return ret}else{return false}}});__exports__["default"]=TargetActionSupport});define("ember-runtime/system/application",["ember-runtime/system/namespace","exports"],function(__dependency1__,__exports__){"use strict";var Namespace=__dependency1__["default"];__exports__["default"]=Namespace.extend()});define("ember-runtime/system/array_proxy",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/computed","ember-metal/mixin","ember-metal/property_events","ember-metal/error","ember-runtime/system/object","ember-runtime/mixins/mutable_array","ember-runtime/mixins/enumerable","ember-runtime/system/string","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var isArray=__dependency4__.isArray;var apply=__dependency4__.apply;var computed=__dependency5__.computed;var beforeObserver=__dependency6__.beforeObserver;var observer=__dependency6__.observer;var beginPropertyChanges=__dependency7__.beginPropertyChanges;var endPropertyChanges=__dependency7__.endPropertyChanges;var EmberError=__dependency8__["default"];var EmberObject=__dependency9__["default"];var MutableArray=__dependency10__["default"];var Enumerable=__dependency11__["default"];var fmt=__dependency12__.fmt;var OUT_OF_RANGE_EXCEPTION="Index out of range";var EMPTY=[];var alias=computed.alias;var K=Ember.K;var ArrayProxy=EmberObject.extend(MutableArray,{content:null,arrangedContent:alias("content"),objectAtContent:function(idx){return get(this,"arrangedContent").objectAt(idx)},replaceContent:function(idx,amt,objects){get(this,"content").replace(idx,amt,objects)},_contentWillChange:beforeObserver("content",function(){this._teardownContent()}),_teardownContent:function(){var content=get(this,"content");if(content){content.removeArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})}},contentArrayWillChange:K,contentArrayDidChange:K,_contentDidChange:observer("content",function(){var content=get(this,"content");this._setupContent()}),_setupContent:function(){var content=get(this,"content");if(content){content.addArrayObserver(this,{willChange:"contentArrayWillChange",didChange:"contentArrayDidChange"})}},_arrangedContentWillChange:beforeObserver("arrangedContent",function(){var arrangedContent=get(this,"arrangedContent"),len=arrangedContent?get(arrangedContent,"length"):0;this.arrangedContentArrayWillChange(this,0,len,undefined);this.arrangedContentWillChange(this);this._teardownArrangedContent(arrangedContent)}),_arrangedContentDidChange:observer("arrangedContent",function(){var arrangedContent=get(this,"arrangedContent"),len=arrangedContent?get(arrangedContent,"length"):0;this._setupArrangedContent();this.arrangedContentDidChange(this);this.arrangedContentArrayDidChange(this,0,undefined,len)}),_setupArrangedContent:function(){var arrangedContent=get(this,"arrangedContent");if(arrangedContent){arrangedContent.addArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})}},_teardownArrangedContent:function(){var arrangedContent=get(this,"arrangedContent");if(arrangedContent){arrangedContent.removeArrayObserver(this,{willChange:"arrangedContentArrayWillChange",didChange:"arrangedContentArrayDidChange"})}},arrangedContentWillChange:K,arrangedContentDidChange:K,objectAt:function(idx){return get(this,"content")&&this.objectAtContent(idx)},length:computed(function(){var arrangedContent=get(this,"arrangedContent");return arrangedContent?get(arrangedContent,"length"):0}),_replace:function(idx,amt,objects){var content=get(this,"content");if(content)this.replaceContent(idx,amt,objects);return this},replace:function(){if(get(this,"arrangedContent")===get(this,"content")){apply(this,this._replace,arguments)}else{throw new EmberError("Using replace on an arranged ArrayProxy is not allowed.")}},_insertAt:function(idx,object){if(idx>get(this,"content.length"))throw new EmberError(OUT_OF_RANGE_EXCEPTION);this._replace(idx,0,[object]);return this},insertAt:function(idx,object){if(get(this,"arrangedContent")===get(this,"content")){return this._insertAt(idx,object)}else{throw new EmberError("Using insertAt on an arranged ArrayProxy is not allowed.")}},removeAt:function(start,len){if("number"===typeof start){var content=get(this,"content"),arrangedContent=get(this,"arrangedContent"),indices=[],i;if(start<0||start>=get(this,"length")){throw new EmberError(OUT_OF_RANGE_EXCEPTION)}if(len===undefined)len=1;for(i=start;i=0){var baseValue=this[keyName];if(baseValue){if("function"===typeof baseValue.concat){value=baseValue.concat(value)}else{value=makeArray(baseValue).concat(value)}}else{value=makeArray(value)}}if(desc){desc.set(this,keyName,value)}else{if(typeof this.setUnknownProperty==="function"&&!(keyName in this)){this.setUnknownProperty(keyName,value)}else if(MANDATORY_SETTER){defineProperty(this,keyName,null,value)}else{this[keyName]=value}}}}}finishPartial(this,m);var length=arguments.length;var args=new Array(length);for(var x=0;x";this.toString=makeToString(ret);return ret}});CoreObject.PrototypeMixin.ownerConstructor=CoreObject;function makeToString(ret){return function(){return ret}}if(Ember.config.overridePrototypeMixin){Ember.config.overridePrototypeMixin(CoreObject.PrototypeMixin)}CoreObject.__super__=null;var ClassMixin=Mixin.create({ClassMixin:required(),PrototypeMixin:required(),isClass:true,isMethod:false,extend:function(){var Class=makeCtor(),proto;Class.ClassMixin=Mixin.create(this.ClassMixin);Class.PrototypeMixin=Mixin.create(this.PrototypeMixin);Class.ClassMixin.ownerConstructor=Class;Class.PrototypeMixin.ownerConstructor=Class;reopen.apply(Class.PrototypeMixin,arguments);Class.superclass=this;Class.__super__=this.prototype;proto=Class.prototype=o_create(this.prototype);proto.constructor=Class;generateGuid(proto);meta(proto).proto=proto;Class.ClassMixin.apply(Class);return Class},createWithMixins:function(){var C=this;var l=arguments.length;if(l>0){var args=new Array(l);for(var i=0;i0){var args=new Array(l);for(var i=0;i0){for(var i=0;i0){for(var i=0;i=idx){var item=content.objectAt(loc);if(item){addBeforeObserver(item,keyName,proxy,"contentKeyWillChange");addObserver(item,keyName,proxy,"contentKeyDidChange");guid=guidFor(item);if(!objects[guid])objects[guid]=[];objects[guid].push(loc)}}}function removeObserverForContentKey(content,keyName,proxy,idx,loc){var objects=proxy._objects;if(!objects)objects=proxy._objects={};var indicies,guid;while(--loc>=idx){var item=content.objectAt(loc);if(item){removeBeforeObserver(item,keyName,proxy,"contentKeyWillChange");removeObserver(item,keyName,proxy,"contentKeyDidChange");guid=guidFor(item);indicies=objects[guid];indicies[indexOf.call(indicies,loc)]=null}}}var EachProxy=EmberObject.extend({init:function(content){this._super();this._content=content;content.addArrayObserver(this);forEach(watchedEvents(this),function(eventName){this.didAddListener(eventName)},this)},unknownProperty:function(keyName,value){var ret;ret=new EachArray(this._content,keyName,this);defineProperty(this,keyName,null,ret);this.beginObservingContentKey(keyName);return ret},arrayWillChange:function(content,idx,removedCnt,addedCnt){var keys=this._keys,key,lim;lim=removedCnt>0?idx+removedCnt:-1;beginPropertyChanges(this);for(key in keys){if(!keys.hasOwnProperty(key)){continue}if(lim>0){removeObserverForContentKey(content,key,this,idx,lim)}propertyWillChange(this,key)}propertyWillChange(this._content,"@each");endPropertyChanges(this)},arrayDidChange:function(content,idx,removedCnt,addedCnt){var keys=this._keys,lim;lim=addedCnt>0?idx+addedCnt:-1;changeProperties(function(){for(var key in keys){if(!keys.hasOwnProperty(key)){continue}if(lim>0){addObserverForContentKey(content,key,this,idx,lim)}propertyDidChange(this,key)}propertyDidChange(this._content,"@each")},this)},didAddListener:function(eventName){if(IS_OBSERVER.test(eventName)){this.beginObservingContentKey(eventName.slice(0,-7))}},didRemoveListener:function(eventName){if(IS_OBSERVER.test(eventName)){this.stopObservingContentKey(eventName.slice(0,-7))}},beginObservingContentKey:function(keyName){var keys=this._keys;if(!keys)keys=this._keys={};if(!keys[keyName]){keys[keyName]=1;var content=this._content,len=get(content,"length");addObserverForContentKey(content,keyName,this,0,len)}else{keys[keyName]++}},stopObservingContentKey:function(keyName){var keys=this._keys;if(keys&&keys[keyName]>0&&--keys[keyName]<=0){var content=this._content,len=get(content,"length");removeObserverForContentKey(content,keyName,this,0,len)}},contentKeyWillChange:function(obj,keyName){propertyWillChange(this,keyName)},contentKeyDidChange:function(obj,keyName){propertyDidChange(this,keyName)}});__exports__.EachArray=EachArray;__exports__.EachProxy=EachProxy});define("ember-runtime/system/lazy_load",["ember-metal/core","ember-metal/array","ember-runtime/system/native_array","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var forEach=__dependency2__.forEach;var loadHooks=Ember.ENV.EMBER_LOAD_HOOKS||{};var loaded={};function onLoad(name,callback){var object;loadHooks[name]=loadHooks[name]||Ember.A();loadHooks[name].pushObject(callback);if(object=loaded[name]){callback(object)}}__exports__.onLoad=onLoad;function runLoadHooks(name,object){loaded[name]=object;if(typeof window==="object"&&typeof window.dispatchEvent==="function"&&typeof CustomEvent==="function"){var event=new CustomEvent(name,{detail:object,name:name});window.dispatchEvent(event)}if(loadHooks[name]){forEach.call(loadHooks[name],function(callback){callback(object)})}}__exports__.runLoadHooks=runLoadHooks});define("ember-runtime/system/namespace",["ember-metal/core","ember-metal/property_get","ember-metal/array","ember-metal/utils","ember-metal/mixin","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var indexOf=__dependency3__.indexOf;var GUID_KEY=__dependency4__.GUID_KEY;var guidFor=__dependency4__.guidFor;var Mixin=__dependency5__.Mixin;var EmberObject=__dependency6__["default"];var Namespace=EmberObject.extend({isNamespace:true,init:function(){Namespace.NAMESPACES.push(this);Namespace.PROCESSED=false},toString:function(){var name=get(this,"name");if(name){return name}findNamespaces();return this[NAME_KEY]},nameClasses:function(){processNamespace([this.toString()],this,{})},destroy:function(){var namespaces=Namespace.NAMESPACES,toString=this.toString();if(toString){Ember.lookup[toString]=undefined;delete Namespace.NAMESPACES_BY_ID[toString]}namespaces.splice(indexOf.call(namespaces,this),1);this._super()}});Namespace.reopenClass({NAMESPACES:[Ember],NAMESPACES_BY_ID:{},PROCESSED:false,processAll:processAllNamespaces,byName:function(name){if(!Ember.BOOTED){processAllNamespaces()}return NAMESPACES_BY_ID[name]}});var NAMESPACES_BY_ID=Namespace.NAMESPACES_BY_ID;var hasOwnProp={}.hasOwnProperty;function processNamespace(paths,root,seen){var idx=paths.length;NAMESPACES_BY_ID[paths.join(".")]=root;for(var key in root){if(!hasOwnProp.call(root,key)){continue}var obj=root[key];paths[idx]=key;if(obj&&obj.toString===classToString){obj.toString=makeToString(paths.join("."));obj[NAME_KEY]=paths.join(".")}else if(obj&&obj.isNamespace){if(seen[guidFor(obj)]){continue}seen[guidFor(obj)]=true;processNamespace(paths,obj,seen)}}paths.length=idx}var STARTS_WITH_UPPERCASE=/^[A-Z]/;function tryIsNamespace(lookup,prop){try{var obj=lookup[prop];return obj&&obj.isNamespace&&obj}catch(e){}}function findNamespaces(){var lookup=Ember.lookup,obj,isNamespace;if(Namespace.PROCESSED){return}for(var prop in lookup){if(!STARTS_WITH_UPPERCASE.test(prop)){continue +}if(lookup.hasOwnProperty&&!lookup.hasOwnProperty(prop)){continue}obj=tryIsNamespace(lookup,prop);if(obj){obj[NAME_KEY]=prop}}}var NAME_KEY=Ember.NAME_KEY=GUID_KEY+"_name";function superClassString(mixin){var superclass=mixin.superclass;if(superclass){if(superclass[NAME_KEY]){return superclass[NAME_KEY]}else{return superClassString(superclass)}}else{return}}function classToString(){if(!Ember.BOOTED&&!this[NAME_KEY]){processAllNamespaces()}var ret;if(this[NAME_KEY]){ret=this[NAME_KEY]}else if(this._toString){ret=this._toString}else{var str=superClassString(this);if(str){ret="(subclass of "+str+")"}else{ret="(unknown mixin)"}this.toString=makeToString(ret)}return ret}function processAllNamespaces(){var unprocessedNamespaces=!Namespace.PROCESSED,unprocessedMixins=Ember.anyUnprocessedMixins;if(unprocessedNamespaces){findNamespaces();Namespace.PROCESSED=true}if(unprocessedNamespaces||unprocessedMixins){var namespaces=Namespace.NAMESPACES,namespace;for(var i=0,l=namespaces.length;i0){NativeArray=NativeArray.without.apply(NativeArray,ignore)}var A=function(arr){if(arr===undefined){arr=[]}return EmberArray.detect(arr)?arr:NativeArray.apply(arr)};NativeArray.activate=function(){NativeArray.apply(Array.prototype);A=function(arr){return arr||[]}};if(Ember.EXTEND_PROTOTYPES===true||Ember.EXTEND_PROTOTYPES.Array){NativeArray.activate()}Ember.A=A;__exports__.A=A;__exports__.NativeArray=NativeArray;__exports__["default"]=NativeArray});define("ember-runtime/system/object",["ember-runtime/system/core_object","ember-runtime/mixins/observable","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var CoreObject=__dependency1__["default"];var Observable=__dependency2__["default"];var EmberObject=CoreObject.extend(Observable);EmberObject.toString=function(){return"Ember.Object"};__exports__["default"]=EmberObject});define("ember-runtime/system/object_proxy",["ember-runtime/system/object","ember-runtime/mixins/proxy","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var EmberObject=__dependency1__["default"];var ProxyMixin=__dependency2__["default"];__exports__["default"]=EmberObject.extend(ProxyMixin)});define("ember-runtime/system/set",["ember-metal/core","ember-metal/property_get","ember-metal/property_set","ember-metal/utils","ember-metal/is_none","ember-runtime/system/string","ember-runtime/system/core_object","ember-runtime/mixins/mutable_enumerable","ember-runtime/mixins/enumerable","ember-runtime/mixins/copyable","ember-runtime/mixins/freezable","ember-metal/error","ember-metal/property_events","ember-metal/mixin","ember-metal/computed","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__dependency13__,__dependency14__,__dependency15__,__exports__){"use strict";var Ember=__dependency1__["default"];var get=__dependency2__.get;var set=__dependency3__.set;var guidFor=__dependency4__.guidFor;var isNone=__dependency5__.isNone;var fmt=__dependency6__.fmt;var CoreObject=__dependency7__["default"];var MutableEnumerable=__dependency8__["default"];var Enumerable=__dependency9__["default"];var Copyable=__dependency10__["default"];var Freezable=__dependency11__.Freezable;var FROZEN_ERROR=__dependency11__.FROZEN_ERROR;var EmberError=__dependency12__["default"];var propertyWillChange=__dependency13__.propertyWillChange;var propertyDidChange=__dependency13__.propertyDidChange;var aliasMethod=__dependency14__.aliasMethod;var computed=__dependency15__.computed;__exports__["default"]=CoreObject.extend(MutableEnumerable,Copyable,Freezable,{length:0,clear:function(){if(this.isFrozen){throw new EmberError(FROZEN_ERROR)}var len=get(this,"length");if(len===0){return this}var guid;this.enumerableContentWillChange(len,0);propertyWillChange(this,"firstObject");propertyWillChange(this,"lastObject");for(var i=0;i=0){if(!obj.contains(this[loc]))return false}return true},add:aliasMethod("addObject"),remove:aliasMethod("removeObject"),pop:function(){if(get(this,"isFrozen"))throw new EmberError(FROZEN_ERROR);var obj=this.length>0?this[this.length-1]:null;this.remove(obj);return obj},push:aliasMethod("addObject"),shift:aliasMethod("pop"),unshift:aliasMethod("push"),addEach:aliasMethod("addObjects"),removeEach:aliasMethod("removeObjects"),init:function(items){this._super();if(items)this.addObjects(items)},nextObject:function(idx){return this[idx]},firstObject:computed(function(){return this.length>0?this[0]:undefined}),lastObject:computed(function(){return this.length>0?this[this.length-1]:undefined}),addObject:function(obj){if(get(this,"isFrozen"))throw new EmberError(FROZEN_ERROR);if(isNone(obj))return this;var guid=guidFor(obj),idx=this[guid],len=get(this,"length"),added;if(idx>=0&&idx=0&&idx=0},copy:function(){var C=this.constructor,ret=new C,loc=get(this,"length");set(ret,"length",loc);while(--loc>=0){ret[loc]=this[loc];ret[guidFor(this[loc])]=loc}return ret},toString:function(){var len=this.length,idx,array=[];for(idx=0;idx",[array.join(",")])}})});define("ember-runtime/system/string",["ember-metal/core","ember-metal/utils","ember-metal/cache","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var isArray=__dependency2__.isArray;var emberInspect=__dependency2__.inspect;var Cache=__dependency3__["default"];var STRING_DASHERIZE_REGEXP=/[ _]/g;var STRING_DASHERIZE_CACHE=new Cache(1e3,function(key){return decamelize(key).replace(STRING_DASHERIZE_REGEXP,"-")});var CAMELIZE_CACHE=new Cache(1e3,function(key){return key.replace(STRING_CAMELIZE_REGEXP,function(match,separator,chr){return chr?chr.toUpperCase():""}).replace(/^([A-Z])/,function(match,separator,chr){return match.toLowerCase()})});var CLASSIFY_CACHE=new Cache(1e3,function(str){var parts=str.split("."),out=[];for(var i=0,l=parts.length;i2){formats=Array.prototype.slice.call(arguments,1)}var idx=0;return str.replace(/%@([0-9]+)?/g,function(s,argIndex){argIndex=argIndex?parseInt(argIndex,10)-1:idx++;s=formats[argIndex];return s===null?"(null)":s===undefined?"":emberInspect(s)})}function loc(str,formats){if(!isArray(formats)||arguments.length>2){formats=Array.prototype.slice.call(arguments,1)}str=Ember.STRINGS[str]||str;return fmt(str,formats)}function w(str){return str.split(/\s+/)}function decamelize(str){return DECAMELIZE_CACHE.get(str)}function dasherize(str){return STRING_DASHERIZE_CACHE.get(str)}function camelize(str){return CAMELIZE_CACHE.get(str)}function classify(str){return CLASSIFY_CACHE.get(str)}function underscore(str){return UNDERSCORE_CACHE.get(str)}function capitalize(str){return CAPITALIZE_CACHE.get(str)}Ember.STRINGS={};__exports__["default"]={fmt:fmt,loc:loc,w:w,decamelize:decamelize,dasherize:dasherize,camelize:camelize,classify:classify,underscore:underscore,capitalize:capitalize};__exports__.fmt=fmt;__exports__.loc=loc;__exports__.w=w;__exports__.decamelize=decamelize;__exports__.dasherize=dasherize;__exports__.camelize=camelize;__exports__.classify=classify;__exports__.underscore=underscore;__exports__.capitalize=capitalize});define("ember-runtime/system/subarray",["ember-metal/property_get","ember-metal/error","ember-metal/enumerable_utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var get=__dependency1__.get;var EmberError=__dependency2__["default"];var EnumerableUtils=__dependency3__["default"];var RETAIN="r";var FILTER="f";function Operation(type,count){this.type=type;this.count=count}__exports__["default"]=SubArray;function SubArray(length){if(arguments.length<1){length=0}if(length>0){this._operations=[new Operation(RETAIN,length)]}else{this._operations=[]}}SubArray.prototype={addItem:function(index,match){var returnValue=-1,itemType=match?RETAIN:FILTER,self=this;this._findOperation(index,function(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray){var newOperation,splitOperation;if(itemType===operation.type){++operation.count}else if(index===rangeStart){self._operations.splice(operationIndex,0,new Operation(itemType,1))}else{newOperation=new Operation(itemType,1);splitOperation=new Operation(operation.type,rangeEnd-index+1);operation.count=index-rangeStart;self._operations.splice(operationIndex+1,0,newOperation,splitOperation)}if(match){if(operation.type===RETAIN){returnValue=seenInSubArray+(index-rangeStart)}else{returnValue=seenInSubArray}}self._composeAt(operationIndex)},function(seenInSubArray){self._operations.push(new Operation(itemType,1));if(match){returnValue=seenInSubArray}self._composeAt(self._operations.length-1)});return returnValue},removeItem:function(index){var returnValue=-1,self=this;this._findOperation(index,function(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray){if(operation.type===RETAIN){returnValue=seenInSubArray+(index-rangeStart)}if(operation.count>1){--operation.count}else{self._operations.splice(operationIndex,1);self._composeAt(operationIndex)}},function(){throw new EmberError("Can't remove an item that has never been added.")});return returnValue},_findOperation:function(index,foundCallback,notFoundCallback){var operationIndex,len,operation,rangeStart,rangeEnd,seenInSubArray=0;for(operationIndex=rangeStart=0,len=this._operations.length;operationIndex=rangeStart&&index<=rangeEnd){foundCallback(operation,operationIndex,rangeStart,rangeEnd,seenInSubArray);return}else if(operation.type===RETAIN){seenInSubArray+=operation.count}}notFoundCallback(seenInSubArray)},_composeAt:function(index){var op=this._operations[index],otherOp;if(!op){return}if(index>0){otherOp=this._operations[index-1];if(otherOp.type===op.type){op.count+=otherOp.count;this._operations.splice(index-1,1);--index}}if(indexarrayOperationRangeStart&&index<=arrayOperationRangeEnd){split=true;break}else{arrayOperationRangeStart=arrayOperationRangeEnd+1}}return new ArrayOperationMatch(arrayOperation,arrayOperationIndex,split,arrayOperationRangeStart)},_split:function(arrayOperationIndex,splitIndex,newArrayOperation){var arrayOperation=this._operations[arrayOperationIndex];var splitItems=arrayOperation.items.slice(splitIndex);var splitArrayOperation=new ArrayOperation(arrayOperation.type,splitItems.length,splitItems);arrayOperation.count=splitIndex;arrayOperation.items=arrayOperation.items.slice(0,splitIndex);this._operations.splice(arrayOperationIndex+1,0,newArrayOperation,splitArrayOperation)},_composeInsert:function(index){var newArrayOperation=this._operations[index],leftArrayOperation=this._operations[index-1],rightArrayOperation=this._operations[index+1],leftOp=leftArrayOperation&&leftArrayOperation.type,rightOp=rightArrayOperation&&rightArrayOperation.type;if(leftOp===INSERT){leftArrayOperation.count+=newArrayOperation.count;leftArrayOperation.items=leftArrayOperation.items.concat(newArrayOperation.items);if(rightOp===INSERT){leftArrayOperation.count+=rightArrayOperation.count;leftArrayOperation.items=leftArrayOperation.items.concat(rightArrayOperation.items);this._operations.splice(index,2)}else{this._operations.splice(index,1)}}else if(rightOp===INSERT){newArrayOperation.count+=rightArrayOperation.count;newArrayOperation.items=newArrayOperation.items.concat(rightArrayOperation.items);this._operations.splice(index+1,1)}},_composeDelete:function(index){var arrayOperation=this._operations[index],deletesToGo=arrayOperation.count,leftArrayOperation=this._operations[index-1],leftOp=leftArrayOperation&&leftArrayOperation.type,nextArrayOperation,nextOp,nextCount,removeNewAndNextOp=false,removedItems=[];if(leftOp===DELETE){arrayOperation=leftArrayOperation;index-=1}for(var i=index+1;deletesToGo>0;++i){nextArrayOperation=this._operations[i];nextOp=nextArrayOperation.type;nextCount=nextArrayOperation.count;if(nextOp===DELETE){arrayOperation.count+=nextCount;continue}if(nextCount>deletesToGo){removedItems=removedItems.concat(nextArrayOperation.items.splice(0,deletesToGo));nextArrayOperation.count-=deletesToGo;i-=1;nextCount=deletesToGo;deletesToGo=0}else{if(nextCount===deletesToGo){removeNewAndNextOp=true}removedItems=removedItems.concat(nextArrayOperation.items);deletesToGo-=nextCount}if(nextOp===INSERT){arrayOperation.count-=nextCount}}if(arrayOperation.count>0){this._operations.splice(index+1,i-1-index)}else{this._operations.splice(index,removeNewAndNextOp?2:1)}return removedItems},toString:function(){var str="";forEach(this._operations,function(operation){str+=" "+operation.type+":"+operation.count});return str.substring(1)}};function ArrayOperation(operation,count,items){this.type=operation;this.count=count;this.items=items}function ArrayOperationMatch(operation,index,split,rangeStart){this.operation=operation;this.index=index;this.split=split;this.rangeStart=rangeStart}});define("ember-testing",["ember-metal/core","ember-testing/initializers","ember-testing/support","ember-testing/setup_for_testing","ember-testing/test","ember-testing/adapters/adapter","ember-testing/adapters/qunit","ember-testing/helpers"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__){"use strict";var Ember=__dependency1__["default"];var setupForTesting=__dependency4__["default"];var Test=__dependency5__["default"];var Adapter=__dependency6__["default"];var QUnitAdapter=__dependency7__["default"];Ember.Test=Test;Ember.Test.Adapter=Adapter;Ember.Test.QUnitAdapter=QUnitAdapter;Ember.setupForTesting=setupForTesting});define("ember-testing/adapters/adapter",["ember-metal/core","ember-metal/utils","ember-runtime/system/object","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var inspect=__dependency2__.inspect;var EmberObject=__dependency3__["default"];var Adapter=EmberObject.extend({asyncStart:Ember.K,asyncEnd:Ember.K,exception:function(error){throw error}});__exports__["default"]=Adapter});define("ember-testing/adapters/qunit",["ember-testing/adapters/adapter","ember-metal/utils","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Adapter=__dependency1__["default"];var inspect=__dependency2__.inspect;__exports__["default"]=Adapter.extend({asyncStart:function(){QUnit.stop()},asyncEnd:function(){QUnit.start()},exception:function(error){ok(false,inspect(error))}})});define("ember-testing/helpers",["ember-metal/property_get","ember-metal/error","ember-metal/run_loop","ember-views/system/jquery","ember-testing/test"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__){"use strict";var get=__dependency1__.get;var EmberError=__dependency2__["default"];var run=__dependency3__["default"];var jQuery=__dependency4__["default"];var Test=__dependency5__["default"];var helper=Test.registerHelper;var asyncHelper=Test.registerAsyncHelper;var countAsync=0;function currentRouteName(app){var appController=app.__container__.lookup("controller:application");return get(appController,"currentRouteName")}function currentPath(app){var appController=app.__container__.lookup("controller:application");return get(appController,"currentPath")}function currentURL(app){var router=app.__container__.lookup("router:main");return get(router,"location").getURL()}function visit(app,url){var router=app.__container__.lookup("router:main");router.location.setURL(url);if(app._readinessDeferrals>0){router["initialURL"]=url;run(app,"advanceReadiness");delete router["initialURL"]}else{run(app,app.handleURL,url)}return app.testHelpers.wait()}function click(app,selector,context){var $el=app.testHelpers.findWithAssert(selector,context);run($el,"mousedown");if($el.is(":input")){var type=$el.prop("type");if(type!=="checkbox"&&type!=="radio"&&type!=="hidden"){run($el,function(){if(!document.hasFocus||document.hasFocus()){this.focus()}else{this.trigger("focusin")}})}}run($el,"mouseup");run($el,"click");return app.testHelpers.wait()}function triggerEvent(app,selector,contextOrType,typeOrOptions,possibleOptions){var arity=arguments.length;var context,type,options;if(arity===3){context=null;type=contextOrType;options={}}else if(arity===4){if(typeof typeOrOptions==="object"){context=null;type=contextOrType;options=typeOrOptions}else{context=contextOrType;type=typeOrOptions;options={}}}else{context=contextOrType;type=typeOrOptions;options=possibleOptions}var $el=app.testHelpers.findWithAssert(selector,context);var event=jQuery.Event(type,options);run($el,"trigger",event);return app.testHelpers.wait()}function keyEvent(app,selector,contextOrType,typeOrKeyCode,keyCode){var context,type;if(typeof keyCode==="undefined"){context=null;keyCode=typeOrKeyCode;type=contextOrType}else{context=contextOrType;type=typeOrKeyCode}return app.testHelpers.triggerEvent(selector,context,type,{keyCode:keyCode,which:keyCode})}function fillIn(app,selector,contextOrText,text){var $el,context;if(typeof text==="undefined"){text=contextOrText}$el=app.testHelpers.findWithAssert(selector,context);run(function(){$el.val(text).change()});return app.testHelpers.wait()}function findWithAssert(app,selector,context){var $el=app.testHelpers.find(selector,context);if($el.length===0){throw new EmberError("Element "+selector+" not found.")}return $el}function find(app,selector,context){var $el;context=context||get(app,"rootElement");$el=app.$(selector,context);return $el}function andThen(app,callback){return app.testHelpers.wait(callback(app))}function wait(app,value){return Test.promise(function(resolve){if(++countAsync===1){Test.adapter.asyncStart()}var watcher=setInterval(function(){var routerIsLoading=!!app.__container__.lookup("router:main").router.activeTransition;if(routerIsLoading){return}if(Test.pendingAjaxRequests){return}if(run.hasScheduledTimers()||run.currentRunLoop){return}if(Test.waiters&&Test.waiters.any(function(waiter){var context=waiter[0];var callback=waiter[1];return!callback.call(context)})){return}clearInterval(watcher);if(--countAsync===0){Test.adapter.asyncEnd()}run(null,resolve,value)},10)})}asyncHelper("visit",visit);asyncHelper("click",click);asyncHelper("keyEvent",keyEvent);asyncHelper("fillIn",fillIn);helper("find",find);helper("findWithAssert",findWithAssert);asyncHelper("wait",wait);asyncHelper("andThen",andThen);helper("currentRouteName",currentRouteName);helper("currentPath",currentPath);helper("currentURL",currentURL);asyncHelper("triggerEvent",triggerEvent)});define("ember-testing/initializers",["ember-runtime/system/lazy_load"],function(__dependency1__){"use strict";var onLoad=__dependency1__.onLoad;var name="deferReadiness in `testing` mode";onLoad("Ember.Application",function(Application){if(!Application.initializers[name]){Application.initializer({name:name,initialize:function(container,application){if(application.testing){application.deferReadiness()}}})}})});define("ember-testing/setup_for_testing",["ember-metal/core","ember-testing/adapters/qunit","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Ember=__dependency1__["default"];var QUnitAdapter=__dependency2__["default"];var jQuery=__dependency3__["default"];var Test,requests;function incrementAjaxPendingRequests(_,xhr){requests.push(xhr);Test.pendingAjaxRequests=requests.length}function decrementAjaxPendingRequests(_,xhr){for(var i=0;i').css({position:"absolute",left:"-1000px",top:"-1000px"}).appendTo("body").on("click",handler).trigger("click").remove()}$(function(){testCheckboxClick(function(){if(!this.checked&&!$.event.special.click){$.event.special.click={trigger:function(){if($.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}}}}});testCheckboxClick(function(){})})});define("ember-testing/test",["ember-metal/core","ember-metal/run_loop","ember-metal/platform","ember-runtime/compare","ember-runtime/ext/rsvp","ember-testing/setup_for_testing","ember-application/system/application","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__exports__){"use strict";var Ember=__dependency1__["default"];var emberRun=__dependency2__["default"];var create=__dependency3__.create;var compare=__dependency4__["default"];var RSVP=__dependency5__["default"];var setupForTesting=__dependency6__["default"];var EmberApplication=__dependency7__["default"];var slice=[].slice;var helpers={};var injectHelpersCallbacks=[];var Test={_helpers:helpers,registerHelper:function(name,helperMethod){helpers[name]={method:helperMethod,meta:{wait:false}}},registerAsyncHelper:function(name,helperMethod){helpers[name]={method:helperMethod,meta:{wait:true}}},unregisterHelper:function(name){delete helpers[name];delete Test.Promise.prototype[name]},onInjectHelpers:function(callback){injectHelpersCallbacks.push(callback)},promise:function(resolver){return new Test.Promise(resolver)},adapter:null,resolve:function(val){return Test.promise(function(resolve){return resolve(val)})},registerWaiter:function(context,callback){if(arguments.length===1){callback=context;context=null}if(!this.waiters){this.waiters=Ember.A()}this.waiters.push([context,callback])},unregisterWaiter:function(context,callback){var pair;if(!this.waiters){return}if(arguments.length===1){callback=context;context=null}pair=[context,callback];this.waiters=Ember.A(this.waiters.filter(function(elt){return compare(elt,pair)!==0}))}};function helper(app,name){var fn=helpers[name].method,meta=helpers[name].meta;return function(){var args=slice.call(arguments),lastPromise=Test.lastPromise;args.unshift(app);if(!meta.wait){return fn.apply(app,args)}if(!lastPromise){lastPromise=fn.apply(app,args)}else{run(function(){lastPromise=Test.resolve(lastPromise).then(function(){return fn.apply(app,args)})})}return lastPromise}}function run(fn){if(!emberRun.currentRunLoop){emberRun(fn)}else{fn()}}EmberApplication.reopen({testHelpers:{},originalMethods:{},testing:false,setupForTesting:function(){setupForTesting();this.testing=true;this.Router.reopen({location:"none"})},helperContainer:window,injectTestHelpers:function(helperContainer){if(helperContainer){this.helperContainer=helperContainer}this.testHelpers={};for(var name in helpers){this.originalMethods[name]=this.helperContainer[name];this.testHelpers[name]=this.helperContainer[name]=helper(this,name);protoWrap(Test.Promise.prototype,name,helper(this,name),helpers[name].meta.wait)}for(var i=0,l=injectHelpersCallbacks.length;i"'`]/g;var POSSIBLE_CHARS_REGEXP=/[&<>"'`]/;function escapeAttribute(value){var escape={"<":"<",">":">",'"':""","'":"'","`":"`"};var escapeChar=function(chr){return escape[chr]||"&"};var string=value.toString();if(!POSSIBLE_CHARS_REGEXP.test(string)){return string}return string.replace(BAD_CHARS_REGEXP,escapeChar)}var canSetNameOnInputs=function(){var div=document.createElement("div"),el=document.createElement("input");el.setAttribute("name","foo");div.appendChild(el);return!!div.innerHTML.match("foo")}();__exports__["default"]=function RenderBuffer(tagName){return new _RenderBuffer(tagName)};function _RenderBuffer(tagName){this.tagNames=[tagName||null];this.buffer=""}_RenderBuffer.prototype={_element:null,_hasElement:true,elementClasses:null,classes:null,elementId:null,elementAttributes:null,elementProperties:null,elementTag:null,elementStyle:null,push:function(string){this.buffer+=string;return this},addClass:function(className){this.elementClasses=this.elementClasses||new ClassSet;this.elementClasses.add(className);this.classes=this.elementClasses.list;return this},setClasses:function(classNames){this.elementClasses=null;var len=classNames.length,i;for(i=0;i";this.buffer=buffer},pushClosingTag:function(){var tagName=this.tagNames.pop();if(tagName){this.buffer+=""}},currentTagName:function(){return this.tagNames[this.tagNames.length-1]},generateElement:function(){var tagName=this.tagNames.pop(),id=this.elementId,classes=this.classes,attrs=this.elementAttributes,props=this.elementProperties,style=this.elementStyle,styleBuffer="",attr,prop,tagString;if(attrs&&attrs.name&&!canSetNameOnInputs){tagString="<"+stripTagName(tagName)+' name="'+escapeAttribute(attrs.name)+'">'}else{tagString=tagName}var element=document.createElement(tagString),$element=jQuery(element);if(id){$element.attr("id",id);this.elementId=null}if(classes){$element.attr("class",classes.join(" "));this.classes=null;this.elementClasses=null}if(style){for(prop in style){if(style.hasOwnProperty(prop)){styleBuffer+=prop+":"+style[prop]+";"}}$element.attr("style",styleBuffer);this.elementStyle=null}if(attrs){for(attr in attrs){if(attrs.hasOwnProperty(attr)){$element.attr(attr,attrs[attr])}}this.elementAttributes=null}if(props){for(prop in props){if(props.hasOwnProperty(prop)){$element.prop(prop,props[prop])}}this.elementProperties=null}return element},element:function(){var html=this.innerString();if(html){this._element=setInnerHTML(this._element,html)}return this._element},string:function(){if(this._hasElement&&this._element){var thisElement=this.element(),outerHTML=thisElement.outerHTML;if(typeof outerHTML==="undefined"){return jQuery("
    ").append(thisElement).html()}return outerHTML}else{return this.innerString()}},innerString:function(){return this.buffer}}});define("ember-views/system/utils",["ember-metal/core","ember-views/system/jquery","exports"],function(__dependency1__,__dependency2__,__exports__){"use strict";var Ember=__dependency1__["default"];var jQuery=__dependency2__["default"];var needsShy=typeof document!=="undefined"&&function(){var testEl=document.createElement("div");testEl.innerHTML="
    ";testEl.firstChild.innerHTML="";return testEl.firstChild.innerHTML===""}();var movesWhitespace=typeof document!=="undefined"&&function(){var testEl=document.createElement("div");testEl.innerHTML="Test: Value";return testEl.childNodes[0].nodeValue==="Test:"&&testEl.childNodes[2].nodeValue===" Value"}();var findChildById=function(element,id){if(element.getAttribute("id")===id){return element}var len=element.childNodes.length,idx,node,found;for(idx=0;idx0){var len=matches.length,idx;for(idx=0;idxContent");return el.firstChild instanceof ChildConstructor}}var innerHTMLTags={select:function(){var el=document.createElement("select");setInnerHTMLWithoutFix(el,'');return el.options.length===1},col:setInnerHTMLTestFactory("col","span",window.HTMLSpanElement),colgroup:setInnerHTMLTestFactory("colgroup","col",window.HTMLTableColElement),frameset:setInnerHTMLTestFactory("frameset","frame",window.HTMLFrameElement),table:setInnerHTMLTestFactory("table","tbody",window.HTMLTableSectionElement),tbody:setInnerHTMLTestFactory("tbody","tr",window.HTMLTableRowElement),tfoot:setInnerHTMLTestFactory("tfoot","tr",window.HTMLTableRowElement),thead:setInnerHTMLTestFactory("thead","tr",window.HTMLTableRowElement),tr:setInnerHTMLTestFactory("tr","td",window.HTMLTableCellElement)};var canSetInnerHTML=function(tagName){tagName=tagName.toLowerCase();var canSet=innerHTMLTags[tagName];if(typeof canSet==="function"){canSet=innerHTMLTags[tagName]=canSet()}return canSet===undefined?true:canSet};function setInnerHTML(element,html){var tagName=element.tagName;if(canSetInnerHTML(tagName)){setInnerHTMLWithoutFix(element,html)}else{var outerHTML=element.outerHTML||(new XMLSerializer).serializeToString(element);var startTag=outerHTML.match(new RegExp("<"+tagName+"([^>]*)>","i"))[0],endTag="";var wrapper=document.createElement("div");jQuery(startTag+html+endTag).appendTo(wrapper);element=wrapper.firstChild;while(element.tagName!==tagName){element=element.nextSibling}}return element}__exports__.setInnerHTML=setInnerHTML;function isSimpleClick(event){var modifier=event.shiftKey||event.metaKey||event.altKey||event.ctrlKey,secondaryClick=event.which>1;return!modifier&&!secondaryClick}__exports__.isSimpleClick=isSimpleClick});define("ember-views/views/collection_view",["ember-metal/core","ember-metal/platform","ember-metal/binding","ember-metal/merge","ember-metal/property_get","ember-metal/property_set","ember-runtime/system/string","ember-views/views/container_view","ember-views/views/core_view","ember-views/views/view","ember-metal/mixin","ember-runtime/mixins/array","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__dependency5__,__dependency6__,__dependency7__,__dependency8__,__dependency9__,__dependency10__,__dependency11__,__dependency12__,__exports__){"use strict";var Ember=__dependency1__["default"];var create=__dependency2__.create;var isGlobalPath=__dependency3__.isGlobalPath;var merge=__dependency4__["default"];var get=__dependency5__.get;var set=__dependency6__.set;var fmt=__dependency7__.fmt;var ContainerView=__dependency8__["default"];var CoreView=__dependency9__["default"];var View=__dependency10__["default"];var observer=__dependency11__.observer;var beforeObserver=__dependency11__.beforeObserver;var EmberArray=__dependency12__["default"];var CollectionView=ContainerView.extend({content:null,emptyViewClass:View,emptyView:null,itemViewClass:View,init:function(){var ret=this._super();this._contentDidChange();return ret},_contentWillChange:beforeObserver("content",function(){var content=this.get("content");if(content){content.removeArrayObserver(this)}var len=content?get(content,"length"):0;this.arrayWillChange(content,0,len)}),_contentDidChange:observer("content",function(){var content=get(this,"content");if(content){this._assertArrayLike(content);content.addArrayObserver(this)}var len=content?get(content,"length"):0;this.arrayDidChange(content,0,null,len)}),_assertArrayLike:function(content){},destroy:function(){if(!this._super()){return}var content=get(this,"content");if(content){content.removeArrayObserver(this)}if(this._createdEmptyView){this._createdEmptyView.destroy()}return this},arrayWillChange:function(content,start,removedCount){var emptyView=get(this,"emptyView");if(emptyView&&emptyView instanceof View){emptyView.removeFromParent()}var childViews=this._childViews,childView,idx,len;len=this._childViews.length;var removingAll=removedCount===len;if(removingAll){this.currentState.empty(this);this.invokeRecursively(function(view){view.removedFromDOM=true},false)}for(idx=start+removedCount-1;idx>=start;idx--){childView=childViews[idx];childView.destroy()}},arrayDidChange:function(content,start,removed,added){var addedViews=[],view,item,idx,len,itemViewClass,emptyView;len=content?get(content,"length"):0;if(len){itemViewClass=get(this,"itemViewClass");if("string"===typeof itemViewClass&&isGlobalPath(itemViewClass)){itemViewClass=get(itemViewClass)||itemViewClass}for(idx=start;idx0){var changedViews=views.slice(start,start+removed);this.currentState.childViewsWillChange(this,views,start,removed);this.initializeViews(changedViews,null,null)}},removeChild:function(child){this.removeObject(child);return this},childViewsDidChange:function(views,start,removed,added){if(added>0){var changedViews=views.slice(start,start+added);this.initializeViews(changedViews,this,get(this,"templateData"));this.currentState.childViewsDidChange(this,views,start,added)}this.propertyDidChange("childViews")},initializeViews:function(views,parentView,templateData){forEach(views,function(view){set(view,"_parentView",parentView);if(!view.container&&parentView){set(view,"container",parentView.container)}if(!get(view,"templateData")){set(view,"templateData",templateData)}})},currentView:null,_currentViewWillChange:beforeObserver("currentView",function(){var currentView=get(this,"currentView");if(currentView){currentView.destroy()}}),_currentViewDidChange:observer("currentView",function(){var currentView=get(this,"currentView");if(currentView){this.pushObject(currentView)}}),_ensureChildrenAreInDOM:function(){this.currentState.ensureChildrenAreInDOM(this)}});merge(states._default,{childViewsWillChange:Ember.K,childViewsDidChange:Ember.K,ensureChildrenAreInDOM:Ember.K});merge(states.inBuffer,{childViewsDidChange:function(parentView,views,start,added){throw new EmberError("You cannot modify child views while in the inBuffer state")}});merge(states.hasElement,{childViewsWillChange:function(view,views,start,removed){for(var i=start;i=lengthBefore;i--){if(childViews[i]){childViews[i].destroy()}}},_applyClassNameBindings:function(classBindings){var classNames=this.classNames,elem,newClass,dasherizedClass;forEach(classBindings,function(binding){var oldClass;var parsedPath=View._parsePropertyPath(binding);var observer=function(){newClass=this._classStringForProperty(binding);elem=this.$();if(oldClass){elem.removeClass(oldClass);classNames.removeObject(oldClass)}if(newClass){elem.addClass(newClass);oldClass=newClass}else{oldClass=null}};dasherizedClass=this._classStringForProperty(binding);if(dasherizedClass){addObject(classNames,dasherizedClass);oldClass=dasherizedClass}this.registerObserver(this,parsedPath.path,observer);this.one("willClearRender",function(){if(oldClass){classNames.removeObject(oldClass);oldClass=null}})},this)},_unspecifiedAttributeBindings:null,_applyAttributeBindings:function(buffer,attributeBindings){var attributeValue,unspecifiedAttributeBindings=this._unspecifiedAttributeBindings=this._unspecifiedAttributeBindings||{};forEach(attributeBindings,function(binding){var split=binding.split(":"),property=split[0],attributeName=split[1]||property;if(property in this){this._setupAttributeBindingObservation(property,attributeName);attributeValue=get(this,property);View.applyAttributeBindings(buffer,attributeName,attributeValue)}else{unspecifiedAttributeBindings[property]=attributeName}},this);this.setUnknownProperty=this._setUnknownProperty},_setupAttributeBindingObservation:function(property,attributeName){var attributeValue,elem;var observer=function(){elem=this.$();attributeValue=get(this,property);View.applyAttributeBindings(elem,attributeName,attributeValue)};this.registerObserver(this,property,observer)},setUnknownProperty:null,_setUnknownProperty:function(key,value){var attributeName=this._unspecifiedAttributeBindings&&this._unspecifiedAttributeBindings[key];if(attributeName){this._setupAttributeBindingObservation(key,attributeName)}defineProperty(this,key);return set(this,key,value)},_classStringForProperty:function(property){var parsedPath=View._parsePropertyPath(property);var path=parsedPath.path;var val=get(this,path);if(val===undefined&&isGlobalPath(path)){val=get(Ember.lookup,path)}return View._classStringForValue(path,val,parsedPath.className,parsedPath.falsyClassName)},element:computed("_parentView",function(key,value){if(value!==undefined){return this.currentState.setElement(this,value)}else{return this.currentState.getElement(this)}}),$:function(sel){return this.currentState.$(this,sel)},mutateChildViews:function(callback){var childViews=this._childViews,idx=childViews.length,view;while(--idx>=0){view=childViews[idx];callback(this,view,idx)}return this},forEachChildView:function(callback){var childViews=this._childViews;if(!childViews){return this}var len=childViews.length,view,idx;for(idx=0;idx=0;i--){childViews[i].removedFromDOM=true}if(viewName&&nonVirtualParentView){nonVirtualParentView.set(viewName,null)}childLen=childViews.length;for(i=childLen-1;i>=0;i--){childViews[i].destroy()}return this},createChildView:function(view,attrs){if(!view){throw new TypeError("createChildViews first argument must exist")}if(view.isView&&view._parentView===this&&view.container===this.container){return view}attrs=attrs||{};attrs._parentView=this;if(CoreView.detect(view)){attrs.templateData=attrs.templateData||get(this,"templateData");attrs.container=this.container;view=view.create(attrs);if(view.viewName){set(get(this,"concreteView"),view.viewName,view)}}else if("string"===typeof view){var fullName="view:"+view;var ViewKlass=this.container.lookupFactory(fullName);attrs.templateData=get(this,"templateData");view=ViewKlass.create(attrs)}else{attrs.container=this.container;if(!get(view,"templateData")){attrs.templateData=get(this,"templateData")}setProperties(view,attrs)}return view},becameVisible:Ember.K,becameHidden:Ember.K,_isVisibleDidChange:observer("isVisible",function(){if(this._isVisible===get(this,"isVisible")){return}run.scheduleOnce("render",this,this._toggleVisibility)}),_toggleVisibility:function(){var $el=this.$();if(!$el){return}var isVisible=get(this,"isVisible");if(this._isVisible===isVisible){return}$el.toggle(isVisible);this._isVisible=isVisible;if(this._isAncestorHidden()){return}if(isVisible){this._notifyBecameVisible()}else{this._notifyBecameHidden()}},_notifyBecameVisible:function(){this.trigger("becameVisible");this.forEachChildView(function(view){var isVisible=get(view,"isVisible");if(isVisible||isVisible===null){view._notifyBecameVisible()}})},_notifyBecameHidden:function(){this.trigger("becameHidden");this.forEachChildView(function(view){var isVisible=get(view,"isVisible");if(isVisible||isVisible===null){view._notifyBecameHidden()}})},_isAncestorHidden:function(){var parent=get(this,"parentView");while(parent){if(get(parent,"isVisible")===false){return true}parent=get(parent,"parentView")}return false},clearBuffer:function(){this.invokeRecursively(nullViewsBuffer)},transitionTo:function(state,children){this._transitionTo(state,children)},_transitionTo:function(state,children){var priorState=this.currentState;var currentState=this.currentState=this._states[state];this._state=state;if(priorState&&priorState.exit){priorState.exit(this)}if(currentState.enter){currentState.enter(this)}if(state==="inDOM"){meta(this).cache.element=undefined}if(children!==false){this.forEachChildView(function(view){view._transitionTo(state)})}},handleEvent:function(eventName,evt){return this.currentState.handleEvent(this,eventName,evt)},registerObserver:function(root,path,target,observer){if(!observer&&"function"===typeof target){observer=target;target=null}if(!root||typeof root!=="object"){return}var view=this,stateCheckedObserver=function(){view.currentState.invokeObserver(this,observer)},scheduledObserver=function(){run.scheduleOnce("render",this,stateCheckedObserver)};addObserver(root,path,target,scheduledObserver);this.one("willClearRender",function(){removeObserver(root,path,target,scheduledObserver)})}});function notifyMutationListeners(){run.once(View,"notifyMutationListeners")}var DOMManager={prepend:function(view,html){view.$().prepend(html);notifyMutationListeners()},after:function(view,html){view.$().after(html);notifyMutationListeners()},html:function(view,html){view.$().html(html);notifyMutationListeners()},replace:function(view){var element=get(view,"element");set(view,"element",null);view._insertElementLater(function(){jQuery(element).replaceWith(get(view,"element"));notifyMutationListeners()})},remove:function(view){view.$().remove();notifyMutationListeners()},empty:function(view){view.$().empty();notifyMutationListeners()}};View.reopen({domManager:DOMManager});View.reopenClass({_parsePropertyPath:function(path){var split=path.split(":"),propertyPath=split[0],classNames="",className,falsyClassName;if(split.length>1){className=split[1];if(split.length===3){falsyClassName=split[2]}classNames=":"+className;if(falsyClassName){classNames+=":"+falsyClassName}}return{path:propertyPath,classNames:classNames,className:className===""?undefined:className,falsyClassName:falsyClassName}},_classStringForValue:function(path,val,className,falsyClassName){if(isArray(val)){val=get(val,"length")!==0}if(className||falsyClassName){if(className&&!!val){return className}else if(falsyClassName&&!val){return falsyClassName}else{return null}}else if(val===true){var parts=path.split(".");return dasherize(parts[parts.length-1])}else if(val!==false&&val!=null){return val}else{return null}}});var mutation=EmberObject.extend(Evented).create();View.addMutationListener=function(callback){mutation.on("change",callback)};View.removeMutationListener=function(callback){mutation.off("change",callback)};View.notifyMutationListeners=function(){mutation.trigger("change")};View.views={};View.childViewsProperty=childViewsProperty;View.applyAttributeBindings=function(elem,name,value){var type=typeOf(value);if(name!=="value"&&(type==="string"||type==="number"&&!isNaN(value))){if(value!==elem.attr(name)){elem.attr(name,value)}}else if(name==="value"||type==="boolean"){if(isNone(value)||value===false){elem.removeAttr(name);if(name==="required"){elem.removeProp(name)}else{elem.prop(name,"")}}else if(value!==elem.prop(name)){elem.prop(name,value)}}else if(!value){elem.removeAttr(name)}};__exports__["default"]=View});define("ember-views/views/view_collection",["ember-metal/enumerable_utils","exports"],function(__dependency1__,__exports__){"use strict";var forEach=__dependency1__.forEach;function ViewCollection(initialViews){var views=this.views=initialViews||[];this.length=views.length}ViewCollection.prototype={length:0,trigger:function(eventName){var views=this.views,view;for(var i=0,l=views.length;i
    ";testEl.firstChild.innerHTML="";return testEl.firstChild.innerHTML===""}(),movesWhitespace=document&&function(){var testEl=document.createElement("div");testEl.innerHTML="Test: Value";return testEl.childNodes[0].nodeValue==="Test:"&&testEl.childNodes[2].nodeValue===" Value"}();var Metamorph=function(html){var self;if(this instanceof Metamorph){self=this}else{self=new K}self.innerHTML=html;var myGuid="metamorph-"+guid++;self.start=myGuid+"-start";self.end=myGuid+"-end";return self};K.prototype=Metamorph.prototype;var rangeFor,htmlFunc,removeFunc,outerHTMLFunc,appendToFunc,afterFunc,prependFunc,startTagFunc,endTagFunc;outerHTMLFunc=function(){return this.startTag()+this.innerHTML+this.endTag()};startTagFunc=function(){return""};endTagFunc=function(){return""};if(supportsRange){rangeFor=function(morph,outerToo){var range=document.createRange();var before=document.getElementById(morph.start);var after=document.getElementById(morph.end);if(outerToo){range.setStartBefore(before);range.setEndAfter(after)}else{range.setStartAfter(before);range.setEndBefore(after)}return range};htmlFunc=function(html,outerToo){var range=rangeFor(this,outerToo);range.deleteContents();var fragment=range.createContextualFragment(html);range.insertNode(fragment)};removeFunc=function(){var range=rangeFor(this,true);range.deleteContents()};appendToFunc=function(node){var range=document.createRange();range.setStart(node);range.collapse(false);var frag=range.createContextualFragment(this.outerHTML());node.appendChild(frag)};afterFunc=function(html){var range=document.createRange();var after=document.getElementById(this.end);range.setStartAfter(after);range.setEndAfter(after);var fragment=range.createContextualFragment(html);range.insertNode(fragment)};prependFunc=function(html){var range=document.createRange();var start=document.getElementById(this.start);range.setStartAfter(start);range.setEndAfter(start);var fragment=range.createContextualFragment(html);range.insertNode(fragment)}}else{Metamorph._wrapMap={select:[1,""],fieldset:[1,"
    ","
    "],table:[1,"","
    "],tbody:[2,"","
    "],tr:[3,"","
    "],colgroup:[2,"","
    "],map:[1,"",""],_default:[0,"",""]};var findChildById=function(element,id){if(element.getAttribute("id")===id){return element}var len=element.childNodes.length,idx,node,found;for(idx=0;idx0){var len=matches.length,idx;for(idx=0;idx2&&key.slice(keyLength-2)==="[]"){isArray=true;key=key.slice(0,keyLength-2);if(!queryParams[key]){queryParams[key]=[]}}value=pair[1]?decodeURIComponent(pair[1]):""}if(isArray){queryParams[key].push(value)}else{queryParams[key]=value}}return queryParams},recognize:function(path){var states=[this.rootState],pathLen,i,l,queryStart,queryParams={},isSlashDropped=false;path=decodeURI(path);queryStart=path.indexOf("?");if(queryStart!==-1){var queryString=path.substr(queryStart+1,path.length);path=path.substr(0,queryStart);queryParams=this.parseQueryString(queryString)}if(path.charAt(0)!=="/"){path="/"+path}pathLen=path.length;if(pathLen>1&&path.charAt(pathLen-1)==="/"){path=path.substr(0,pathLen-1);isSlashDropped=true}for(i=0,l=path.length;i=0&&proceed;--i){var route=routes[i];recognizer.add(routes,{as:route.handler});proceed=route.path==="/"||route.path===""||route.handler.slice(-6)===".index"}})},hasRoute:function(route){return this.recognizer.hasRoute(route)},queryParamsTransition:function(changelist,wasTransitioning,oldState,newState){var router=this;fireQueryParamDidChange(this,newState,changelist);if(!wasTransitioning&&this.activeTransition){return this.activeTransition}else{var newTransition=new Transition(this);newTransition.queryParamsOnly=true;oldState.queryParams=finalizeQueryParamChange(this,newState.handlerInfos,newState.queryParams,newTransition);newTransition.promise=newTransition.promise.then(function(result){updateURL(newTransition,oldState,true);if(router.didTransition){router.didTransition(router.currentHandlerInfos)}return result},null,promiseLabel("Transition complete"));return newTransition}},transitionByIntent:function(intent,isIntermediate){var wasTransitioning=!!this.activeTransition;var oldState=wasTransitioning?this.activeTransition.state:this.state;var newTransition;var router=this;try{var newState=intent.applyToState(oldState,this.recognizer,this.getHandler,isIntermediate);var queryParamChangelist=getChangelist(oldState.queryParams,newState.queryParams);if(handlerInfosEqual(newState.handlerInfos,oldState.handlerInfos)){if(queryParamChangelist){newTransition=this.queryParamsTransition(queryParamChangelist,wasTransitioning,oldState,newState);if(newTransition){return newTransition}}return new Transition(this)}if(isIntermediate){setupContexts(this,newState);return}newTransition=new Transition(this,intent,newState);if(this.activeTransition){this.activeTransition.abort()}this.activeTransition=newTransition;newTransition.promise=newTransition.promise.then(function(result){return finalizeTransition(newTransition,result.state)},null,promiseLabel("Settle transition promise when transition is finalized"));if(!wasTransitioning){notifyExistingHandlers(this,newState,newTransition)}fireQueryParamDidChange(this,newState,queryParamChangelist);return newTransition}catch(e){return new Transition(this,intent,null,e)}},reset:function(){if(this.state){forEach(this.state.handlerInfos.slice().reverse(),function(handlerInfo){var handler=handlerInfo.handler;callHook(handler,"exit")})}this.state=new TransitionState;this.currentHandlerInfos=null},activeTransition:null,handleURL:function(url){var args=slice.call(arguments);if(url.charAt(0)!=="/"){args[0]="/"+url}return doTransition(this,args).method(null)},updateURL:function(){throw new Error("updateURL is not implemented")},replaceURL:function(url){this.updateURL(url)},transitionTo:function(name){return doTransition(this,arguments)},intermediateTransitionTo:function(name){return doTransition(this,arguments,true)},refresh:function(pivotHandler){var state=this.activeTransition?this.activeTransition.state:this.state;var handlerInfos=state.handlerInfos;var params={};for(var i=0,len=handlerInfos.length;i=0;--i){var handlerInfo=handlerInfos[i];merge(params,handlerInfo.params);if(handlerInfo.handler.inaccessibleByURL){urlMethod=null}}if(urlMethod){params.queryParams=transition._visibleQueryParams||state.queryParams;var url=router.recognizer.generate(handlerName,params);if(urlMethod==="replace"){router.replaceURL(url)}else{router.updateURL(url)}}}function finalizeTransition(transition,newState){try{log(transition.router,transition.sequence,"Resolved all models on destination route; finalizing transition.");var router=transition.router,handlerInfos=newState.handlerInfos,seq=transition.sequence;setupContexts(router,newState,transition);if(transition.isAborted){router.state.handlerInfos=router.currentHandlerInfos;return Promise.reject(logAbort(transition))}updateURL(transition,newState,transition.intent.url);transition.isActive=false;router.activeTransition=null;trigger(router,router.currentHandlerInfos,true,["didTransition"]);if(router.didTransition){router.didTransition(router.currentHandlerInfos)}log(router,transition.sequence,"TRANSITION COMPLETE.");return handlerInfos[handlerInfos.length-1].handler}catch(e){if(!(e instanceof TransitionAborted)){var infos=transition.state.handlerInfos;transition.trigger(true,"error",e,transition,infos[infos.length-1].handler);transition.abort()}throw e}}function doTransition(router,args,isIntermediate){var name=args[0]||"/";var lastArg=args[args.length-1];var queryParams={};if(lastArg&&lastArg.hasOwnProperty("queryParams")){queryParams=pop.call(args).queryParams}var intent;if(args.length===0){log(router,"Updating query params");var handlerInfos=router.state.handlerInfos;intent=new NamedTransitionIntent({name:handlerInfos[handlerInfos.length-1].name,contexts:[],queryParams:queryParams})}else if(name.charAt(0)==="/"){log(router,"Attempting URL transition to "+name);intent=new URLTransitionIntent({url:name})}else{log(router,"Attempting transition to "+name);intent=new NamedTransitionIntent({name:args[0],contexts:slice.call(args,1),queryParams:queryParams})}return router.transitionByIntent(intent,isIntermediate)}function handlerInfosEqual(handlerInfos,otherHandlerInfos){if(handlerInfos.length!==otherHandlerInfos.length){return false}for(var i=0,len=handlerInfos.length;i0){router._triggerWillChangeContext(changing,newTransition)}trigger(router,oldHandlers,true,["willTransition",newTransition])}__exports__["default"]=Router});define("router/transition-intent",["./utils","exports"],function(__dependency1__,__exports__){"use strict";var merge=__dependency1__.merge;function TransitionIntent(props){this.initialize(props);this.data=this.data||{}}TransitionIntent.prototype={initialize:null,applyToState:null};__exports__["default"]=TransitionIntent});define("router/transition-intent/named-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var TransitionIntent=__dependency1__["default"];var TransitionState=__dependency2__["default"];var handlerInfoFactory=__dependency3__["default"];var isParam=__dependency4__.isParam;var extractQueryParams=__dependency4__.extractQueryParams;var merge=__dependency4__.merge;var subclass=__dependency4__.subclass;__exports__["default"]=subclass(TransitionIntent,{name:null,pivotHandler:null,contexts:null,queryParams:null,initialize:function(props){this.name=props.name;this.pivotHandler=props.pivotHandler;this.contexts=props.contexts||[];this.queryParams=props.queryParams},applyToState:function(oldState,recognizer,getHandler,isIntermediate){var partitionedArgs=extractQueryParams([this.name].concat(this.contexts)),pureArgs=partitionedArgs[0],queryParams=partitionedArgs[1],handlers=recognizer.handlersFor(pureArgs[0]);var targetRouteName=handlers[handlers.length-1].handler;return this.applyToHandlers(oldState,handlers,getHandler,targetRouteName,isIntermediate)},applyToHandlers:function(oldState,handlers,getHandler,targetRouteName,isIntermediate,checkingIfActive){var i,len;var newState=new TransitionState;var objects=this.contexts.slice(0);var invalidateIndex=handlers.length;if(this.pivotHandler){for(i=0,len=handlers.length;i=0;--i){var result=handlers[i];var name=result.handler;var handler=getHandler(name);var oldHandlerInfo=oldState.handlerInfos[i];var newHandlerInfo=null;if(result.names.length>0){if(i>=invalidateIndex){newHandlerInfo=this.createParamHandlerInfo(name,handler,result.names,objects,oldHandlerInfo)}else{newHandlerInfo=this.getHandlerInfoForDynamicSegment(name,handler,result.names,objects,oldHandlerInfo,targetRouteName,i)}}else{newHandlerInfo=this.createParamHandlerInfo(name,handler,result.names,objects,oldHandlerInfo)}if(checkingIfActive){newHandlerInfo=newHandlerInfo.becomeResolved(null,newHandlerInfo.context);var oldContext=oldHandlerInfo&&oldHandlerInfo.context;if(result.names.length>0&&newHandlerInfo.context===oldContext){newHandlerInfo.params=oldHandlerInfo&&oldHandlerInfo.params}newHandlerInfo.context=oldContext}var handlerToUse=oldHandlerInfo;if(i>=invalidateIndex||newHandlerInfo.shouldSupercede(oldHandlerInfo)){invalidateIndex=Math.min(i,invalidateIndex);handlerToUse=newHandlerInfo}if(isIntermediate&&!checkingIfActive){handlerToUse=handlerToUse.becomeResolved(null,handlerToUse.context)}newState.handlerInfos.unshift(handlerToUse)}if(objects.length>0){throw new Error("More context objects were passed than there are dynamic segments for the route: "+targetRouteName)}if(!isIntermediate){this.invalidateChildren(newState.handlerInfos,invalidateIndex)}merge(newState.queryParams,this.queryParams||{});return newState},invalidateChildren:function(handlerInfos,invalidateIndex){for(var i=invalidateIndex,l=handlerInfos.length;i0){objectToUse=objects[objects.length-1];if(isParam(objectToUse)){return this.createParamHandlerInfo(name,handler,names,objects,oldHandlerInfo)}else{objects.pop()}}else if(oldHandlerInfo&&oldHandlerInfo.name===name){return oldHandlerInfo}else{if(this.preTransitionState){var preTransitionHandlerInfo=this.preTransitionState.handlerInfos[i];objectToUse=preTransitionHandlerInfo&&preTransitionHandlerInfo.context}else{return oldHandlerInfo}}return handlerInfoFactory("object",{name:name,handler:handler,context:objectToUse,names:names})},createParamHandlerInfo:function(name,handler,names,objects,oldHandlerInfo){var params={};var numNames=names.length;while(numNames--){var oldParams=oldHandlerInfo&&name===oldHandlerInfo.name&&oldHandlerInfo.params||{};var peek=objects[objects.length-1];var paramName=names[numNames];if(isParam(peek)){params[paramName]=""+objects.pop()}else{if(oldParams.hasOwnProperty(paramName)){params[paramName]=oldParams[paramName]}else{throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route "+name)}}}return handlerInfoFactory("param",{name:name,handler:handler,params:params})}})});define("router/transition-intent/url-transition-intent",["../transition-intent","../transition-state","../handler-info/factory","../utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__dependency4__,__exports__){"use strict";var TransitionIntent=__dependency1__["default"];var TransitionState=__dependency2__["default"];var handlerInfoFactory=__dependency3__["default"];var oCreate=__dependency4__.oCreate;var merge=__dependency4__.merge;var subclass=__dependency4__.subclass;__exports__["default"]=subclass(TransitionIntent,{url:null,initialize:function(props){this.url=props.url},applyToState:function(oldState,recognizer,getHandler){var newState=new TransitionState;var results=recognizer.recognize(this.url),queryParams={},i,len;if(!results){throw new UnrecognizedURLError(this.url)}var statesDiffer=false;for(i=0,len=results.length;i=handlerInfos.length?handlerInfos.length-1:payload.resolveIndex;return Promise.reject({error:error,handlerWithError:currentState.handlerInfos[errorHandlerIndex].handler,wasAborted:wasAborted,state:currentState})}function proceed(resolvedHandlerInfo){var wasAlreadyResolved=currentState.handlerInfos[payload.resolveIndex].isResolved;currentState.handlerInfos[payload.resolveIndex++]=resolvedHandlerInfo;if(!wasAlreadyResolved){var handler=resolvedHandlerInfo.handler;callHook(handler,"redirect",resolvedHandlerInfo.context,payload)}return innerShouldContinue().then(resolveOneHandlerInfo,null,currentState.promiseLabel("Resolve handler"))}function resolveOneHandlerInfo(){if(payload.resolveIndex===currentState.handlerInfos.length){return{error:null,state:currentState}}var handlerInfo=currentState.handlerInfos[payload.resolveIndex];return handlerInfo.resolve(innerShouldContinue,payload).then(proceed,null,currentState.promiseLabel("Proceed"))}}};__exports__["default"]=TransitionState});define("router/transition",["rsvp/promise","./handler-info","./utils","exports"],function(__dependency1__,__dependency2__,__dependency3__,__exports__){"use strict";var Promise=__dependency1__["default"];var ResolvedHandlerInfo=__dependency2__.ResolvedHandlerInfo;var trigger=__dependency3__.trigger;var slice=__dependency3__.slice;var log=__dependency3__.log;var promiseLabel=__dependency3__.promiseLabel;function Transition(router,intent,state,error){var transition=this;this.state=state||router.state;this.intent=intent;this.router=router;this.data=this.intent&&this.intent.data||{};this.resolvedModels={};this.queryParams={};if(error){this.promise=Promise.reject(error);return}if(state){this.params=state.params;this.queryParams=state.queryParams;this.handlerInfos=state.handlerInfos;var len=state.handlerInfos.length;if(len){this.targetName=state.handlerInfos[len-1].name}for(var i=0;i0&&array[len-1]&&array[len-1].hasOwnProperty("queryParams")){queryParams=array[len-1].queryParams;head=slice.call(array,0,len-1);return[head,queryParams]}else{return[array,null]}}__exports__.extractQueryParams=extractQueryParams;function coerceQueryParamsToString(queryParams){for(var key in queryParams){if(typeof queryParams[key]==="number"){queryParams[key]=""+queryParams[key]}else if(isArray(queryParams[key])){for(var i=0,l=queryParams[key].length;i=0;i--){var handlerInfo=handlerInfos[i],handler=handlerInfo.handler;if(handler.events&&handler.events[name]){if(handler.events[name].apply(handler,args)===true){eventWasHandled=true}else{return}}}if(!eventWasHandled&&!ignoreFailure){throw new Error("Nothing handled the event '"+name+"'.")}}__exports__.trigger=trigger;function getChangelist(oldObject,newObject){var key;var results={all:{},changed:{},removed:{}};merge(results.all,newObject);var didChange=false;coerceQueryParamsToString(oldObject);coerceQueryParamsToString(newObject);for(key in oldObject){if(oldObject.hasOwnProperty(key)){if(!newObject.hasOwnProperty(key)){didChange=true;results.removed[key]=oldObject[key]}}}for(key in newObject){if(newObject.hasOwnProperty(key)){if(isArray(oldObject[key])&&isArray(newObject[key])){if(oldObject[key].length!==newObject[key].length){results.changed[key]=newObject[key];didChange=true}else{for(var i=0,l=oldObject[key].length;i