{"version":3,"sources":["license.js","loader.js","@ember/-internals/container/tests/container_test.js","@ember/-internals/container/tests/owner_test.js","@ember/-internals/container/tests/registry_test.js","@ember/-internals/extension-support/tests/container_debug_adapter_test.js","@ember/-internals/extension-support/tests/data_adapter_test.js","@ember/-internals/glimmer/tests/integration/application/actions-test.js","@ember/-internals/glimmer/tests/integration/application/engine-test.js","@ember/-internals/glimmer/tests/integration/application/hot-reload-test.js","@ember/-internals/glimmer/tests/integration/application/rendering-test.js","@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test.js","@ember/-internals/glimmer/tests/integration/components/append-test.js","@ember/-internals/glimmer/tests/integration/components/attribute-bindings-test.js","@ember/-internals/glimmer/tests/integration/components/attrs-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/class-bindings-test.js","@ember/-internals/glimmer/tests/integration/components/contextual-components-test.js","@ember/-internals/glimmer/tests/integration/components/curly-components-test.js","@ember/-internals/glimmer/tests/integration/components/destroy-test.js","@ember/-internals/glimmer/tests/integration/components/dynamic-components-test.js","@ember/-internals/glimmer/tests/integration/components/error-handling-test.js","@ember/-internals/glimmer/tests/integration/components/fragment-components-test.js","@ember/-internals/glimmer/tests/integration/components/instrumentation-compile-test.js","@ember/-internals/glimmer/tests/integration/components/instrumentation-test.js","@ember/-internals/glimmer/tests/integration/components/life-cycle-test.js","@ember/-internals/glimmer/tests/integration/components/link-to-test.js","@ember/-internals/glimmer/tests/integration/components/local-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/namespaced-lookup-test.js","@ember/-internals/glimmer/tests/integration/components/render-to-element-test.js","@ember/-internals/glimmer/tests/integration/components/target-action-test.js","@ember/-internals/glimmer/tests/integration/components/template-only-components-test.js","@ember/-internals/glimmer/tests/integration/components/to-string-test.js","@ember/-internals/glimmer/tests/integration/components/utils-test.js","@ember/-internals/glimmer/tests/integration/components/web-component-fallback-test.js","@ember/-internals/glimmer/tests/integration/components/will-destroy-element-hook-test.js","@ember/-internals/glimmer/tests/integration/content-test.js","@ember/-internals/glimmer/tests/integration/custom-component-manager-test.js","@ember/-internals/glimmer/tests/integration/event-dispatcher-test.js","@ember/-internals/glimmer/tests/integration/helpers/-class-test.js","@ember/-internals/glimmer/tests/integration/helpers/closure-action-test.js","@ember/-internals/glimmer/tests/integration/helpers/concat-test.js","@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test.js","@ember/-internals/glimmer/tests/integration/helpers/element-action-test.js","@ember/-internals/glimmer/tests/integration/helpers/get-test.js","@ember/-internals/glimmer/tests/integration/helpers/hash-test.js","@ember/-internals/glimmer/tests/integration/helpers/if-unless-test.js","@ember/-internals/glimmer/tests/integration/helpers/input-test.js","@ember/-internals/glimmer/tests/integration/helpers/loc-test.js","@ember/-internals/glimmer/tests/integration/helpers/log-test.js","@ember/-internals/glimmer/tests/integration/helpers/mut-test.js","@ember/-internals/glimmer/tests/integration/helpers/partial-test.js","@ember/-internals/glimmer/tests/integration/helpers/readonly-test.js","@ember/-internals/glimmer/tests/integration/helpers/text-area-test.js","@ember/-internals/glimmer/tests/integration/helpers/unbound-test.js","@ember/-internals/glimmer/tests/integration/helpers/yield-test.js","@ember/-internals/glimmer/tests/integration/input-test.js","@ember/-internals/glimmer/tests/integration/mount-test.js","@ember/-internals/glimmer/tests/integration/outlet-test.js","@ember/-internals/glimmer/tests/integration/refinements-test.js","@ember/-internals/glimmer/tests/integration/render-settled-test.js","@ember/-internals/glimmer/tests/integration/svg-test.js","@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js","@ember/-internals/glimmer/tests/integration/syntax/each-test.js","@ember/-internals/glimmer/tests/integration/syntax/experimental-syntax-test.js","@ember/-internals/glimmer/tests/integration/syntax/if-unless-test.js","@ember/-internals/glimmer/tests/integration/syntax/in-element-test.js","@ember/-internals/glimmer/tests/integration/syntax/let-test.js","@ember/-internals/glimmer/tests/integration/syntax/with-dynamic-var-test.js","@ember/-internals/glimmer/tests/integration/syntax/with-test.js","@ember/-internals/glimmer/tests/unit/outlet-test.js","@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test.js","@ember/-internals/glimmer/tests/unit/template-factory-test.js","@ember/-internals/glimmer/tests/unit/utils/debug-stack-test.js","@ember/-internals/glimmer/tests/utils/abstract-test-case.js","@ember/-internals/glimmer/tests/utils/helpers.js","@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js","@ember/-internals/glimmer/tests/utils/string-test.js","@ember/-internals/glimmer/tests/utils/test-case.js","@ember/-internals/glimmer/tests/utils/test-helpers.js","@ember/-internals/meta/tests/listeners_test.js","@ember/-internals/meta/tests/meta_test.js","@ember/-internals/metal/tests/accessors/get_path_test.js","@ember/-internals/metal/tests/accessors/get_properties_test.js","@ember/-internals/metal/tests/accessors/get_test.js","@ember/-internals/metal/tests/accessors/mandatory_setters_test.js","@ember/-internals/metal/tests/accessors/set_path_test.js","@ember/-internals/metal/tests/accessors/set_test.js","@ember/-internals/metal/tests/alias_test.js","@ember/-internals/metal/tests/chains_test.js","@ember/-internals/metal/tests/computed_test.js","@ember/-internals/metal/tests/descriptor_test.js","@ember/-internals/metal/tests/events_test.js","@ember/-internals/metal/tests/expand_properties_test.js","@ember/-internals/metal/tests/injected_property_test.js","@ember/-internals/metal/tests/is_blank_test.js","@ember/-internals/metal/tests/is_empty_test.js","@ember/-internals/metal/tests/is_none_test.js","@ember/-internals/metal/tests/is_present_test.js","@ember/-internals/metal/tests/libraries_test.js","@ember/-internals/metal/tests/main_test.js","@ember/-internals/metal/tests/mixin/alias_method_test.js","@ember/-internals/metal/tests/mixin/apply_test.js","@ember/-internals/metal/tests/mixin/computed_test.js","@ember/-internals/metal/tests/mixin/concatenated_properties_test.js","@ember/-internals/metal/tests/mixin/detect_test.js","@ember/-internals/metal/tests/mixin/introspection_test.js","@ember/-internals/metal/tests/mixin/merged_properties_test.js","@ember/-internals/metal/tests/mixin/method_test.js","@ember/-internals/metal/tests/mixin/observer_test.js","@ember/-internals/metal/tests/mixin/reopen_test.js","@ember/-internals/metal/tests/mixin/without_test.js","@ember/-internals/metal/tests/namespace_search_test.js","@ember/-internals/metal/tests/observer_test.js","@ember/-internals/metal/tests/performance_test.js","@ember/-internals/metal/tests/properties_test.js","@ember/-internals/metal/tests/property_did_change_hook.js","@ember/-internals/metal/tests/property_events_test.js","@ember/-internals/metal/tests/set_properties_test.js","@ember/-internals/metal/tests/tracked/computed_test.js","@ember/-internals/metal/tests/tracked/get_test.js","@ember/-internals/metal/tests/tracked/set_test.js","@ember/-internals/metal/tests/tracked/support.js","@ember/-internals/metal/tests/tracked/validation_test.js","@ember/-internals/metal/tests/watching/is_watching_test.js","@ember/-internals/metal/tests/watching/unwatch_test.js","@ember/-internals/metal/tests/watching/watch_test.js","@ember/-internals/routing/tests/ext/controller_test.js","@ember/-internals/routing/tests/location/auto_location_test.js","@ember/-internals/routing/tests/location/hash_location_test.js","@ember/-internals/routing/tests/location/history_location_test.js","@ember/-internals/routing/tests/location/none_location_test.js","@ember/-internals/routing/tests/location/util_test.js","@ember/-internals/routing/tests/system/cache_test.js","@ember/-internals/routing/tests/system/controller_for_test.js","@ember/-internals/routing/tests/system/dsl_test.js","@ember/-internals/routing/tests/system/route_test.js","@ember/-internals/routing/tests/system/router_test.js","@ember/-internals/routing/tests/utils_test.js","@ember/-internals/runtime/tests/array/any-test.js","@ember/-internals/runtime/tests/array/compact-test.js","@ember/-internals/runtime/tests/array/every-test.js","@ember/-internals/runtime/tests/array/filter-test.js","@ember/-internals/runtime/tests/array/find-test.js","@ember/-internals/runtime/tests/array/firstObject-test.js","@ember/-internals/runtime/tests/array/forEach-test.js","@ember/-internals/runtime/tests/array/includes-test.js","@ember/-internals/runtime/tests/array/indexOf-test.js","@ember/-internals/runtime/tests/array/invoke-test.js","@ember/-internals/runtime/tests/array/isAny-test.js","@ember/-internals/runtime/tests/array/lastIndexOf-test.js","@ember/-internals/runtime/tests/array/lastObject-test.js","@ember/-internals/runtime/tests/array/map-test.js","@ember/-internals/runtime/tests/array/mapBy-test.js","@ember/-internals/runtime/tests/array/objectAt-test.js","@ember/-internals/runtime/tests/array/reduce-test.js","@ember/-internals/runtime/tests/array/reject-test.js","@ember/-internals/runtime/tests/array/sortBy-test.js","@ember/-internals/runtime/tests/array/toArray-test.js","@ember/-internals/runtime/tests/array/uniq-test.js","@ember/-internals/runtime/tests/array/uniqBy-test.js","@ember/-internals/runtime/tests/array/without-test.js","@ember/-internals/runtime/tests/copyable-array/copy-test.js","@ember/-internals/runtime/tests/core/compare_test.js","@ember/-internals/runtime/tests/core/copy_test.js","@ember/-internals/runtime/tests/core/isEqual_test.js","@ember/-internals/runtime/tests/core/is_array_test.js","@ember/-internals/runtime/tests/core/is_empty_test.js","@ember/-internals/runtime/tests/core/type_of_test.js","@ember/-internals/runtime/tests/ext/function_test.js","@ember/-internals/runtime/tests/ext/rsvp_test.js","@ember/-internals/runtime/tests/helpers/array.js","@ember/-internals/runtime/tests/inject_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/chained_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/observable_test.js","@ember/-internals/runtime/tests/legacy_1x/mixins/observable/propertyChanges_test.js","@ember/-internals/runtime/tests/legacy_1x/system/object/base_test.js","@ember/-internals/runtime/tests/legacy_1x/system/object/concatenated_test.js","@ember/-internals/runtime/tests/mixins/array_test.js","@ember/-internals/runtime/tests/mixins/comparable_test.js","@ember/-internals/runtime/tests/mixins/container_proxy_test.js","@ember/-internals/runtime/tests/mixins/enumerable_test.js","@ember/-internals/runtime/tests/mixins/evented_test.js","@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js","@ember/-internals/runtime/tests/mixins/observable_test.js","@ember/-internals/runtime/tests/mixins/promise_proxy_test.js","@ember/-internals/runtime/tests/mixins/target_action_support_test.js","@ember/-internals/runtime/tests/mutable-array/addObject-test.js","@ember/-internals/runtime/tests/mutable-array/clear-test.js","@ember/-internals/runtime/tests/mutable-array/insertAt-test.js","@ember/-internals/runtime/tests/mutable-array/popObject-test.js","@ember/-internals/runtime/tests/mutable-array/pushObject-test.js","@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js","@ember/-internals/runtime/tests/mutable-array/removeAt-test.js","@ember/-internals/runtime/tests/mutable-array/removeObject-test.js","@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js","@ember/-internals/runtime/tests/mutable-array/replace-test.js","@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js","@ember/-internals/runtime/tests/mutable-array/setObjects-test.js","@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js","@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js","@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js","@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test.js","@ember/-internals/runtime/tests/system/array_proxy/array_observer_test.js","@ember/-internals/runtime/tests/system/array_proxy/content_change_test.js","@ember/-internals/runtime/tests/system/array_proxy/length_test.js","@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test.js","@ember/-internals/runtime/tests/system/core_object_test.js","@ember/-internals/runtime/tests/system/namespace/base_test.js","@ember/-internals/runtime/tests/system/native_array/a_test.js","@ember/-internals/runtime/tests/system/native_array/copyable_suite_test.js","@ember/-internals/runtime/tests/system/native_array/replace_test.js","@ember/-internals/runtime/tests/system/object/computed_test.js","@ember/-internals/runtime/tests/system/object/create_test.js","@ember/-internals/runtime/tests/system/object/destroy_test.js","@ember/-internals/runtime/tests/system/object/detectInstance_test.js","@ember/-internals/runtime/tests/system/object/detect_test.js","@ember/-internals/runtime/tests/system/object/es-compatibility-test.js","@ember/-internals/runtime/tests/system/object/events_test.js","@ember/-internals/runtime/tests/system/object/extend_test.js","@ember/-internals/runtime/tests/system/object/observer_test.js","@ember/-internals/runtime/tests/system/object/reopenClass_test.js","@ember/-internals/runtime/tests/system/object/reopen_test.js","@ember/-internals/runtime/tests/system/object/strict-mode-test.js","@ember/-internals/runtime/tests/system/object/toString_test.js","@ember/-internals/runtime/tests/system/object_proxy_test.js","@ember/-internals/utils/tests/cache_test.js","@ember/-internals/utils/tests/can_invoke_test.js","@ember/-internals/utils/tests/checkHasSuper_test.js","@ember/-internals/utils/tests/generate_guid_test.js","@ember/-internals/utils/tests/guid_for_test.js","@ember/-internals/utils/tests/inspect_test.js","@ember/-internals/utils/tests/is_proxy_test.js","@ember/-internals/utils/tests/make_array_test.js","@ember/-internals/utils/tests/to-string-test.js","@ember/-internals/utils/tests/try_invoke_test.js","@ember/application/tests/application_instance_test.js","@ember/application/tests/application_test.js","@ember/application/tests/bootstrap-test.js","@ember/application/tests/dependency_injection/custom_resolver_test.js","@ember/application/tests/dependency_injection/default_resolver_test.js","@ember/application/tests/dependency_injection/normalization_test.js","@ember/application/tests/dependency_injection/to_string_test.js","@ember/application/tests/dependency_injection_test.js","@ember/application/tests/initializers_test.js","@ember/application/tests/instance_initializers_test.js","@ember/application/tests/lazy_load_test.js","@ember/application/tests/logging_test.js","@ember/application/tests/readiness_test.js","@ember/application/tests/reset_test.js","@ember/application/tests/visit_test.js","@ember/controller/tests/controller_test.js","@ember/debug/tests/handlers-test.js","@ember/debug/tests/main_test.js","@ember/engine/tests/engine_initializers_test.js","@ember/engine/tests/engine_instance_initializers_test.js","@ember/engine/tests/engine_instance_test.js","@ember/engine/tests/engine_parent_test.js","@ember/engine/tests/engine_test.js","@ember/error/tests/index_test.js","@ember/instrumentation/tests/index-test.js","@ember/map/tests/map_test.js","@ember/object/tests/computed/computed_macros_test.js","@ember/object/tests/computed/reduce_computed_macros_test.js","@ember/polyfills/tests/assign_test.js","@ember/polyfills/tests/merge_test.js","@ember/runloop/tests/debounce_test.js","@ember/runloop/tests/later_test.js","@ember/runloop/tests/next_test.js","@ember/runloop/tests/once_test.js","@ember/runloop/tests/onerror_test.js","@ember/runloop/tests/run_bind_test.js","@ember/runloop/tests/run_test.js","@ember/runloop/tests/schedule_test.js","@ember/runloop/tests/sync_test.js","@ember/runloop/tests/unwind_test.js","@ember/string/tests/camelize_test.js","@ember/string/tests/capitalize_test.js","@ember/string/tests/classify_test.js","@ember/string/tests/dasherize_test.js","@ember/string/tests/decamelize_test.js","@ember/string/tests/loc_test.js","@ember/string/tests/underscore_test.js","@ember/string/tests/w_test.js","ember-template-compiler/tests/plugins/assert-if-helper-without-arguments-test.js","ember-template-compiler/tests/plugins/assert-input-helper-without-block-test.js","ember-template-compiler/tests/plugins/assert-local-variable-shadowing-helper-invocation-test.js","ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js","ember-template-compiler/tests/plugins/assert-splattribute-expression-test.js","ember-template-compiler/tests/plugins/deprecate-send-action-test.js","ember-template-compiler/tests/plugins/transform-component-invocation-test.js","ember-template-compiler/tests/plugins/transform-inline-link-to-test.js","ember-template-compiler/tests/plugins/transform-input-type-syntax-test.js","ember-template-compiler/tests/system/bootstrap-test.js","ember-template-compiler/tests/system/compile_options_test.js","ember-template-compiler/tests/system/dasherize-component-name-test.js","ember-testing/tests/acceptance_test.js","ember-testing/tests/adapters/adapter_test.js","ember-testing/tests/adapters/qunit_test.js","ember-testing/tests/adapters_test.js","ember-testing/tests/ext/rsvp_test.js","ember-testing/tests/helper_registration_test.js","ember-testing/tests/helpers_test.js","ember-testing/tests/integration_test.js","ember-testing/tests/reexports_test.js","ember-testing/tests/test/waiters-test.js","ember/tests/application_lifecycle_test.js","ember/tests/component_context_test.js","ember/tests/component_registration_test.js","ember/tests/controller_test.js","ember/tests/error_handler_test.js","ember/tests/helpers/helper_registration_test.js","ember/tests/helpers/link_to_test.js","ember/tests/helpers/link_to_test/link_to_transitioning_classes_test.js","ember/tests/helpers/link_to_test/link_to_with_query_params_test.js","ember/tests/homepage_example_test.js","ember/tests/integration/multiple-app-test.js","ember/tests/production_build_test.js","ember/tests/reexports_test.js","ember/tests/routing/decoupled_basic_test.js","ember/tests/routing/deprecated_handler_infos_test.js","ember/tests/routing/deprecated_transition_state_test.js","ember/tests/routing/query_params_test.js","ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test.js","ember/tests/routing/query_params_test/overlapping_query_params_test.js","ember/tests/routing/query_params_test/query_param_async_get_handler_test.js","ember/tests/routing/query_params_test/query_params_paramless_link_to_test.js","ember/tests/routing/query_params_test/shared_state_test.js","ember/tests/routing/router_map_test.js","ember/tests/routing/router_service_test/basic_test.js","ember/tests/routing/router_service_test/currenturl_lifecycle_test.js","ember/tests/routing/router_service_test/events_test.js","ember/tests/routing/router_service_test/isActive_test.js","ember/tests/routing/router_service_test/recognize_test.js","ember/tests/routing/router_service_test/replaceWith_test.js","ember/tests/routing/router_service_test/transitionTo_test.js","ember/tests/routing/router_service_test/urlFor_test.js","ember/tests/routing/substates_test.js","ember/tests/routing/toplevel_dom_test.js","ember/tests/service_injection_test.js","ember/tests/view_instrumentation_test.js","internal-test-helpers/index.js","internal-test-helpers/lib/apply-mixins.js","internal-test-helpers/lib/browser-detect.js","internal-test-helpers/lib/build-owner.js","internal-test-helpers/lib/confirm-export.js","internal-test-helpers/lib/ember-dev/assertion.js","internal-test-helpers/lib/ember-dev/containers.js","internal-test-helpers/lib/ember-dev/debug.js","internal-test-helpers/lib/ember-dev/deprecation.js","internal-test-helpers/lib/ember-dev/index.js","internal-test-helpers/lib/ember-dev/method-call-tracker.js","internal-test-helpers/lib/ember-dev/namespaces.js","internal-test-helpers/lib/ember-dev/run-loop.js","internal-test-helpers/lib/ember-dev/setup-qunit.js","internal-test-helpers/lib/ember-dev/utils.js","internal-test-helpers/lib/ember-dev/warning.js","internal-test-helpers/lib/equal-inner-html.js","internal-test-helpers/lib/equal-tokens.js","internal-test-helpers/lib/factory.js","internal-test-helpers/lib/get-all-property-names.js","internal-test-helpers/lib/get-text-of.js","internal-test-helpers/lib/matchers.js","internal-test-helpers/lib/module-for.js","internal-test-helpers/lib/registry-check.js","internal-test-helpers/lib/run.js","internal-test-helpers/lib/strip.js","internal-test-helpers/lib/system/synthetic-events.js","internal-test-helpers/lib/test-cases/abstract-application.js","internal-test-helpers/lib/test-cases/abstract-rendering.js","internal-test-helpers/lib/test-cases/abstract.js","internal-test-helpers/lib/test-cases/application.js","internal-test-helpers/lib/test-cases/autoboot-application.js","internal-test-helpers/lib/test-cases/default-resolver-application.js","internal-test-helpers/lib/test-cases/node-query.js","internal-test-helpers/lib/test-cases/query-param.js","internal-test-helpers/lib/test-cases/rendering.js","internal-test-helpers/lib/test-cases/router.js","internal-test-helpers/lib/test-cases/test-resolver-application.js","internal-test-helpers/lib/test-resolver.js","internal-test-helpers/tests/index-test.js","node-module.js"],"sourcesContent":["/*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2018 Tilde Inc. and contributors\n * Portions Copyright 2006-2011 Strobe Inc.\n * Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license Licensed under MIT license\n * See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version 3.6.0\n */\n","/*globals process */\nvar enifed, requireModule, Ember;\n\n// Used in @ember/-internals/environment/lib/global.js\nmainContext = this; // eslint-disable-line no-undef\n\n(function() {\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var reified = new Array(deps.length);\n\n for (var i = 0; i < deps.length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = requireModule;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n }\n\n var isNode =\n typeof window === 'undefined' &&\n typeof process !== 'undefined' &&\n {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') {\n Ember = {};\n }\n\n if (typeof Ember.__loader === 'undefined') {\n var registry = Object.create(null);\n var seen = Object.create(null);\n\n enifed = function(name, deps, callback) {\n var value = {};\n\n if (!callback) {\n value.deps = [];\n value.callback = deps;\n } else {\n value.deps = deps;\n value.callback = callback;\n }\n\n registry[name] = value;\n };\n\n requireModule = function(name) {\n return internalRequire(name, null);\n };\n\n // setup `require` module\n requireModule['default'] = requireModule;\n\n requireModule.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n requireModule._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: requireModule,\n registry: registry,\n };\n } else {\n enifed = Ember.__loader.define;\n requireModule = Ember.__loader.require;\n }\n})();\n","enifed('@ember/-internals/container/tests/container_test', ['@ember/-internals/owner', '@ember/polyfills', '@ember/-internals/container', 'internal-test-helpers'], function (_owner, _polyfills, _container, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Container', class extends _internalTestHelpers.AbstractTestCase {\n ['@test A registered factory returns the same instance each time'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The lookup is an instance of the factory');\n\n assert.equal(postController, container.lookup('controller:post'));\n }\n\n ['@test uses create time injections if factory has no extend'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let AppleController = (0, _internalTestHelpers.factory)();\n let PostController = (0, _internalTestHelpers.factory)();\n\n PostController.extend = undefined; // remove extend\n\n registry.register('controller:apple', AppleController);\n registry.register('controller:post', PostController);\n registry.injection('controller:post', 'apple', 'controller:apple');\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController.apple instanceof AppleController, 'instance receives an apple of instance AppleController');\n }\n\n ['@test A registered factory returns a fresh instance if singleton: false is passed as an option'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let postController1 = container.lookup('controller:post');\n let postController2 = container.lookup('controller:post', {\n singleton: false\n });\n let postController3 = container.lookup('controller:post', {\n singleton: false\n });\n let postController4 = container.lookup('controller:post');\n\n assert.equal(postController1.toString(), postController4.toString(), 'Singleton factories looked up normally return the same value');\n assert.notEqual(postController1.toString(), postController2.toString(), 'Singleton factories are not equal to factories looked up with singleton: false');\n assert.notEqual(postController2.toString(), postController3.toString(), 'Two factories looked up with singleton: false are not equal');\n assert.notEqual(postController3.toString(), postController4.toString(), 'A singleton factory looked up after a factory called with singleton: false is not equal');\n\n assert.ok(postController1 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController2 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController3 instanceof PostController, 'All instances are instances of the registered factory');\n assert.ok(postController4 instanceof PostController, 'All instances are instances of the registered factory');\n }\n\n [\"@test A factory type with a registered injection's instances receive that injection\"](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n\n registry.typeInjection('controller', 'store', 'store:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n\n assert.equal(postController.store, store);\n }\n\n ['@test An individual factory with a registered injection receives the injection'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n\n registry.injection('controller:post', 'store', 'store:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n\n assert.equal(postController.store, store, 'has the correct store injected');\n }\n\n ['@test A factory with both type and individual injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let Store = (0, _internalTestHelpers.factory)();\n let Router = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.register('store:main', Store);\n registry.register('router:main', Router);\n\n registry.injection('controller:post', 'store', 'store:main');\n registry.typeInjection('controller', 'router', 'router:main');\n\n let postController = container.lookup('controller:post');\n let store = container.lookup('store:main');\n let router = container.lookup('router:main');\n\n assert.equal(postController.store, store);\n assert.equal(postController.router, router);\n }\n\n ['@test A non-singleton instance is never cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.register('view:post', PostView, { singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 !== postView2, 'Non-singletons are not cached');\n }\n\n ['@test A non-instantiated property is not instantiated'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let template = function () {};\n registry.register('template:foo', template, { instantiate: false });\n assert.equal(container.lookup('template:foo'), template);\n }\n\n ['@test A failed lookup returns undefined'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n assert.equal(container.lookup('doesnot:exist'), undefined);\n }\n\n ['@test An invalid factory throws an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n registry.register('controller:foo', {});\n\n assert.throws(() => {\n container.lookup('controller:foo');\n }, /Failed to create an instance of \\'controller:foo\\'/);\n }\n\n ['@test Injecting a failed lookup raises an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let fooInstance = {};\n let fooFactory = {};\n\n let Foo = {\n create() {\n return fooInstance;\n },\n extend() {\n return fooFactory;\n }\n };\n\n registry.register('model:foo', Foo);\n registry.injection('model:foo', 'store', 'store:main');\n\n assert.throws(() => {\n container.lookup('model:foo');\n });\n }\n\n ['@test Injecting a falsy value does not raise an error'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let ApplicationController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:application', ApplicationController);\n registry.register('user:current', null, { instantiate: false });\n registry.injection('controller:application', 'currentUser', 'user:current');\n\n assert.strictEqual(container.lookup('controller:application').currentUser, null);\n }\n\n ['@test The container returns same value each time even if the value is falsy'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n registry.register('falsy:value', null, { instantiate: false });\n\n assert.strictEqual(container.lookup('falsy:value'), container.lookup('falsy:value'));\n }\n\n ['@test Destroying the container destroys any cached singletons'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let PostView = (0, _internalTestHelpers.factory)();\n let template = function () {};\n\n registry.register('controller:post', PostController);\n registry.register('view:post', PostView, { singleton: false });\n registry.register('template:post', template, { instantiate: false });\n\n registry.injection('controller:post', 'postView', 'view:post');\n\n let postController = container.lookup('controller:post');\n let postView = postController.postView;\n\n assert.ok(postView instanceof PostView, 'The non-singleton was injected');\n\n container.destroy();\n\n assert.ok(postController.isDestroyed, 'Singletons are destroyed');\n assert.ok(!postView.isDestroyed, 'Non-singletons are not destroyed');\n }\n\n ['@test The container can use a registry hook to resolve factories lazily'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The correct factory was provided');\n }\n\n ['@test The container normalizes names before resolving'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let postController = container.lookup('controller:normalized');\n\n assert.ok(postController instanceof PostController, 'Normalizes the name before resolving');\n }\n\n ['@test The container normalizes names when looking factory up'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let fact = container.factoryFor('controller:normalized');\n\n let factInstance = fact.create();\n assert.ok(factInstance instanceof PostController, 'Normalizes the name');\n }\n\n ['@test Options can be registered that should be applied to a given factory'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'view:post') {\n return PostView;\n }\n }\n };\n\n registry.options('view:post', { instantiate: true, singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 instanceof PostView, 'The correct factory was provided');\n assert.ok(postView2 instanceof PostView, 'The correct factory was provided');\n\n assert.ok(postView1 !== postView2, 'The two lookups are different');\n }\n\n ['@test Options can be registered that should be applied to all factories for a given type'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n\n registry.resolver = {\n resolve(fullName) {\n if (fullName === 'view:post') {\n return PostView;\n }\n }\n };\n\n registry.optionsForType('view', { singleton: false });\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1 instanceof PostView, 'The correct factory was provided');\n assert.ok(postView2 instanceof PostView, 'The correct factory was provided');\n\n assert.ok(postView1 !== postView2, 'The two lookups are different');\n }\n\n ['@test An injected non-singleton instance is never cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostView = (0, _internalTestHelpers.factory)();\n let PostViewHelper = (0, _internalTestHelpers.factory)();\n\n registry.register('view:post', PostView, { singleton: false });\n registry.register('view_helper:post', PostViewHelper, {\n singleton: false\n });\n registry.injection('view:post', 'viewHelper', 'view_helper:post');\n\n let postView1 = container.lookup('view:post');\n let postView2 = container.lookup('view:post');\n\n assert.ok(postView1.viewHelper !== postView2.viewHelper, 'Injected non-singletons are not cached');\n }\n\n ['@test Factory resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n\n container.factoryFor('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n }\n\n ['@test factory for non extendables (MODEL) resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n\n container.factoryFor('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n }\n\n ['@test factory for non extendables resolves are cached'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = {};\n let resolveWasCalled = [];\n\n registry.resolve = function (fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n };\n\n assert.deepEqual(resolveWasCalled, []);\n container.factoryFor('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n\n container.factoryFor('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n }\n\n [`@test A factory's lazy injections are validated when first instantiated`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Apple = (0, _internalTestHelpers.factory)();\n let Orange = (0, _internalTestHelpers.factory)();\n\n Apple.reopenClass({\n _lazyInjections() {\n return [{ specifier: 'orange:main' }, { specifier: 'banana:main' }];\n }\n });\n\n registry.register('apple:main', Apple);\n registry.register('orange:main', Orange);\n\n assert.throws(() => {\n container.lookup('apple:main');\n }, /Attempting to inject an unknown injection: 'banana:main'/);\n }\n\n ['@test Lazy injection validations are cached'](assert) {\n assert.expect(1);\n\n let registry = new _container.Registry();\n let container = registry.container();\n let Apple = (0, _internalTestHelpers.factory)();\n let Orange = (0, _internalTestHelpers.factory)();\n\n Apple.reopenClass({\n _lazyInjections: () => {\n assert.ok(true, 'should call lazy injection method');\n return [{ specifier: 'orange:main' }];\n }\n });\n\n registry.register('apple:main', Apple);\n registry.register('orange:main', Orange);\n\n container.lookup('apple:main');\n container.lookup('apple:main');\n }\n\n ['@test An object with its owner pre-set should be returned from ownerInjection'](assert) {\n let owner = {};\n let registry = new _container.Registry();\n let container = registry.container({ owner });\n\n let result = container.ownerInjection();\n\n assert.equal(result[_owner.OWNER], owner, 'owner is properly included');\n }\n\n ['@test lookup passes options through to expandlocallookup'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n registry.expandLocalLookup = (fullName, options) => {\n assert.ok(true, 'expandLocalLookup was called');\n assert.equal(fullName, 'foo:bar');\n assert.deepEqual(options, { source: 'baz:qux' });\n\n return 'controller:post';\n };\n\n let PostControllerLookupResult = container.lookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.ok(PostControllerLookupResult instanceof PostController);\n }\n\n ['@test #factoryFor class is registered class'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.deepEqual(factoryManager.class, Component, 'No double extend');\n }\n\n ['@test #factoryFor must supply a fullname']() {\n let registry = new _container.Registry();\n let container = registry.container();\n expectAssertion(() => {\n container.factoryFor('chad-bar');\n }, /fullName must be a proper full name/);\n }\n\n ['@test #factoryFor returns a factory manager'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.ok(factoryManager.create);\n assert.ok(factoryManager.class);\n }\n\n ['@test #factoryFor returns a cached factory manager for the same type'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('component:baz-bar', Component);\n\n let factoryManager1 = container.factoryFor('component:foo-bar');\n let factoryManager2 = container.factoryFor('component:foo-bar');\n let factoryManager3 = container.factoryFor('component:baz-bar');\n\n assert.equal(factoryManager1, factoryManager2, 'cache hit');\n assert.notEqual(factoryManager1, factoryManager3, 'cache miss');\n }\n\n ['@test #factoryFor class returns the factory function'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager = container.factoryFor('component:foo-bar');\n assert.deepEqual(factoryManager.class, Component, 'No double extend');\n }\n\n ['@test #factoryFor instance have a common parent'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factoryManager1 = container.factoryFor('component:foo-bar');\n let factoryManager2 = container.factoryFor('component:foo-bar');\n let instance1 = factoryManager1.create({ foo: 'foo' });\n let instance2 = factoryManager2.create({ bar: 'bar' });\n\n assert.deepEqual(instance1.constructor, instance2.constructor);\n }\n\n ['@test can properly reset cache'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n\n let factory1 = container.factoryFor('component:foo-bar');\n let factory2 = container.factoryFor('component:foo-bar');\n\n let instance1 = container.lookup('component:foo-bar');\n let instance2 = container.lookup('component:foo-bar');\n\n assert.equal(instance1, instance2);\n assert.equal(factory1, factory2);\n\n container.reset();\n\n let factory3 = container.factoryFor('component:foo-bar');\n let instance3 = container.lookup('component:foo-bar');\n\n assert.notEqual(instance1, instance3);\n assert.notEqual(factory1, factory3);\n }\n\n ['@test #factoryFor created instances come with instance injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n let Ajax = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('util:ajax', Ajax);\n registry.injection('component:foo-bar', 'ajax', 'util:ajax');\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let component = componentFactory.create();\n\n assert.ok(component.ajax);\n assert.ok(component.ajax instanceof Ajax);\n }\n\n ['@test #factoryFor options passed to create clobber injections'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n let Component = (0, _internalTestHelpers.factory)();\n let Ajax = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n registry.register('util:ajax', Ajax);\n registry.injection('component:foo-bar', 'ajax', 'util:ajax');\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instrance = componentFactory.create({ ajax: 'fetch' });\n\n assert.equal(instrance.ajax, 'fetch');\n }\n\n ['@test #factoryFor does not add properties to the object being instantiated when _initFactory is present'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n class Component {\n static _initFactory() {}\n static create(options) {\n let instance = new this();\n (0, _polyfills.assign)(instance, options);\n return instance;\n }\n }\n registry.register('component:foo-bar', Component);\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instance = componentFactory.create();\n\n // note: _guid and isDestroyed are being set in the `factory` constructor\n // not via registry/container shenanigans\n assert.deepEqual(Object.keys(instance), []);\n }\n\n [`@test assert when calling lookup after destroy on a container`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n let instance = container.lookup('component:foo-bar');\n assert.ok(instance, 'precond lookup successful');\n\n this.runTask(() => {\n container.destroy();\n container.finalizeDestroy();\n });\n\n expectAssertion(() => {\n container.lookup('component:foo-bar');\n });\n }\n\n [`@test assert when calling factoryFor after destroy on a container`](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n let Component = (0, _internalTestHelpers.factory)();\n registry.register('component:foo-bar', Component);\n let instance = container.factoryFor('component:foo-bar');\n assert.ok(instance, 'precond lookup successful');\n\n this.runTask(() => {\n container.destroy();\n container.finalizeDestroy();\n });\n\n expectAssertion(() => {\n container.factoryFor('component:foo-bar');\n });\n }\n\n // this is skipped until templates and the glimmer environment do not require `OWNER` to be\n // passed in as constructor args\n ['@skip #factoryFor does not add properties to the object being instantiated'](assert) {\n let registry = new _container.Registry();\n let container = registry.container();\n\n class Component {\n static create(options) {\n let instance = new this();\n (0, _polyfills.assign)(instance, options);\n return instance;\n }\n }\n registry.register('component:foo-bar', Component);\n\n let componentFactory = container.factoryFor('component:foo-bar');\n let instance = componentFactory.create();\n\n // note: _guid and isDestroyed are being set in the `factory` constructor\n // not via registry/container shenanigans\n assert.deepEqual(Object.keys(instance), []);\n }\n });\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n (0, _internalTestHelpers.moduleFor)('Container module unification', class extends _internalTestHelpers.AbstractTestCase {\n ['@test The container can expand and resolve a source to factoryFor'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedSource = 'template:routes/application';\n let registry = new _container.Registry();\n let resolveCount = 0;\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.source, expectedSource, 'source is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n resolveCount++;\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n assert.strictEqual(container.factoryFor(lookup, { source: expectedSource }).class, PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(container.factoryFor(lookup, { source: expectedSource }).class, PrivateComponent, 'The correct factory was provided again');\n assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time');\n }\n\n ['@test The container can expand and resolve a source to lookup']() {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedSource = 'template:routes/application';\n let registry = new _container.Registry();\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.source, expectedSource, 'source is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n let result = container.lookup(lookup, { source: expectedSource });\n this.assert.ok(result instanceof PrivateComponent, 'The correct factory was provided');\n\n this.assert.ok(container.cache[expandedKey] instanceof PrivateComponent, 'The correct factory was stored in the cache with the correct key which includes the source.');\n }\n\n ['@test The container can expand and resolve a namespace to factoryFor'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedNamespace = 'my-addon';\n let registry = new _container.Registry();\n let resolveCount = 0;\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.namespace, expectedNamespace, 'namespace is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n resolveCount++;\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n assert.strictEqual(container.factoryFor(lookup, { namespace: expectedNamespace }).class, PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(container.factoryFor(lookup, { namespace: expectedNamespace }).class, PrivateComponent, 'The correct factory was provided again');\n assert.equal(resolveCount, 1, 'resolve called only once and a cached factory was returned the second time');\n }\n\n ['@test The container can expand and resolve a namespace to lookup']() {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let lookup = 'component:my-input';\n let expectedNamespace = 'my-addon';\n let registry = new _container.Registry();\n let expandedKey = 'boom, special expanded key';\n registry.expandLocalLookup = (specifier, options) => {\n this.assert.strictEqual(specifier, lookup, 'specifier is expanded');\n this.assert.strictEqual(options.namespace, expectedNamespace, 'namespace is expanded');\n return expandedKey;\n };\n registry.resolve = function (fullName) {\n if (fullName === expandedKey) {\n return PrivateComponent;\n }\n };\n\n let container = registry.container();\n\n let result = container.lookup(lookup, { namespace: expectedNamespace });\n this.assert.ok(result instanceof PrivateComponent, 'The correct factory was provided');\n\n this.assert.ok(container.cache[expandedKey] instanceof PrivateComponent, 'The correct factory was stored in the cache with the correct key which includes the source.');\n }\n });\n }\n});","enifed('@ember/-internals/container/tests/owner_test', ['@ember/-internals/owner', 'internal-test-helpers'], function (_owner, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Owner', class extends _internalTestHelpers.AbstractTestCase {\n ['@test An owner can be set with `setOwner` and retrieved with `getOwner`'](assert) {\n let owner = {};\n let obj = {};\n\n assert.strictEqual((0, _owner.getOwner)(obj), undefined, 'owner has not been set');\n\n (0, _owner.setOwner)(obj, owner);\n\n assert.strictEqual((0, _owner.getOwner)(obj), owner, 'owner has been set');\n\n assert.strictEqual(obj[_owner.OWNER], owner, 'owner has been set to the OWNER symbol');\n }\n });\n});","enifed('@ember/-internals/container/tests/registry_test', ['@ember/-internals/container', 'internal-test-helpers'], function (_container, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Registry', class extends _internalTestHelpers.AbstractTestCase {\n ['@test A registered factory is returned from resolve'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n let PostControllerFactory = registry.resolve('controller:post');\n\n assert.ok(PostControllerFactory, 'factory is returned');\n assert.ok(PostControllerFactory.create() instanceof PostController, 'The return of factory.create is an instance of PostController');\n }\n\n ['@test The registered factory returned from resolve is the same factory each time'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n assert.deepEqual(registry.resolve('controller:post'), registry.resolve('controller:post'), 'The return of resolve is always the same');\n }\n\n ['@test The registered value returned from resolve is the same value each time even if the value is falsy'](assert) {\n let registry = new _container.Registry();\n\n registry.register('falsy:value', null, { instantiate: false });\n\n assert.strictEqual(registry.resolve('falsy:value'), registry.resolve('falsy:value'), 'The return of resolve is always the same');\n }\n\n ['@test The value returned from resolver is the same value as the original value even if the value is falsy'](assert) {\n let resolver = {\n resolve(fullName) {\n if (fullName === 'falsy:value') {\n return null;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve('falsy:value'), null);\n }\n\n ['@test A registered factory returns true for `has` if an item is registered'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n assert.equal(registry.has('controller:post'), true, 'The `has` method returned true for registered factories');\n assert.equal(registry.has('controller:posts'), false, 'The `has` method returned false for unregistered factories');\n }\n\n ['@test Throw exception when trying to inject `type:thing` on all type(s)']() {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.register('controller:post', PostController);\n\n expectAssertion(() => {\n registry.typeInjection('controller', 'injected', 'controller:post');\n }, /Cannot inject a 'controller:post' on other controller\\(s\\)\\./);\n }\n\n ['@test The registry can take a hook to resolve factories lazily'](assert) {\n let PostController = (0, _internalTestHelpers.factory)();\n let resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve('controller:post'), PostController, 'The correct factory was provided');\n }\n\n ['@test The registry respects the resolver hook for `has`'](assert) {\n let PostController = (0, _internalTestHelpers.factory)();\n let resolver = {\n resolve(fullName) {\n if (fullName === 'controller:post') {\n return PostController;\n }\n }\n };\n let registry = new _container.Registry({ resolver });\n\n assert.ok(registry.has('controller:post'), 'the `has` method uses the resolver hook');\n }\n\n ['@test The registry normalizes names when resolving'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n let type = registry.resolve('controller:normalized');\n\n assert.strictEqual(type, PostController, 'Normalizes the name when resolving');\n }\n\n ['@test The registry normalizes names when checking if the factory is registered'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n\n registry.normalizeFullName = function (fullName) {\n return fullName === 'controller:normalized' ? 'controller:post' : fullName;\n };\n\n registry.register('controller:post', PostController);\n let isPresent = registry.has('controller:normalized');\n\n assert.equal(isPresent, true, 'Normalizes the name when checking if the factory or instance is present');\n }\n\n ['@test The registry normalizes names when injecting'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let user = { name: 'Stef' };\n\n registry.normalize = function () {\n return 'controller:post';\n };\n\n registry.register('controller:post', PostController);\n registry.register('user:post', user, { instantiate: false });\n registry.injection('controller:post', 'user', 'controller:normalized');\n\n assert.deepEqual(registry.resolve('controller:post'), user, 'Normalizes the name when injecting');\n }\n\n ['@test cannot register an `undefined` factory'](assert) {\n let registry = new _container.Registry();\n\n assert.throws(() => {\n registry.register('controller:apple', undefined);\n }, '');\n }\n\n ['@test can re-register a factory'](assert) {\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n registry.register('controller:apple', FirstApple);\n registry.register('controller:apple', SecondApple);\n\n assert.ok(registry.resolve('controller:apple').create() instanceof SecondApple);\n }\n\n ['@test cannot re-register a factory if it has been resolved'](assert) {\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n registry.register('controller:apple', FirstApple);\n assert.strictEqual(registry.resolve('controller:apple'), FirstApple);\n\n expectAssertion(function () {\n registry.register('controller:apple', SecondApple);\n }, /Cannot re-register: 'controller:apple', as it has already been resolved\\./);\n\n assert.strictEqual(registry.resolve('controller:apple'), FirstApple);\n }\n\n ['@test registry.has should not accidentally cause injections on that factory to be run. (Mitigate merely on observing)'](assert) {\n assert.expect(1);\n\n let registry = new _container.Registry();\n let FirstApple = (0, _internalTestHelpers.factory)('first');\n let SecondApple = (0, _internalTestHelpers.factory)('second');\n\n SecondApple.extend = function () {\n assert.ok(false, 'should not extend or touch the injected model, merely to inspect existence of another');\n };\n\n registry.register('controller:apple', FirstApple);\n registry.register('controller:second-apple', SecondApple);\n registry.injection('controller:apple', 'badApple', 'controller:second-apple');\n\n assert.ok(registry.has('controller:apple'));\n }\n\n ['@test registry.has should not error for invalid fullNames'](assert) {\n let registry = new _container.Registry();\n\n assert.ok(!registry.has('foo:bar:baz'));\n }\n\n ['@test once resolved, always return the same result'](assert) {\n let registry = new _container.Registry();\n\n registry.resolver = {\n resolve() {\n return 'bar';\n }\n };\n\n let Bar = registry.resolve('models:bar');\n\n registry.resolver = {\n resolve() {\n return 'not bar';\n }\n };\n\n assert.equal(registry.resolve('models:bar'), Bar);\n }\n\n ['@test factory resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n\n registry.resolve('controller:post');\n assert.deepEqual(resolveWasCalled, ['controller:post']);\n }\n\n ['@test factory for non extendables (MODEL) resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n\n registry.resolve('model:post');\n assert.deepEqual(resolveWasCalled, ['model:post']);\n }\n\n ['@test factory for non extendables resolves are cached'](assert) {\n let registry = new _container.Registry();\n let PostController = {};\n let resolveWasCalled = [];\n\n registry.resolver = {\n resolve(fullName) {\n resolveWasCalled.push(fullName);\n return PostController;\n }\n };\n\n assert.deepEqual(resolveWasCalled, []);\n registry.resolve('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n\n registry.resolve('foo:post');\n assert.deepEqual(resolveWasCalled, ['foo:post']);\n }\n\n ['@test registry.container creates a container'](assert) {\n let registry = new _container.Registry();\n let PostController = (0, _internalTestHelpers.factory)();\n registry.register('controller:post', PostController);\n\n let container = registry.container();\n let postController = container.lookup('controller:post');\n\n assert.ok(postController instanceof PostController, 'The lookup is an instance of the registered factory');\n }\n\n ['@test `describe` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n describe(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n lookupDescription(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.describe('controller:post'), 'controller:post-resolver', '`describe` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.describe('controller:post'), 'controller:post-fallback', '`describe` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.describe('controller:post'), 'controller:post', '`describe` by default returns argument.');\n }\n\n ['@test `normalizeFullName` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n normalizeFullName(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n normalize(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post-resolver', '`normalizeFullName` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post-fallback', '`normalizeFullName` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.normalizeFullName('controller:post'), 'controller:post', '`normalizeFullName` by default returns argument.');\n }\n\n ['@test `makeToString` will be handled by the resolver, then by the fallback registry, if available'](assert) {\n let fallback = {\n makeToString(fullName) {\n return `${fullName}-fallback`;\n }\n };\n\n let resolver = {\n makeToString(fullName) {\n return `${fullName}-resolver`;\n }\n };\n\n let registry = new _container.Registry({ fallback, resolver });\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post-resolver', '`makeToString` handled by the resolver first.');\n\n registry.resolver = null;\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post-fallback', '`makeToString` handled by fallback registry next.');\n\n registry.fallback = null;\n\n assert.equal(registry.makeToString('controller:post'), 'controller:post', '`makeToString` by default returns argument.');\n }\n\n ['@test `resolve` can be handled by a fallback registry'](assert) {\n let fallback = new _container.Registry();\n\n let registry = new _container.Registry({ fallback: fallback });\n let PostController = (0, _internalTestHelpers.factory)();\n\n fallback.register('controller:post', PostController);\n\n let PostControllerFactory = registry.resolve('controller:post');\n\n assert.ok(PostControllerFactory, 'factory is returned');\n assert.ok(PostControllerFactory.create() instanceof PostController, 'The return of factory.create is an instance of PostController');\n }\n\n ['@test `has` can be handled by a fallback registry'](assert) {\n let fallback = new _container.Registry();\n\n let registry = new _container.Registry({ fallback: fallback });\n let PostController = (0, _internalTestHelpers.factory)();\n\n fallback.register('controller:post', PostController);\n\n assert.equal(registry.has('controller:post'), true, 'Fallback registry is checked for registration');\n }\n\n ['@test `getInjections` includes injections from a fallback registry'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n assert.strictEqual(registry.getInjections('model:user'), undefined, 'No injections in the primary registry');\n\n fallback.injection('model:user', 'post', 'model:post');\n\n assert.equal(registry.getInjections('model:user').length, 1, 'Injections from the fallback registry are merged');\n }\n\n ['@test `getTypeInjections` includes type injections from a fallback registry'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n assert.strictEqual(registry.getTypeInjections('model'), undefined, 'No injections in the primary registry');\n\n fallback.injection('model', 'source', 'source:main');\n\n assert.equal(registry.getTypeInjections('model').length, 1, 'Injections from the fallback registry are merged');\n }\n\n ['@test `knownForType` contains keys for each item of a given type'](assert) {\n let registry = new _container.Registry();\n\n registry.register('foo:bar-baz', 'baz');\n registry.register('foo:qux-fez', 'fez');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:bar-baz': true,\n 'foo:qux-fez': true\n });\n }\n\n ['@test `knownForType` includes fallback registry results'](assert) {\n let fallback = new _container.Registry();\n let registry = new _container.Registry({ fallback: fallback });\n\n registry.register('foo:bar-baz', 'baz');\n registry.register('foo:qux-fez', 'fez');\n fallback.register('foo:zurp-zorp', 'zorp');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:bar-baz': true,\n 'foo:qux-fez': true,\n 'foo:zurp-zorp': true\n });\n }\n\n ['@test `knownForType` is called on the resolver if present'](assert) {\n assert.expect(3);\n\n let resolver = {\n knownForType(type) {\n assert.ok(true, 'knownForType called on the resolver');\n assert.equal(type, 'foo', 'the type was passed through');\n\n return { 'foo:yorp': true };\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n registry.register('foo:bar-baz', 'baz');\n\n let found = registry.knownForType('foo');\n\n assert.deepEqual(found, {\n 'foo:yorp': true,\n 'foo:bar-baz': true\n });\n }\n\n ['@test resolver.expandLocalLookup is not required'](assert) {\n let registry = new _container.Registry({\n resolver: {}\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, null);\n }\n\n ['@test expandLocalLookup is called on the resolver if present'](assert) {\n assert.expect(4);\n\n let resolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test `expandLocalLookup` is handled by the resolver, then by the fallback registry, if available'](assert) {\n assert.expect(9);\n\n let fallbackResolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the fallback resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar-fallback';\n }\n };\n\n let resolver = {\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar-resolver';\n }\n };\n\n let fallbackRegistry = new _container.Registry({\n resolver: fallbackResolver\n });\n\n let registry = new _container.Registry({\n fallback: fallbackRegistry,\n resolver\n });\n\n let result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar-resolver', 'handled by the resolver');\n\n registry.resolver = null;\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar-fallback', 'handled by the fallback registry');\n\n registry.fallback = null;\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, null, 'null is returned by default when no resolver or fallback registry is present');\n }\n\n ['@test resolver.expandLocalLookup result is cached'](assert) {\n assert.expect(3);\n let result;\n\n let resolver = {\n expandLocalLookup: () => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test resolver.expandLocalLookup cache is busted when any unregister is called'](assert) {\n assert.expect(4);\n let result;\n\n let resolver = {\n expandLocalLookup: () => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n\n registry.unregister('foo:bar');\n\n result = registry.expandLocalLookup('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.equal(result, 'foo:qux/bar');\n }\n\n ['@test resolve calls expandLocallookup when it receives options.source'](assert) {\n assert.expect(3);\n\n let resolver = {\n resolve() {},\n expandLocalLookup: (targetFullName, sourceFullName) => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n assert.equal(targetFullName, 'foo:bar', 'the targetFullName was passed through');\n assert.equal(sourceFullName, 'baz:qux', 'the sourceFullName was passed through');\n\n return 'foo:qux/bar';\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n registry.resolve('foo:bar', {\n source: 'baz:qux'\n });\n }\n\n ['@test has uses expandLocalLookup'](assert) {\n assert.expect(5);\n let resolvedFullNames = [];\n let result;\n\n let resolver = {\n resolve(name) {\n resolvedFullNames.push(name);\n return 'yippie!';\n },\n\n expandLocalLookup: targetFullName => {\n assert.ok(true, 'expandLocalLookup is called on the resolver');\n\n if (targetFullName === 'foo:bar') {\n return 'foo:qux/bar';\n } else {\n return null;\n }\n }\n };\n\n let registry = new _container.Registry({\n resolver\n });\n\n result = registry.has('foo:bar', {\n source: 'baz:qux'\n });\n\n assert.ok(result, 'found foo:bar/qux');\n\n result = registry.has('foo:baz', {\n source: 'baz:qux'\n });\n\n assert.ok(!result, 'foo:baz/qux not found');\n\n assert.deepEqual(['foo:qux/bar'], resolvedFullNames);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Registry privatize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test valid format'](assert) {\n let privatized = (0, _container.privatize)(['secret:factory']);\n let matched = privatized.match(/^([^:]+):([^:]+)-(\\d+)$/);\n\n assert.ok(matched, 'privatized format was recognized');\n assert.equal(matched[1], 'secret');\n assert.equal(matched[2], 'factory');\n assert.ok(/^\\d+$/.test(matched[3]));\n }\n });\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n (0, _internalTestHelpers.moduleFor)('Registry module unification', class extends _internalTestHelpers.AbstractTestCase {\n ['@test The registry can pass a source to the resolver'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let type = 'component';\n let name = 'my-input';\n let specifier = `${type}:${name}`;\n let source = 'template:routes/application';\n\n let resolver = new _internalTestHelpers.ModuleBasedTestResolver();\n resolver.add({ specifier, source }, PrivateComponent);\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve(specifier), undefined, 'Not returned when specifier not scoped');\n assert.strictEqual(registry.resolve(specifier, { source }), PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(registry.resolve(specifier, { source }), PrivateComponent, 'The correct factory was provided again');\n }\n\n ['@test The registry can pass a namespace to the resolver'](assert) {\n let PrivateComponent = (0, _internalTestHelpers.factory)();\n let type = 'component';\n let name = 'my-input';\n let specifier = `${type}:${name}`;\n let source = 'template:routes/application';\n let namespace = 'my-addon';\n\n let resolver = new _internalTestHelpers.ModuleBasedTestResolver();\n resolver.add({ specifier, source, namespace }, PrivateComponent);\n let registry = new _container.Registry({ resolver });\n\n assert.strictEqual(registry.resolve(specifier), undefined, 'Not returned when specifier not scoped');\n assert.strictEqual(registry.resolve(specifier, { source }), undefined, 'Not returned when specifier is missing namespace');\n assert.strictEqual(registry.resolve(specifier, { source, namespace }), PrivateComponent, 'The correct factory was provided');\n assert.strictEqual(registry.resolve(specifier, { source, namespace }), PrivateComponent, 'The correct factory was provided again');\n }\n });\n }\n});","enifed('@ember/-internals/extension-support/tests/container_debug_adapter_test', ['internal-test-helpers', '@ember/polyfills', '@ember/runloop', '@ember/controller', '@ember/debug', '@ember/-internals/extension-support/index'], function (_internalTestHelpers, _polyfills, _runloop, _controller, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug'); // Must be required to export Ember.ContainerDebugAdapter.\n\n\n (0, _internalTestHelpers.moduleFor)('Container Debug Adapter', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', () => {});\n super();\n this.adapter = this.application.__deprecatedInstance__.lookup('container-debug-adapter:main');\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true\n });\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n (0, _runloop.run)(() => {\n this.adapter.destroy();\n });\n\n super.teardown();\n }\n\n ['@test default ContainerDebugAdapter cannot catalog certain entries by type'](assert) {\n assert.equal(this.adapter.canCatalogEntriesByType('model'), false, 'canCatalogEntriesByType should return false for model');\n assert.equal(this.adapter.canCatalogEntriesByType('template'), false, 'canCatalogEntriesByType should return false for template');\n }\n\n ['@test default ContainerDebugAdapter can catalog typical entries by type'](assert) {\n assert.equal(this.adapter.canCatalogEntriesByType('controller'), true, 'canCatalogEntriesByType should return true for controller');\n assert.equal(this.adapter.canCatalogEntriesByType('route'), true, 'canCatalogEntriesByType should return true for route');\n assert.equal(this.adapter.canCatalogEntriesByType('view'), true, 'canCatalogEntriesByType should return true for view');\n }\n\n ['@test default ContainerDebugAdapter catalogs controller entries'](assert) {\n this.application.PostController = _controller.default.extend();\n let controllerClasses = this.adapter.catalogEntriesByType('controller');\n\n assert.equal(controllerClasses.length, 1, 'found 1 class');\n assert.equal(controllerClasses[0], 'post', 'found the right class');\n }\n });\n});","enifed('@ember/-internals/extension-support/tests/data_adapter_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/extension-support/lib/data_adapter', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _data_adapter, _internalTestHelpers) {\n 'use strict';\n\n let adapter;\n const Model = _runtime.Object.extend();\n\n const PostClass = Model.extend();\n\n const DataAdapter = _data_adapter.default.extend({\n detect(klass) {\n return klass !== Model && Model.detect(klass);\n },\n init() {\n this._super(...arguments);\n this.set('containerDebugAdapter', {\n canCatalogEntriesByType() {\n return true;\n },\n catalogEntriesByType() {\n return (0, _runtime.A)(['post']);\n }\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Data Adapter', class extends _internalTestHelpers.ApplicationTestCase {\n teardown() {\n super.teardown();\n adapter = undefined;\n }\n\n ['@test Model types added'](assert) {\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return (0, _runtime.A)([1, 2, 3]);\n },\n columnsForType() {\n return [{ name: 'title', desc: 'Title' }];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n let adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded(types) {\n assert.equal(types.length, 1);\n let postType = types[0];\n assert.equal(postType.name, 'post', 'Correctly sets the name');\n assert.equal(postType.count, 3, 'Correctly sets the record count');\n assert.strictEqual(postType.object, PostClass, 'Correctly sets the object');\n assert.deepEqual(postType.columns, [{ name: 'title', desc: 'Title' }], 'Correctly sets the columns');\n }\n\n adapter.watchModelTypes(modelTypesAdded);\n });\n }\n\n ['@test getRecords gets a model name as second argument'](assert) {\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords(klass, name) {\n assert.equal(name, 'post');\n return (0, _runtime.A)();\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n adapter.watchModelTypes(function () {});\n });\n }\n\n ['@test Model types added with custom container-debug-adapter'](assert) {\n let StubContainerDebugAdapter = _runtime.Object.extend({\n canCatalogEntriesByType() {\n return true;\n },\n catalogEntriesByType() {\n return (0, _runtime.A)(['post']);\n }\n });\n this.add('container-debug-adapter:main', StubContainerDebugAdapter);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return (0, _runtime.A)([1, 2, 3]);\n },\n columnsForType() {\n return [{ name: 'title', desc: 'Title' }];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n let adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded(types) {\n assert.equal(types.length, 1);\n let postType = types[0];\n assert.equal(postType.name, 'post', 'Correctly sets the name');\n assert.equal(postType.count, 3, 'Correctly sets the record count');\n assert.strictEqual(postType.object, PostClass, 'Correctly sets the object');\n assert.deepEqual(postType.columns, [{ name: 'title', desc: 'Title' }], 'Correctly sets the columns');\n }\n\n adapter.watchModelTypes(modelTypesAdded);\n });\n }\n\n ['@test Model Types Updated'](assert) {\n let records = (0, _runtime.A)([1, 2, 3]);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return records;\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded() {\n (0, _runloop.run)(() => {\n records.pushObject(4);\n });\n }\n\n function modelTypesUpdated(types) {\n let postType = types[0];\n assert.equal(postType.count, 4, 'Correctly updates the count');\n }\n\n adapter.watchModelTypes(modelTypesAdded, modelTypesUpdated);\n });\n }\n\n ['@test Model Types Updated but Unchanged Do not Trigger Callbacks'](assert) {\n assert.expect(0);\n let records = (0, _runtime.A)([1, 2, 3]);\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return records;\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function modelTypesAdded() {\n (0, _runloop.run)(() => {\n records.arrayContentDidChange(0, 0, 0);\n });\n }\n\n function modelTypesUpdated() {\n assert.ok(false, \"modelTypesUpdated should not be triggered if the array didn't change\");\n }\n\n adapter.watchModelTypes(modelTypesAdded, modelTypesUpdated);\n });\n }\n\n ['@test Records Added'](assert) {\n let countAdded = 1;\n let post = PostClass.create();\n let recordList = (0, _runtime.A)([post]);\n\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return recordList;\n },\n getRecordColor() {\n return 'blue';\n },\n getRecordColumnValues() {\n return { title: 'Post ' + countAdded };\n },\n getRecordKeywords() {\n return ['Post ' + countAdded];\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function recordsAdded(records) {\n let record = records[0];\n assert.equal(record.color, 'blue', 'Sets the color correctly');\n assert.deepEqual(record.columnValues, { title: 'Post ' + countAdded }, 'Sets the column values correctly');\n assert.deepEqual(record.searchKeywords, ['Post ' + countAdded], 'Sets search keywords correctly');\n assert.strictEqual(record.object, post, 'Sets the object to the record instance');\n }\n\n adapter.watchRecords('post', recordsAdded);\n countAdded++;\n post = PostClass.create();\n recordList.pushObject(post);\n });\n }\n\n ['@test Observes and releases a record correctly'](assert) {\n let updatesCalled = 0;\n let post = PostClass.create({ title: 'Post' });\n let recordList = (0, _runtime.A)([post]);\n\n this.add('data-adapter:main', DataAdapter.extend({\n getRecords() {\n return recordList;\n },\n observeRecord(record, recordUpdated) {\n let self = this;\n function callback() {\n recordUpdated(self.wrapRecord(record));\n }\n (0, _metal.addObserver)(record, 'title', callback);\n return function () {\n (0, _metal.removeObserver)(record, 'title', callback);\n };\n },\n getRecordColumnValues(record) {\n return { title: (0, _metal.get)(record, 'title') };\n }\n }));\n this.add('model:post', PostClass);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n function recordsAdded() {\n (0, _metal.set)(post, 'title', 'Post Modified');\n }\n\n function recordsUpdated(records) {\n updatesCalled++;\n assert.equal(records[0].columnValues.title, 'Post Modified');\n }\n\n let release = adapter.watchRecords('post', recordsAdded, recordsUpdated);\n release();\n (0, _metal.set)(post, 'title', 'New Title');\n assert.equal(updatesCalled, 1, 'Release function removes observers');\n });\n }\n\n ['@test _nameToClass does not error when not found'](assert) {\n this.add('data-adapter:main', DataAdapter);\n\n return this.visit('/').then(() => {\n adapter = this.applicationInstance.lookup('data-adapter:main');\n\n let klass = adapter._nameToClass('foo');\n\n assert.equal(klass, undefined, 'returns undefined');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/actions-test', ['@ember/controller', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/debug'], function (_controller, _testCase, _helpers, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n (0, _testCase.moduleFor)('Application test: actions', class extends _testCase.ApplicationTest {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super(...arguments);\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test actions in top level template application template target application controller'](assert) {\n assert.expect(1);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(true, 'controller received action properly');\n }\n }\n }));\n\n this.addTemplate('application', '');\n\n return this.visit('/').then(() => {\n this.runTask(() => this.$('#handle-it').click());\n });\n }\n\n ['@test actions in nested outlet template target their controller'](assert) {\n assert.expect(1);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(false, 'application controller should not have received action!');\n }\n }\n }));\n\n this.add('controller:index', _controller.default.extend({\n actions: {\n handleIt() {\n assert.ok(true, 'controller received action properly');\n }\n }\n }));\n\n this.addTemplate('index', '');\n\n return this.visit('/').then(() => {\n this.runTask(() => this.$('#handle-it').click());\n });\n }\n });\n\n (0, _testCase.moduleFor)('Rendering test: non-interactive actions', class extends _testCase.RenderingTest {\n getBootOptions() {\n return { isInteractive: false };\n }\n\n [`@test doesn't attatch actions`](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n fire() {\n assert.ok(false);\n }\n }\n }),\n template: ``\n });\n\n this.render('{{foo-bar tagName=\"\"}}');\n\n this.assertHTML('');\n\n this.$('button').click();\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/engine-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/glimmer', '@ember/engine', '@ember/-internals/routing', '@ember/runloop'], function (_testCase, _abstractTestCase, _helpers, _controller, _runtime, _glimmer, _engine, _routing, _runloop) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Application test: engine rendering', class extends _testCase.ApplicationTest {\n get routerOptions() {\n return {\n location: 'none',\n setupRouter() {\n this._super(...arguments);\n let getRoute = this._routerMicrolib.getRoute;\n this._enginePromises = Object.create(null);\n this._resolvedEngines = Object.create(null);\n\n this._routerMicrolib.getRoute = name => {\n let engineInfo = this._engineInfoByRoute[name];\n if (!engineInfo) {\n return getRoute(name);\n }\n\n let engineName = engineInfo.name;\n if (this._resolvedEngines[engineName]) {\n return getRoute(name);\n }\n\n let enginePromise = this._enginePromises[engineName];\n\n if (!enginePromise) {\n enginePromise = new _runtime.RSVP.Promise(resolve => {\n setTimeout(() => {\n this._resolvedEngines[engineName] = true;\n\n resolve();\n }, 1);\n });\n this._enginePromises[engineName] = enginePromise;\n }\n\n return enginePromise.then(() => getRoute(name));\n };\n }\n };\n }\n\n setupAppAndRoutableEngine(hooks = []) {\n let self = this;\n\n this.addTemplate('application', 'Application{{outlet}}');\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {\n this.route('post', function () {\n this.route('comments');\n this.route('likes');\n });\n this.route('category', { path: 'category/:id' });\n this.route('author', { path: 'author/:id' });\n });\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('controller:application', _controller.default.extend({\n queryParams: ['lang'],\n lang: ''\n }));\n this.register('controller:category', _controller.default.extend({\n queryParams: ['type']\n }));\n this.register('controller:authorKtrl', _controller.default.extend({\n queryParams: ['official']\n }));\n this.register('template:application', (0, _helpers.compile)('Engine{{lang}}{{outlet}}'));\n this.register('route:application', _routing.Route.extend({\n model() {\n hooks.push('engine - application');\n }\n }));\n this.register('route:author', _routing.Route.extend({\n controllerName: 'authorKtrl'\n }));\n\n if (self._additionalEngineRegistrations) {\n self._additionalEngineRegistrations.call(this);\n }\n }\n }));\n }\n\n setupAppAndRoutelessEngine(hooks) {\n this.setupRoutelessEngine(hooks);\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('Engine'));\n this.register('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n setupAppAndRoutableEngineWithPartial(hooks) {\n this.addTemplate('application', 'Application{{outlet}}');\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:foo', (0, _helpers.compile)('foo partial'));\n this.register('template:application', (0, _helpers.compile)('Engine{{outlet}} {{partial \"foo\"}}'));\n this.register('route:application', _routing.Route.extend({\n model() {\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n setupRoutelessEngine(hooks) {\n this.addTemplate('application', 'Application{{mount \"chat-engine\"}}');\n this.add('route:application', _routing.Route.extend({\n model() {\n hooks.push('application - application');\n }\n }));\n }\n\n setupAppAndRoutlessEngineWithPartial(hooks) {\n this.setupRoutelessEngine(hooks);\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:foo', (0, _helpers.compile)('foo partial'));\n this.register('template:application', (0, _helpers.compile)('Engine {{partial \"foo\"}}'));\n this.register('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n hooks.push('engine - application');\n }\n }));\n }\n }));\n }\n\n additionalEngineRegistrations(callback) {\n this._additionalEngineRegistrations = callback;\n }\n\n setupEngineWithAttrs() {\n this.addTemplate('application', 'Application{{mount \"chat-engine\"}}');\n\n this.add('engine:chat-engine', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:components/foo-bar', (0, _helpers.compile)(`{{partial \"troll\"}}`));\n this.register('template:troll', (0, _helpers.compile)('{{attrs.wat}}'));\n this.register('controller:application', _controller.default.extend({\n contextType: 'Engine'\n }));\n this.register('template:application', (0, _helpers.compile)('Engine {{foo-bar wat=contextType}}'));\n }\n }));\n }\n\n stringsEndWith(str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n }\n\n ['@test attrs in an engine']() {\n this.setupEngineWithAttrs([]);\n\n return this.visit('/').then(() => {\n this.assertText('ApplicationEngine Engine');\n });\n }\n\n ['@test sharing a template between engine and application has separate refinements']() {\n this.assert.expect(1);\n\n let sharedTemplate = (0, _helpers.compile)(_abstractTestCase.strip`\n

{{contextType}}

\n {{ambiguous-curlies}}\n\n {{outlet}}\n `);\n\n this.add('template:application', sharedTemplate);\n this.add('controller:application', _controller.default.extend({\n contextType: 'Application',\n 'ambiguous-curlies': 'Controller Data!'\n }));\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n\n this.register('controller:application', _controller.default.extend({\n contextType: 'Engine'\n }));\n this.register('template:application', sharedTemplate);\n this.register('template:components/ambiguous-curlies', (0, _helpers.compile)(_abstractTestCase.strip`\n

Component!

\n `));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationController Data!EngineComponent!');\n });\n }\n\n ['@test sharing a layout between engine and application has separate refinements']() {\n this.assert.expect(1);\n\n let sharedLayout = (0, _helpers.compile)(_abstractTestCase.strip`\n {{ambiguous-curlies}}\n `);\n\n let sharedComponent = _glimmer.Component.extend({\n layout: sharedLayout\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n

Application

\n {{my-component ambiguous-curlies=\"Local Data!\"}}\n {{outlet}}\n `);\n\n this.add('component:my-component', sharedComponent);\n\n this.router.map(function () {\n this.mount('blog');\n });\n this.add('route-map:blog', function () {});\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)(_abstractTestCase.strip`\n

Engine

\n {{my-component}}\n {{outlet}}\n `));\n this.register('component:my-component', sharedComponent);\n this.register('template:components/ambiguous-curlies', (0, _helpers.compile)(_abstractTestCase.strip`\n

Component!

\n `));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationLocal Data!EngineComponent!');\n });\n }\n\n ['@test visit() with `shouldRender: true` returns a promise that resolves when application and engine templates have rendered'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected model hooks were fired');\n });\n }\n\n ['@test visit() with `shouldRender: false` returns a promise that resolves without rendering'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/blog', { shouldRender: false }).then(() => {\n assert.strictEqual(document.getElementById('qunit-fixture').children.length, 0, `there are no elements in the qunit-fixture element`);\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected model hooks were fired');\n });\n }\n\n ['@test visit() with `shouldRender: true` returns a promise that resolves when application and routeless engine templates have rendered'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutelessEngine(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test visit() with partials in routable engine'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutableEngineWithPartial(hooks);\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine foo partial');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test visit() with partials in non-routable engine'](assert) {\n assert.expect(2);\n\n let hooks = [];\n\n this.setupAppAndRoutlessEngineWithPartial(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n this.assertText('ApplicationEngine foo partial');\n\n this.assert.deepEqual(hooks, ['application - application', 'engine - application'], 'the expected hooks were fired');\n });\n }\n\n ['@test deactivate should be called on Engine Routes before destruction'](assert) {\n assert.expect(3);\n\n this.setupAppAndRoutableEngine();\n\n this.add('engine:blog', _engine.default.extend({\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('Engine{{outlet}}'));\n this.register('route:application', _routing.Route.extend({\n deactivate() {\n assert.notOk(this.isDestroyed, 'Route is not destroyed');\n assert.notOk(this.isDestroying, 'Route is not being destroyed');\n }\n }));\n }\n }));\n\n return this.visit('/blog').then(() => {\n this.assertText('ApplicationEngine');\n });\n }\n\n ['@test engine should lookup and use correct controller']() {\n this.setupAppAndRoutableEngine();\n\n return this.visit('/blog?lang=English').then(() => {\n this.assertText('ApplicationEngineEnglish');\n });\n }\n\n ['@test error substate route works for the application route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:application_error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:application_error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationError! Oh, noes!');\n });\n }\n\n ['@test error route works for the application route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test error substate route works for a child route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:post_error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:post_error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test error route works for a child route of an Engine'](assert) {\n assert.expect(2);\n\n let errorEntered = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:post.error', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(errorEntered.resolve);\n }\n }));\n this.register('template:post.error', (0, _helpers.compile)('Error! {{model.message}}'));\n this.register('route:post.comments', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject(new Error('Oh, noes!'));\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n return this.transitionTo('blog.post.comments');\n }).then(() => {\n return errorEntered.promise;\n }).then(() => {\n this.assertText('ApplicationEngineError! Oh, noes!');\n });\n }\n\n ['@test loading substate route works for the application route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:application_loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:application_loading', (0, _helpers.compile)('Loading'));\n this.register('template:post', (0, _helpers.compile)('Post'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n let transition = this.transitionTo('blog.post');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEnginePost');\n done();\n });\n });\n\n return transition;\n });\n }\n\n ['@test loading route works for the application route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('route:loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:loading', (0, _helpers.compile)('Loading'));\n this.register('template:post', (0, _helpers.compile)('Post'));\n this.register('route:post', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/').then(() => {\n this.assertText('Application');\n let transition = this.transitionTo('blog.post');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEnginePost');\n done();\n });\n });\n\n return transition;\n });\n }\n\n ['@test loading substate route works for a child route of an Engine'](assert) {\n assert.expect(3);\n\n let resolveLoading;\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:post', (0, _helpers.compile)('{{outlet}}'));\n this.register('template:post.comments', (0, _helpers.compile)('Comments'));\n this.register('template:post.likes_loading', (0, _helpers.compile)('Loading'));\n this.register('template:post.likes', (0, _helpers.compile)('Likes'));\n this.register('route:post.likes', _routing.Route.extend({\n model() {\n return new _runtime.RSVP.Promise(resolve => {\n resolveLoading = resolve;\n });\n }\n }));\n });\n\n return this.visit('/blog/post/comments').then(() => {\n this.assertText('ApplicationEngineComments');\n let transition = this.transitionTo('blog.post.likes');\n\n this.runTaskNext().then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading();\n });\n\n return transition.then(() => this.runTaskNext()).then(() => this.assertText('ApplicationEngineLikes'));\n });\n }\n\n ['@test loading route works for a child route of an Engine'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let loadingEntered = _runtime.RSVP.defer();\n let resolveLoading = _runtime.RSVP.defer();\n\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:post', (0, _helpers.compile)('{{outlet}}'));\n this.register('template:post.comments', (0, _helpers.compile)('Comments'));\n this.register('route:post.loading', _routing.Route.extend({\n activate() {\n (0, _runloop.next)(loadingEntered.resolve);\n }\n }));\n this.register('template:post.loading', (0, _helpers.compile)('Loading'));\n this.register('template:post.likes', (0, _helpers.compile)('Likes'));\n this.register('route:post.likes', _routing.Route.extend({\n model() {\n return resolveLoading.promise;\n }\n }));\n });\n\n return this.visit('/blog/post/comments').then(() => {\n this.assertText('ApplicationEngineComments');\n let transition = this.transitionTo('blog.post.likes');\n\n loadingEntered.promise.then(() => {\n this.assertText('ApplicationEngineLoading');\n resolveLoading.resolve();\n\n return this.runTaskNext().then(() => {\n this.assertText('ApplicationEngineLikes');\n done();\n });\n });\n\n return transition;\n });\n }\n\n [\"@test query params don't have stickiness by default between model\"](assert) {\n assert.expect(1);\n let tmpl = '{{#link-to \"blog.category\" 1337}}Category 1337{{/link-to}}';\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:category', (0, _helpers.compile)(tmpl));\n });\n\n return this.visit('/blog/category/1?type=news').then(() => {\n let suffix = '/blog/category/1337';\n let href = this.element.querySelector('a').href;\n\n // check if link ends with the suffix\n assert.ok(this.stringsEndWith(href, suffix));\n });\n }\n\n ['@test query params in customized controllerName have stickiness by default between model'](assert) {\n assert.expect(2);\n let tmpl = '{{#link-to \"blog.author\" 1337 class=\"author-1337\"}}Author 1337{{/link-to}}{{#link-to \"blog.author\" 1 class=\"author-1\"}}Author 1{{/link-to}}';\n this.setupAppAndRoutableEngine();\n this.additionalEngineRegistrations(function () {\n this.register('template:author', (0, _helpers.compile)(tmpl));\n });\n\n return this.visit('/blog/author/1?official=true').then(() => {\n let suffix1 = '/blog/author/1?official=true';\n let href1 = this.element.querySelector('.author-1').href;\n let suffix1337 = '/blog/author/1337';\n let href1337 = this.element.querySelector('.author-1337').href;\n\n // check if link ends with the suffix\n assert.ok(this.stringsEndWith(href1, suffix1), `${href1} ends with ${suffix1}`);\n assert.ok(this.stringsEndWith(href1337, suffix1337), `${href1337} ends with ${suffix1337}`);\n });\n }\n\n ['@test visit() routable engine which errors on init'](assert) {\n assert.expect(1);\n\n let hooks = [];\n\n this.additionalEngineRegistrations(function () {\n this.register('route:application', _routing.Route.extend({\n init() {\n throw new Error('Whoops! Something went wrong...');\n }\n }));\n });\n\n this.setupAppAndRoutableEngine(hooks);\n\n return this.visit('/', { shouldRender: true }).then(() => {\n return this.visit('/blog');\n }).catch(error => {\n assert.equal(error.message, 'Whoops! Something went wrong...');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/hot-reload-test', ['@ember/-internals/environment', '@ember/service', '@ember/-internals/glimmer', '@glimmer/util', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_environment, _service, _glimmer, _util, _testCase, _abstractTestCase) {\n 'use strict';\n\n // This simuates what the template hot-reloading would do in development mode\n // to avoid regressions\n\n (0, _testCase.moduleFor)('Appliation test: template hot reloading', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n this._APPLICATION_TEMPLATE_WRAPPER = _environment.ENV._APPLICATION_TEMPLATE_WRAPPER;\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;\n\n let didCreateReloader = reloader => {\n this.reloader = reloader;\n };\n\n this.add('service:reloader', _service.default.extend({\n init() {\n this._super(...arguments);\n this.revisions = {};\n this.callbacks = [];\n\n didCreateReloader(this);\n },\n\n onReload(callback) {\n this.callbacks.push(callback);\n },\n\n revisionFor(name) {\n return this.revisions[name];\n },\n\n invalidate(name) {\n let revision = this.revisions[name];\n\n if (revision === undefined) {\n revision = 0;\n }\n\n this.revisions[name] = ++revision;\n\n this.callbacks.forEach(callback => callback());\n }\n }));\n\n this.add('helper:hot-reload', _glimmer.Helper.extend({\n reloader: (0, _service.inject)(),\n\n init() {\n this._super(...arguments);\n this.reloader.onReload(() => this.recompute());\n },\n\n compute([name]) {\n let revision = this.reloader.revisionFor(name);\n\n if (revision === undefined) {\n return name;\n } else {\n return `${name}--hot-reload-${revision}`;\n }\n }\n }));\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = this._APPLICATION_TEMPLATE_WRAPPER;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n hotReload(name, template) {\n let reloader = (0, _util.expect)(this.reloader);\n let revision = (reloader.revisionFor(name) || 0) + 1;\n let ComponentClass = this.applicationInstance.resolveRegistration(`component:${name}`) || null;\n\n this.addComponent(`${name}--hot-reload-${revision}`, {\n ComponentClass,\n template\n });\n\n reloader.invalidate(name);\n }\n\n ['@test hot reloading template-only components']() {\n this.addTemplate('application', _abstractTestCase.strip`\n [{{component (hot-reload \"x-foo\") name=\"first\"}}]\n [{{component (hot-reload \"x-foo\") name=\"second\"}}]\n [{{component (hot-reload \"x-bar\")}}]\n `);\n\n this.addComponent('x-foo', {\n ComponentClass: null,\n template: 'x-foo: {{@name}}'\n });\n\n this.addComponent('x-bar', {\n ComponentClass: null,\n template: 'x-bar'\n });\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first]\n [x-foo: second]\n [x-bar]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', '

{{@name}}

');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

first

]\n [

second

]\n [x-bar]\n `);\n\n this.runTask(() => {\n this.hotReload('x-bar', '

wow

');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

first

]\n [

second

]\n [

wow

]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo {{@name}}');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo first]\n [x-foo second]\n [

wow

]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo: {{@name}}');\n this.hotReload('x-bar', 'x-bar');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first]\n [x-foo: second]\n [x-bar]\n `);\n });\n }\n\n ['@test hot reloading class-based components']() {\n this.addTemplate('application', _abstractTestCase.strip`\n [{{component (hot-reload \"x-foo\") name=\"first\"}}]\n [{{component (hot-reload \"x-foo\") name=\"second\"}}]\n [{{component (hot-reload \"x-bar\")}}]\n `);\n\n let id = 0;\n\n this.addComponent('x-foo', {\n ComponentClass: _glimmer.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n this.set('id', id++);\n }\n }),\n template: 'x-foo: {{@name}} ({{this.id}})'\n });\n\n this.addComponent('x-bar', {\n ComponentClass: _glimmer.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n this.set('id', id++);\n }\n }),\n template: 'x-bar ({{this.id}})'\n });\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first (0)]\n [x-foo: second (1)]\n [x-bar (2)]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', '

{{@name}} ({{this.id}})

');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

first (3)

]\n [

second (4)

]\n [x-bar (2)]\n `);\n\n this.runTask(() => {\n this.hotReload('x-bar', '

wow ({{this.id}})

');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [

first (3)

]\n [

second (4)

]\n [

wow (5)

]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo {{@name}} ({{this.id}})');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo first (6)]\n [x-foo second (7)]\n [

wow (5)

]\n `);\n\n this.runTask(() => {\n this.hotReload('x-foo', 'x-foo: {{@name}} ({{this.id}})');\n this.hotReload('x-bar', 'x-bar ({{this.id}})');\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n [x-foo: first (8)]\n [x-foo: second (9)]\n [x-bar (10)]\n `);\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/application/rendering-test', ['@ember/-internals/environment', '@ember/controller', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/routing', '@ember/-internals/glimmer'], function (_environment, _controller, _testCase, _abstractTestCase, _routing, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Application test: rendering', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n this._APPLICATION_TEMPLATE_WRAPPER = _environment.ENV._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = this._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n ['@test it can render the application template with a wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = true;\n\n this.addTemplate('application', 'Hello world!');\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.element, { content: 'Hello world!' });\n });\n }\n\n ['@test it can render the application template without a wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\n this.addTemplate('application', 'Hello world!');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello world!');\n });\n }\n\n ['@test it can access the model provided by the route']() {\n this.add('route:application', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('application', _abstractTestCase.strip`\n \n `);\n\n return this.visit('/').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n `);\n });\n }\n\n ['@test it can render a nested route']() {\n this.router.map(function () {\n this.route('lists', function () {\n this.route('colors', function () {\n this.route('favorite');\n });\n });\n });\n\n // The \"favorite\" route will inherit the model\n this.add('route:lists.colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('lists.colors.favorite', _abstractTestCase.strip`\n \n `);\n\n return this.visit('/lists/colors/favorite').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n `);\n });\n }\n\n ['@test it can render into named outlets']() {\n this.router.map(function () {\n this.route('colors');\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n \n
{{outlet}}
\n `);\n\n this.addTemplate('nav', _abstractTestCase.strip`\n Ember\n `);\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('nav', {\n into: 'application',\n outlet: 'nav'\n });\n }\n }));\n\n this.add('route:colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('colors', _abstractTestCase.strip`\n \n `);\n\n return this.visit('/colors').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n
\n \n
\n `);\n });\n }\n\n ['@test it can render into named outlets']() {\n this.router.map(function () {\n this.route('colors');\n });\n\n this.addTemplate('application', _abstractTestCase.strip`\n \n
{{outlet}}
\n `);\n\n this.addTemplate('nav', _abstractTestCase.strip`\n Ember\n `);\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('nav', {\n into: 'application',\n outlet: 'nav'\n });\n }\n }));\n\n this.add('route:colors', _routing.Route.extend({\n model() {\n return ['red', 'yellow', 'blue'];\n }\n }));\n\n this.addTemplate('colors', _abstractTestCase.strip`\n \n `);\n\n return this.visit('/colors').then(() => {\n this.assertInnerHTML(_abstractTestCase.strip`\n \n
\n \n
\n `);\n });\n }\n\n ['@test it should update the outlets when switching between routes']() {\n this.router.map(function () {\n this.route('a');\n this.route('b', function () {\n this.route('c');\n this.route('d');\n });\n });\n\n this.addTemplate('a', 'A{{outlet}}');\n this.addTemplate('b', 'B{{outlet}}');\n this.addTemplate('b.c', 'C');\n this.addTemplate('b.d', 'D');\n\n return this.visit('/b/c').then(() => {\n // this.assertComponentElement(this.firstChild, { content: 'BC' });\n this.assertText('BC');\n return this.visit('/a');\n }).then(() => {\n // this.assertComponentElement(this.firstChild, { content: 'A' });\n this.assertText('A');\n return this.visit('/b/d');\n }).then(() => {\n this.assertText('BD');\n // this.assertComponentElement(this.firstChild, { content: 'BD' });\n });\n }\n\n ['@test it should produce a stable DOM when the model changes']() {\n this.router.map(function () {\n this.route('color', { path: '/colors/:color' });\n });\n\n this.add('route:color', _routing.Route.extend({\n model(params) {\n return params.color;\n }\n }));\n\n this.addTemplate('color', 'color: {{model}}');\n\n return this.visit('/colors/red').then(() => {\n this.assertInnerHTML('color: red');\n this.takeSnapshot();\n return this.visit('/colors/green');\n }).then(() => {\n this.assertInnerHTML('color: green');\n this.assertInvariants();\n });\n }\n\n ['@test it should have the right controller in scope for the route template']() {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n });\n\n this.add('controller:a', _controller.default.extend({\n value: 'a'\n }));\n\n this.add('controller:b', _controller.default.extend({\n value: 'b'\n }));\n\n this.addTemplate('a', '{{value}}');\n this.addTemplate('b', '{{value}}');\n\n return this.visit('/a').then(() => {\n this.assertText('a');\n return this.visit('/b');\n }).then(() => this.assertText('b'));\n }\n\n ['@test it should update correctly when the controller changes']() {\n this.router.map(function () {\n this.route('color', { path: '/colors/:color' });\n });\n\n this.add('route:color', _routing.Route.extend({\n model(params) {\n return { color: params.color };\n },\n\n renderTemplate(controller, model) {\n this.render({ controller: model.color, model });\n }\n }));\n\n this.add('controller:red', _controller.default.extend({\n color: 'red'\n }));\n\n this.add('controller:green', _controller.default.extend({\n color: 'green'\n }));\n\n this.addTemplate('color', 'model color: {{model.color}}, controller color: {{color}}');\n\n return this.visit('/colors/red').then(() => {\n this.assertInnerHTML('model color: red, controller color: red');\n return this.visit('/colors/green');\n }).then(() => {\n this.assertInnerHTML('model color: green, controller color: green');\n });\n }\n\n ['@test it should produce a stable DOM when two routes render the same template']() {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n });\n\n this.add('route:a', _routing.Route.extend({\n model() {\n return 'A';\n },\n\n renderTemplate(controller, model) {\n this.render('common', { controller: 'common', model });\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n model() {\n return 'B';\n },\n\n renderTemplate(controller, model) {\n this.render('common', { controller: 'common', model });\n }\n }));\n\n this.add('controller:common', _controller.default.extend({\n prefix: 'common'\n }));\n\n this.addTemplate('common', '{{prefix}} {{model}}');\n\n return this.visit('/a').then(() => {\n this.assertInnerHTML('common A');\n this.takeSnapshot();\n return this.visit('/b');\n }).then(() => {\n this.assertInnerHTML('common B');\n this.assertInvariants();\n });\n }\n\n // Regression test, glimmer child outlets tried to assume the first element.\n // but the if put-args clobbered the args used by did-create-element.\n // I wish there was a way to assert that the OutletComponentManager did not\n // receive a didCreateElement.\n ['@test a child outlet is always a fragment']() {\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', '{{#if true}}1{{/if}}
2
');\n return this.visit('/').then(() => {\n this.assertInnerHTML('1
2
');\n });\n }\n\n ['@test it allows a transition during route activate']() {\n this.router.map(function () {\n this.route('a');\n });\n\n this.add('route:index', _routing.Route.extend({\n activate() {\n this.transitionTo('a');\n }\n }));\n\n this.addTemplate('a', 'Hello from A!');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello from A!');\n });\n }\n\n ['@test it emits a useful backtracking re-render assertion message']() {\n this.router.map(function () {\n this.route('routeWithError');\n });\n\n this.add('route:routeWithError', _routing.Route.extend({\n model() {\n return { name: 'Alex' };\n }\n }));\n\n this.addTemplate('routeWithError', 'Hi {{model.name}} {{x-foo person=model}}');\n\n this.addComponent('x-foo', {\n ComponentClass: _glimmer.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person.name', 'Ben');\n }\n }),\n template: 'Hi {{person.name}} from component'\n });\n\n let expectedBacktrackingMessage = /modified \"model\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"template:my-app\\/templates\\/routeWithError.hbs\" and modified in \"component:x-foo\"/;\n\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/routeWithError');\n }, expectedBacktrackingMessage);\n });\n }\n\n ['@test route templates with {{{undefined}}} [GH#14924] [GH#16172]']() {\n this.router.map(function () {\n this.route('first');\n this.route('second');\n });\n\n this.addTemplate('first', 'first');\n this.addTemplate('second', '{{{undefined}}}second');\n\n return this.visit('/first').then(() => {\n this.assertText('first');\n return this.visit('/second');\n }).then(() => {\n this.assertText('second');\n return this.visit('/first');\n }).then(() => {\n this.assertText('first');\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/angle-bracket-invocation-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _metal, _helpers, _abstractTestCase, _testHelpers) {\n 'use strict';\n\n if (true /* EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION */) {\n (0, _testCase.moduleFor)('AngleBracket Invocation', class extends _testCase.RenderingTest {\n '@test it can resolve to x-blah'() {\n this.registerComponent('x-blah', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can resolve to x-blah'() {\n this.registerComponent('x-blah', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can render a basic template only component'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can render a basic component with template and javascript'() {\n this.registerComponent('foo-bar', {\n template: 'FIZZ BAR {{local}}',\n ComponentClass: _helpers.Component.extend({ local: 'hey' })\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'FIZZ BAR hey' });\n }\n\n '@test it can render a single word component name'() {\n this.registerComponent('foo', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n '@test it can not render a component name without initial capital letter'(assert) {\n this.registerComponent('div', {\n ComponentClass: _helpers.Component.extend({\n init() {\n assert.ok(false, 'should not have created component');\n }\n })\n });\n\n this.render('
');\n\n this.assertElement(this.firstChild, { tagName: 'div', content: '' });\n }\n\n '@test it can have a custom id and it is not bound'() {\n this.registerComponent('foo-bar', { template: '{{id}} {{elementId}}' });\n\n this.render('', {\n customId: 'bizz'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bar bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bizz'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n }\n\n '@test it can have a custom tagName'() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n '@test it can have a custom tagName from the invocation'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n '@test it can have custom classNames'() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n }\n\n '@test class property on components can be dynamic'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('', {\n fooBar: true\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n }\n\n '@test it can set custom classNames from the invocation'() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n \n \n \n `);\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n '@test it has an element'() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n '@test it has the right parentView and childViews'(assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n '@test it renders passed named arguments'() {\n this.registerComponent('foo-bar', {\n template: '{{@foo}}'\n });\n\n this.render('', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n '@test it reflects named arguments as properties'() {\n this.registerComponent('foo-bar', {\n template: '{{foo}}'\n });\n\n this.render('', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n '@test it can render a basic component with a block'() {\n this.registerComponent('foo-bar', {\n template: '{{yield}} - In component'\n });\n\n this.render('hello');\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n }\n\n '@test it can yield internal and external properties positionally'() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n greeting: 'hello'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield greeting greetee.firstName}}'\n });\n\n this.render('{{name}} {{person.lastName}}, {{greeting}}', {\n person: {\n firstName: 'Joel',\n lastName: 'Kang'\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'Dora',\n lastName: 'the Explorer'\n }));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hello'\n });\n\n this.runTask(() => (0, _metal.set)(instance, 'greeting', 'hola'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hola'\n });\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'greeting', 'hello');\n (0, _metal.set)(this.context, 'person', {\n firstName: 'Joel',\n lastName: 'Kang'\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n }\n\n '@test positional parameters are not allowed'() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['first', 'second']\n }),\n template: '{{first}}{{second}}'\n });\n\n // this is somewhat silly as the browser \"corrects\" for these as\n // attribute names, but regardless the thing we care about here is that\n // they are **not** used as positional params\n this.render('');\n\n this.assertText('');\n }\n\n '@test can invoke curried components with capitalized block param names'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render(_abstractTestCase.strip`\n {{#with (component 'foo-bar') as |Other|}}\n \n {{/with}}\n `);\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can invoke curried components with named args'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.registerComponent('test-harness', { template: '<@foo />' });\n this.render(_abstractTestCase.strip`{{test-harness foo=(component 'foo-bar')}}`);\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can invoke curried components with a path'() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.registerComponent('test-harness', { template: '' });\n this.render(_abstractTestCase.strip`{{test-harness foo=(component 'foo-bar')}}`);\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n '@test can not invoke curried components with an implicit `this` path'(assert) {\n assert.expect(0);\n this.registerComponent('foo-bar', {\n template: 'hello',\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n assert.ok(false, 'should not have instantiated');\n }\n })\n });\n this.registerComponent('test-harness', {\n template: ''\n });\n this.render(_abstractTestCase.strip`{{test-harness foo=(hash bar=(component 'foo-bar'))}}`);\n }\n\n '@test has-block'() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (has-block)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n \n `);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n '@test includes invocation specified attributes in root element (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend(),\n template: 'hello'\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test includes invocation specified attributes in `...attributes` slot in tagless component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
hello
'\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test merges attributes with `...attributes` in tagless component (\"splattributes\")'() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n instance = this;\n this._super(...arguments);\n this.localProp = 'qux';\n }\n }),\n template: '
hello
'\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n (0, _metal.set)(instance, 'localProp', 'QUZ');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'QUZ', 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n (0, _metal.set)(instance, 'localProp', 'qux');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-derp': 'qux', 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n '@test merges class attribute with `...attributes` in tagless component (\"splattributes\")'() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n instance = this;\n this._super(...arguments);\n this.localProp = 'qux';\n }\n }),\n template: '
hello
'\n });\n\n this.render('', { bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', undefined);\n (0, _metal.set)(instance, 'localProp', 'QUZ');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('QUZ') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', 'bar');\n (0, _metal.set)(instance, 'localProp', 'qux');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('qux bar') },\n content: 'hello'\n });\n }\n\n '@test merges class attribute with `...attributes` in yielded contextual component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '{{yield (hash baz=(component \"foo-bar/baz\"))}}'\n });\n this.registerComponent('foo-bar/baz', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
hello
'\n });\n\n this.render('');\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('default-class custom-class'), title: 'foo' },\n content: 'hello'\n });\n }\n\n '@test the attributes passed on invocation trump over the default ones on elements with `...attributes` in yielded contextual component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '{{yield (hash baz=(component \"foo-bar/baz\"))}}'\n });\n this.registerComponent('foo-bar/baz', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
hello
'\n });\n\n this.render('');\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'foo' },\n content: 'hello'\n });\n }\n\n '@test can include `...attributes` in multiple elements in tagless component (\"splattributes\")'() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: '
hello

world

'\n });\n\n this.render('', { foo: 'foo', bar: 'bar' });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'FOO' },\n content: 'world'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertElement(this.nthChild(1), {\n tagName: 'p',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'world'\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/append-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_metal, _testCase, _helpers, _abstractTestCase) {\n 'use strict';\n\n class AbstractAppendTest extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.components = [];\n this.ids = [];\n }\n\n teardown() {\n this.component = null;\n\n this.components.forEach(component => {\n this.runTask(() => component.destroy());\n });\n\n this.ids.forEach(id => {\n let $element = document.getElementById(id);\n if ($element) {\n $element.parentNode.removeChild($element);\n }\n // this.assert.strictEqual($element.length, 0, `Should not leak element: #${id}`);\n });\n\n super.teardown();\n }\n\n /* abstract append(component): Element; */\n\n didAppend(component) {\n this.components.push(component);\n this.ids.push(component.elementId);\n }\n\n ['@test lifecycle hooks during component append'](assert) {\n let hooks = [];\n\n let oldRegisterComponent = this.registerComponent;\n let componentsByName = {};\n\n // TODO: refactor/combine with other life-cycle tests\n this.registerComponent = function (name, _options) {\n function pushHook(hookName) {\n hooks.push([name, hookName]);\n }\n\n let options = {\n ComponentClass: _options.ComponentClass.extend({\n init() {\n this._super(...arguments);\n if (name in componentsByName) {\n throw new TypeError('Component named: ` ' + name + ' ` already registered');\n }\n componentsByName[name] = this;\n pushHook('init');\n this.on('init', () => pushHook('on(init)'));\n },\n\n didReceiveAttrs() {\n pushHook('didReceiveAttrs');\n },\n\n willInsertElement() {\n pushHook('willInsertElement');\n },\n\n willRender() {\n pushHook('willRender');\n },\n\n didInsertElement() {\n pushHook('didInsertElement');\n },\n\n didRender() {\n pushHook('didRender');\n },\n\n didUpdateAttrs() {\n pushHook('didUpdateAttrs');\n },\n\n willUpdate() {\n pushHook('willUpdate');\n },\n\n didUpdate() {\n pushHook('didUpdate');\n },\n\n willDestroyElement() {\n pushHook('willDestroyElement');\n },\n\n willClearRender() {\n pushHook('willClearRender');\n },\n\n didDestroyElement() {\n pushHook('didDestroyElement');\n },\n\n willDestroy() {\n pushHook('willDestroy');\n this._super(...arguments);\n }\n }),\n template: _options.template\n };\n\n oldRegisterComponent.call(this, name, options);\n };\n\n this.registerComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-parent'\n }),\n\n template: '[parent: {{foo}}]{{#x-child bar=foo}}[yielded: {{foo}}]{{/x-child}}'\n });\n\n this.registerComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '[child: {{bar}}]{{yield}}'\n });\n\n let XParent;\n\n XParent = this.owner.factoryFor('component:x-parent');\n\n this.component = XParent.create({ foo: 'zomg' });\n\n assert.deepEqual(hooks, [['x-parent', 'init'], ['x-parent', 'on(init)']], 'creation of x-parent');\n\n hooks.length = 0;\n\n this.element = this.append(this.component);\n\n assert.deepEqual(hooks, [['x-parent', 'willInsertElement'], ['x-child', 'init'], ['x-child', 'on(init)'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willRender'], ['x-child', 'willInsertElement'], ['x-child', 'didInsertElement'], ['x-child', 'didRender'], ['x-parent', 'didInsertElement'], ['x-parent', 'didRender']], 'appending of x-parent');\n\n hooks.length = 0;\n\n this.runTask(() => componentsByName['x-parent'].rerender());\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'rerender x-parent');\n\n hooks.length = 0;\n\n this.runTask(() => componentsByName['x-child'].rerender());\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'rerender x-child');\n\n hooks.length = 0;\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'wow'));\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'didUpdateAttrs'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'set foo = wow');\n\n hooks.length = 0;\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'zomg'));\n\n assert.deepEqual(hooks, [['x-parent', 'willUpdate'], ['x-parent', 'willRender'], ['x-child', 'didUpdateAttrs'], ['x-child', 'didReceiveAttrs'], ['x-child', 'willUpdate'], ['x-child', 'willRender'], ['x-child', 'didUpdate'], ['x-child', 'didRender'], ['x-parent', 'didUpdate'], ['x-parent', 'didRender']], 'set foo = zomg');\n\n hooks.length = 0;\n\n this.runTask(() => this.component.destroy());\n\n assert.deepEqual(hooks, [['x-parent', 'willDestroyElement'], ['x-parent', 'willClearRender'], ['x-child', 'willDestroyElement'], ['x-child', 'willClearRender'], ['x-child', 'didDestroyElement'], ['x-parent', 'didDestroyElement'], ['x-parent', 'willDestroy'], ['x-child', 'willDestroy']], 'destroy');\n }\n\n ['@test appending, updating and destroying a single component'](assert) {\n let willDestroyCalled = 0;\n\n this.registerComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-parent',\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: '[parent: {{foo}}]{{#x-child bar=foo}}[yielded: {{foo}}]{{/x-child}}'\n });\n\n this.registerComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '[child: {{bar}}]{{yield}}'\n });\n\n let XParent;\n\n XParent = this.owner.factoryFor('component:x-parent');\n\n this.component = XParent.create({ foo: 'zomg' });\n\n assert.ok(!this.component.element, 'precond - should not have an element');\n\n this.element = this.append(this.component);\n\n let componentElement = this.component.element;\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'wow'));\n\n this.assertComponentElement(componentElement, {\n content: '[parent: wow][child: wow][yielded: wow]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(this.component, 'foo', 'zomg'));\n\n this.assertComponentElement(componentElement, {\n content: '[parent: zomg][child: zomg][yielded: zomg]'\n });\n\n assert.equal(componentElement.parentElement, this.element, 'It should be attached to the target');\n\n this.runTask(() => this.component.destroy());\n\n assert.ok(!this.component.element, 'It should not have an element');\n assert.ok(!componentElement.parentElement, 'The component element should be detached');\n\n this.assert.equal(willDestroyCalled, 1);\n }\n\n ['@test releasing a root component after it has been destroy'](assert) {\n let renderer = this.owner.lookup('renderer:-dom');\n\n this.registerComponent('x-component', {\n ComponentClass: _helpers.Component.extend()\n });\n\n this.component = this.owner.factoryFor('component:x-component').create();\n this.append(this.component);\n\n assert.equal(renderer._roots.length, 1, 'added a root component');\n\n this.runTask(() => this.component.destroy());\n\n assert.equal(renderer._roots.length, 0, 'released the root component');\n }\n\n ['@test appending, updating and destroying multiple components'](assert) {\n let willDestroyCalled = 0;\n\n this.registerComponent('x-first', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-first',\n\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: 'x-first {{foo}}!'\n });\n\n this.registerComponent('x-second', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/x-second',\n\n willDestroyElement() {\n willDestroyCalled++;\n }\n }),\n\n template: 'x-second {{bar}}!'\n });\n\n let First, Second;\n\n First = this.owner.factoryFor('component:x-first');\n Second = this.owner.factoryFor('component:x-second');\n\n let first = First.create({ foo: 'foo' });\n let second = Second.create({ bar: 'bar' });\n\n this.assert.ok(!first.element, 'precond - should not have an element');\n this.assert.ok(!second.element, 'precond - should not have an element');\n\n let wrapper1, wrapper2;\n\n this.runTask(() => wrapper1 = this.append(first));\n this.runTask(() => wrapper2 = this.append(second));\n\n let componentElement1 = first.element;\n let componentElement2 = second.element;\n\n this.assertComponentElement(componentElement1, { content: 'x-first foo!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(first, 'foo', 'FOO'));\n\n this.assertComponentElement(componentElement1, { content: 'x-first FOO!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => (0, _metal.set)(second, 'bar', 'BAR'));\n\n this.assertComponentElement(componentElement1, { content: 'x-first FOO!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second BAR!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => {\n (0, _metal.set)(first, 'foo', 'foo');\n (0, _metal.set)(second, 'bar', 'bar');\n });\n\n this.assertComponentElement(componentElement1, { content: 'x-first foo!' });\n this.assertComponentElement(componentElement2, {\n content: 'x-second bar!'\n });\n\n assert.equal(componentElement1.parentElement, wrapper1, 'The first component should be attached to the target');\n assert.equal(componentElement2.parentElement, wrapper2, 'The second component should be attached to the target');\n\n this.runTask(() => {\n first.destroy();\n second.destroy();\n });\n\n assert.ok(!first.element, 'The first component should not have an element');\n assert.ok(!second.element, 'The second component should not have an element');\n\n assert.ok(!componentElement1.parentElement, 'The first component element should be detached');\n assert.ok(!componentElement2.parentElement, 'The second component element should be detached');\n\n this.assert.equal(willDestroyCalled, 2);\n }\n\n ['@test can appendTo while rendering']() {\n let owner = this.owner;\n\n let append = component => {\n return this.append(component);\n };\n\n let element1, element2;\n this.registerComponent('first-component', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('component-one'),\n\n didInsertElement() {\n element1 = this.element;\n\n let SecondComponent = owner.factoryFor('component:second-component');\n\n append(SecondComponent.create());\n }\n })\n });\n\n this.registerComponent('second-component', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)(`component-two`),\n\n didInsertElement() {\n element2 = this.element;\n }\n })\n });\n\n let FirstComponent = this.owner.factoryFor('component:first-component');\n\n this.runTask(() => append(FirstComponent.create()));\n\n this.assertComponentElement(element1, { content: 'component-one' });\n this.assertComponentElement(element2, { content: 'component-two' });\n }\n\n ['@test can appendTo and remove while rendering'](assert) {\n let owner = this.owner;\n\n let append = component => {\n return this.append(component);\n };\n\n let element1, element2, element3, element4, component1, component2;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('foo-bar'),\n\n init() {\n this._super(...arguments);\n component1 = this;\n },\n\n didInsertElement() {\n element1 = this.element;\n\n let OtherRoot = owner.factoryFor('component:other-root');\n\n this._instance = OtherRoot.create({\n didInsertElement() {\n element2 = this.element;\n }\n });\n\n append(this._instance);\n },\n\n willDestroy() {\n this._instance.destroy();\n }\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)('baz-qux'),\n\n init() {\n this._super(...arguments);\n component2 = this;\n },\n\n didInsertElement() {\n element3 = this.element;\n\n let OtherRoot = owner.factoryFor('component:other-root');\n\n this._instance = OtherRoot.create({\n didInsertElement() {\n element4 = this.element;\n }\n });\n\n append(this._instance);\n },\n\n willDestroy() {\n this._instance.destroy();\n }\n })\n });\n\n let instantiatedRoots = 0;\n let destroyedRoots = 0;\n this.registerComponent('other-root', {\n ComponentClass: _helpers.Component.extend({\n layout: (0, _helpers.compile)(`fake-thing: {{counter}}`),\n init() {\n this._super(...arguments);\n this.counter = instantiatedRoots++;\n },\n willDestroy() {\n destroyedRoots++;\n this._super(...arguments);\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if showFooBar}}\n {{foo-bar}}\n {{else}}\n {{baz-qux}}\n {{/if}}\n `, { showFooBar: true });\n\n this.assertComponentElement(element1, {});\n this.assertComponentElement(element2, { content: 'fake-thing: 0' });\n assert.equal(instantiatedRoots, 1);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'showFooBar', false));\n\n assert.equal(instantiatedRoots, 2);\n assert.equal(destroyedRoots, 1);\n\n this.assertComponentElement(element3, {});\n this.assertComponentElement(element4, { content: 'fake-thing: 1' });\n\n this.runTask(() => {\n component1.destroy();\n component2.destroy();\n });\n\n assert.equal(instantiatedRoots, 2);\n assert.equal(destroyedRoots, 2);\n }\n }\n\n (0, _testCase.moduleFor)('append: no arguments (attaching to document.body)', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.append());\n this.didAppend(component);\n return document.body;\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: a selector', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.appendTo('#qunit-fixture'));\n this.didAppend(component);\n return document.getElementById('qunit-fixture');\n }\n\n ['@test raises an assertion when the target does not exist in the DOM'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n layoutName: 'components/foo-bar'\n }),\n template: 'FOO BAR!'\n });\n\n let FooBar = this.owner.factoryFor('component:foo-bar');\n\n this.component = FooBar.create();\n\n assert.ok(!this.component.element, 'precond - should not have an element');\n\n this.runTask(() => {\n expectAssertion(() => {\n this.component.appendTo('#does-not-exist-in-dom');\n }, /You tried to append to \\(#does-not-exist-in-dom\\) but that isn't in the DOM/);\n });\n\n assert.ok(!this.component.element, 'component should not have an element');\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: an element', class extends AbstractAppendTest {\n append(component) {\n let element = document.getElementById('qunit-fixture');\n this.runTask(() => component.appendTo(element));\n this.didAppend(component);\n return element;\n }\n });\n\n (0, _testCase.moduleFor)('appendTo: with multiple components', class extends AbstractAppendTest {\n append(component) {\n this.runTask(() => component.appendTo('#qunit-fixture'));\n this.didAppend(component);\n return document.getElementById('qunit-fixture');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/attribute-bindings-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal'], function (_testCase, _helpers, _abstractTestCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Attribute bindings integration', class extends _testCase.RenderingTest {\n ['@test it can have attribute bindings']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo:data-foo', 'bar:data-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo bar=bar}}', { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n }\n\n ['@test it can have attribute bindings with attrs']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['attrs.foo:data-foo', 'attrs.baz.bar:data-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=model.foo baz=model.baz}}', {\n model: { foo: undefined, baz: { bar: 'bar' } }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.foo', 'foo');\n (0, _metal.set)(this.context, 'model.baz.bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: undefined,\n baz: { bar: 'bar' }\n }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { 'data-bar': 'bar' }\n });\n }\n\n ['@test it can have attribute bindings with a nested path']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo.bar:data-foo-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo}}', { foo: { bar: 'foo-bar' } });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo.bar', 'FOO-BAR'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'FOO-BAR' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo.bar', undefined));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: 'foo-bar' }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo-bar': 'foo-bar' },\n content: 'hello'\n });\n }\n\n ['@test handles non-microsyntax attributeBindings']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['type']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar type=submit}}', {\n submit: 'submit'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', 'password'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'submit', 'submit'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'submit' },\n content: 'hello'\n });\n }\n\n ['@test non-microsyntax attributeBindings cannot contain nested paths']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo.bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar foo=foo}}', { foo: { bar: 'foo-bar' } });\n }, /Illegal attributeBinding: 'foo.bar' is not a valid attribute name./);\n }\n\n ['@test normalizes attributeBindings for property names']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['tiTLe']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar tiTLe=name}}', {\n name: 'qux'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'qux' },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'qux'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { title: 'qux' },\n content: 'hello'\n });\n }\n\n ['@test normalizes attributeBindings for attribute names']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo:data-FOO']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo}}', {\n foo: 'qux'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'qux' },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'qux'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': 'qux' },\n content: 'hello'\n });\n }\n\n ['@test attributeBindings preserves case for mixed-case attributes']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'svg',\n attributeBindings: ['viewBox']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{foo-bar viewBox=foo}}', {\n foo: '0 0 100 100'\n });\n\n this.assert.equal(this.firstChild.getAttribute('viewBox'), '0 0 100 100', 'viewBox attribute');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', null));\n\n this.assert.ok(!this.firstChild.hasAttribute('viewBox'), 'viewBox attribute removed');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', '0 0 100 200'));\n\n this.assert.equal(this.firstChild.getAttribute('viewBox'), '0 0 100 200', 'viewBox attribute');\n }\n\n ['@test attributeBindings handles null/undefined']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['fizz', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar fizz=fizz bar=bar}}', {\n fizz: null,\n bar: undefined\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fizz', 'fizz');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { fizz: 'fizz', bar: 'bar' },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fizz', null);\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n }\n\n ['@test attributeBindings handles number value']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['size']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar size=size}}', {\n size: 21\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'size', 0));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '0' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'size', 21));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { size: '21' },\n content: 'hello'\n });\n }\n\n ['@test handles internal and external changes']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['type'],\n type: 'password',\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(component, 'type', 'checkbox'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'checkbox' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(component, 'type', 'password'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { type: 'password' },\n content: 'hello'\n });\n }\n\n ['@test can set attributeBindings on component with a different tagName']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'input',\n attributeBindings: ['type', 'isDisabled:disabled']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar type=type isDisabled=disabled}}', {\n type: 'password',\n disabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'type', 'checkbox');\n (0, _metal.set)(this.context, 'disabled', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'checkbox', disabled: '' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'type', 'password');\n (0, _metal.set)(this.context, 'disabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'input',\n attrs: { type: 'password' }\n });\n }\n\n ['@test should allow namespaced attributes in micro syntax']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['xlinkHref:xlink:href']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar type=type xlinkHref=xlinkHref}}', {\n xlinkHref: '/foo.png'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'xlinkHref', '/lol.png'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/lol.png' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'xlinkHref', '/foo.png'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'xlink:href': '/foo.png' }\n });\n }\n\n // This comes into play when using the {{#each}} helper. If the\n // passed array item is a String, it will be converted into a\n // String object instead of a normal string.\n ['@test should allow for String objects']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['foo']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar foo=foo}}', {\n foo: function () {\n return this;\n }.call('bar')\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', function () {\n return this;\n }.call('baz')));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'baz' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', function () {\n return this;\n }.call('bar')));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { foo: 'bar' }\n });\n }\n\n ['@test can set id initially via attributeBindings ']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['specialSauce:id']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar specialSauce=sauce}}', {\n sauce: 'special-sauce'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'sauce', 'foo'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'sauce', 'special-sauce'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'special-sauce' }\n });\n }\n\n ['@test attributeBindings are overwritten']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['href'],\n href: 'a href'\n });\n\n let FizzBarComponent = FooBarComponent.extend({\n attributeBindings: ['newHref:href']\n });\n\n this.registerComponent('fizz-bar', { ComponentClass: FizzBarComponent });\n\n this.render('{{fizz-bar newHref=href}}', {\n href: 'dog.html'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'dog.html' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'dog.html' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'href', 'cat.html'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { href: 'cat.html' }\n });\n }\n\n ['@test it can set attribute bindings in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n let bindings = [];\n\n if (this.get('hasFoo')) {\n bindings.push('foo:data-foo');\n }\n\n if (this.get('hasBar')) {\n bindings.push('bar:data-bar');\n }\n\n this.attributeBindings = bindings;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar hasFoo=true foo=foo hasBar=false bar=bar}}\n {{foo-bar hasFoo=false foo=foo hasBar=true bar=bar}}\n {{foo-bar hasFoo=true foo=foo hasBar=true bar=bar}}\n {{foo-bar hasFoo=false foo=foo hasBar=false bar=bar}}\n `, { foo: 'foo', bar: 'bar' });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', undefined);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 'BAR'));\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'BAR' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'FOO', 'data-bar': 'BAR' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'bar', 'bar');\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { 'data-foo': 'foo', 'data-bar': 'bar' },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: {},\n content: 'hello'\n });\n }\n\n ['@test asserts if an attributeBinding is setup on class']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['class']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You cannot use class as an attributeBinding, use classNameBindings instead./i);\n }\n\n ['@test blacklists href bindings based on protocol']() {\n /* jshint scripturl:true */\n\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'a',\n attributeBindings: ['href']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar href=xss}}', {\n xss: \"javascript:alert('foo')\"\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: \"unsafe:javascript:alert('foo')\" }\n });\n }\n\n ['@test it can bind the role attribute (issue #14007)']() {\n let FooBarComponent = _helpers.Component.extend({ attributeBindings: ['role'] });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar role=role}}', { role: 'button' });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'button' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'button' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'role', 'combobox'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { role: 'combobox' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'role', null));\n\n this.assertComponentElement(this.firstChild, { tagName: 'div' });\n }\n\n ['@test component with an `id` attribute binding of undefined']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['id'],\n\n id: undefined\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['somethingUndefined:id'],\n\n somethingUndefined: undefined\n })\n });\n this.render(`{{foo-bar}}{{baz-qux}}`);\n\n this.assertComponentElement(this.nthChild(0), { content: '' });\n this.assertComponentElement(this.nthChild(1), { content: '' });\n\n this.assert.ok(this.nthChild(0).id.match(/ember\\d+/), 'a valid `id` was used');\n this.assert.ok(this.nthChild(1).id.match(/ember\\d+/), 'a valid `id` was used');\n }\n\n ['@test component with an `id` attribute binding of null']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['id'],\n\n id: null\n })\n });\n\n this.registerComponent('baz-qux', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['somethingNull:id'],\n\n somethingNull: null\n })\n });\n this.render(`{{foo-bar}}{{baz-qux}}`);\n\n this.assertComponentElement(this.nthChild(0), { content: '' });\n this.assertComponentElement(this.nthChild(1), { content: '' });\n\n this.assert.ok(this.nthChild(0).id.match(/ember\\d+/), 'a valid `id` was used');\n this.assert.ok(this.nthChild(1).id.match(/ember\\d+/), 'a valid `id` was used');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/attrs-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _helpers, _metal, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: attrs lookup', class extends _testCase.RenderingTest {\n ['@test it should be able to lookup attrs without `attrs.` - template access']() {\n this.registerComponent('foo-bar', { template: '{{first}}' });\n\n this.render(`{{foo-bar first=firstAttr}}`, {\n firstAttr: 'first attr'\n });\n\n this.assertText('first attr');\n\n this.runTask(() => this.rerender());\n\n this.assertText('first attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'second attr'));\n\n this.assertText('second attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'first attr'));\n\n this.assertText('first attr');\n }\n\n ['@test it should be able to lookup attrs without `attrs.` - component access'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{first}}'\n });\n\n this.render(`{{foo-bar first=firstAttr}}`, {\n firstAttr: 'first attr'\n });\n\n assert.equal(instance.get('first'), 'first attr');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('first'), 'first attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'second attr'));\n\n assert.equal(instance.get('first'), 'second attr');\n\n this.runTask(() => (0, _metal.set)(this.context, 'firstAttr', 'first attr'));\n\n this.assertText('first attr');\n }\n\n ['@test should be able to modify a provided attr into local state #11571 / #11559'](assert) {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n this.set('first', this.get('first').toUpperCase());\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{first}}'\n });\n\n this.render(`{{foo-bar first=\"first attr\"}}`);\n\n assert.equal(instance.get('first'), 'FIRST ATTR', 'component lookup uses local state');\n this.assertText('FIRST ATTR');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('first'), 'FIRST ATTR', 'component lookup uses local state during rerender');\n this.assertText('FIRST ATTR');\n\n // This is testing that passing string literals for use as initial values,\n // so there is no update step\n }\n\n ['@test should be able to access unspecified attr #12035'](assert) {\n let instance;\n let wootVal = 'yes';\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n assert.equal(this.get('woot'), wootVal, 'found attr in didReceiveAttrs');\n }\n });\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render(`{{foo-bar woot=woot}}`, {\n woot: wootVal\n });\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr after rerender');\n\n this.runTask(() => {\n wootVal = 'nope';\n (0, _metal.set)(this.context, 'woot', wootVal);\n });\n\n assert.equal(instance.get('woot'), 'nope', 'component found attr after attr change');\n\n this.runTask(() => {\n wootVal = 'yes';\n (0, _metal.set)(this.context, 'woot', wootVal);\n });\n\n assert.equal(instance.get('woot'), 'yes', 'component found attr after reset');\n }\n\n ['@test getAttr() should return the same value as get()'](assert) {\n assert.expect(33);\n\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n didReceiveAttrs() {\n let rootFirstPositional = this.get('firstPositional');\n let rootFirst = this.get('first');\n let rootSecond = this.get('second');\n let attrFirstPositional = this.getAttr('firstPositional');\n let attrFirst = this.getAttr('first');\n let attrSecond = this.getAttr('second');\n\n assert.equal(rootFirstPositional, attrFirstPositional, 'root property matches attrs value');\n assert.equal(rootFirst, attrFirst, 'root property matches attrs value');\n assert.equal(rootSecond, attrSecond, 'root property matches attrs value');\n }\n });\n\n FooBarComponent.reopenClass({\n positionalParams: ['firstPositional']\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render(`{{foo-bar firstPositional first=first second=second}}`, {\n firstPositional: 'firstPositional',\n first: 'first',\n second: 'second'\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => this.rerender());\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'third');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'second', 'fourth');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'fourth', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'firstPositional', 'fifth');\n });\n\n assert.equal(instance.get('firstPositional'), 'fifth', 'matches known value');\n assert.equal(instance.get('first'), 'third', 'matches known value');\n assert.equal(instance.get('second'), 'fourth', 'matches known value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'firstPositional', 'firstPositional');\n (0, _metal.set)(this.context, 'first', 'first');\n (0, _metal.set)(this.context, 'second', 'second');\n });\n\n assert.equal(instance.get('firstPositional'), 'firstPositional', 'matches known value');\n assert.equal(instance.get('first'), 'first', 'matches known value');\n assert.equal(instance.get('second'), 'second', 'matches known value');\n }\n\n ['@test bound computed properties can be overridden in extensions, set during init, and passed in as attrs']() {\n let FooClass = _helpers.Component.extend({\n attributeBindings: ['style'],\n style: (0, _metal.computed)('height', 'color', function () {\n let height = this.get('height');\n let color = this.get('color');\n return (0, _helpers.htmlSafe)(`height: ${height}px; background-color: ${color};`);\n }),\n color: 'red',\n height: 20\n });\n\n let BarClass = FooClass.extend({\n init() {\n this._super(...arguments);\n this.height = 150;\n },\n color: 'yellow'\n });\n\n this.registerComponent('x-foo', { ComponentClass: FooClass });\n this.registerComponent('x-bar', { ComponentClass: BarClass });\n\n this.render('{{x-foo}}{{x-bar}}{{x-bar color=\"green\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 20px; background-color: red;') }\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 150px; background-color: yellow;') }\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 150px; background-color: green;') }\n });\n\n this.assertStableRerender();\n\n // No U-R\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/class-bindings-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _helpers, _testHelpers, _metal, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('ClassNameBindings integration', class extends _testCase.RenderingTest {\n ['@test it can have class name bindings on the class definition']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo', 'isEnabled:enabled', 'isHappy:happy:sad']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo isEnabled=isEnabled isHappy=isHappy}}', {\n foo: 'foo',\n isEnabled: true,\n isHappy: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'isEnabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', undefined);\n (0, _metal.set)(this.context, 'isHappy', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'isEnabled', true);\n (0, _metal.set)(this.context, 'isHappy', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n }\n\n ['@test attrs in classNameBindings']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['attrs.joker:purple:green', 'attrs.batman.robin:black:red']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar joker=model.wat batman=model.super}}', {\n model: { wat: false, super: { robin: true } }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.wat', true);\n (0, _metal.set)(this.context, 'model.super.robin', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view purple red') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n wat: false,\n super: { robin: true }\n }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view green black') },\n content: 'hello'\n });\n }\n\n ['@test it can have class name bindings in the template']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classNameBindings=\"model.someInitiallyTrueProperty model.someInitiallyFalseProperty model.someInitiallyUndefinedProperty :static model.isBig:big model.isOpen:open:closed model.isUp::down model.bar:isTruthy:isFalsy\"}}', {\n model: {\n someInitiallyTrueProperty: true,\n someInitiallyFalseProperty: false,\n isBig: true,\n isOpen: false,\n isUp: true,\n bar: true\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.someInitiallyTrueProperty', false);\n (0, _metal.set)(this.context, 'model.someInitiallyFalseProperty', true);\n (0, _metal.set)(this.context, 'model.someInitiallyUndefinedProperty', true);\n (0, _metal.set)(this.context, 'model.isBig', false);\n (0, _metal.set)(this.context, 'model.isOpen', true);\n (0, _metal.set)(this.context, 'model.isUp', false);\n (0, _metal.set)(this.context, 'model.bar', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-false-property some-initially-undefined-property static open down isFalsy')\n },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n someInitiallyTrueProperty: true,\n someInitiallyFalseProperty: false,\n someInitiallyUndefinedProperty: undefined,\n isBig: true,\n isOpen: false,\n isUp: true,\n bar: true\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n attrs: {\n class: (0, _testHelpers.classes)('ember-view some-initially-true-property static big closed isTruthy')\n },\n content: 'hello'\n });\n }\n\n ['@test it can have class name bindings with nested paths']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo.bar', 'is.enabled:enabled', 'is.happy:happy:sad']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar foo=foo is=is}}', {\n foo: { bar: 'foo-bar' },\n is: { enabled: true, happy: false }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo.bar', 'FOO-BAR');\n (0, _metal.set)(this.context, 'is.enabled', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo.bar', null);\n (0, _metal.set)(this.context, 'is.happy', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', null);\n (0, _metal.set)(this.context, 'is', null);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view sad') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', { bar: 'foo-bar' });\n (0, _metal.set)(this.context, 'is', { enabled: true, happy: false });\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar enabled sad') },\n content: 'hello'\n });\n }\n\n ['@test it should dasherize the path when the it resolves to true']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['fooBar', 'nested.fooBarBaz']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar fooBar=fooBar nested=nested}}', {\n fooBar: true,\n nested: { fooBarBaz: false }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', false);\n (0, _metal.set)(this.context, 'nested.fooBarBaz', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar-baz') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', 'FOO-BAR');\n (0, _metal.set)(this.context, 'nested.fooBarBaz', null);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'nested', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO-BAR') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'fooBar', true);\n (0, _metal.set)(this.context, 'nested', { fooBarBaz: false });\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') },\n content: 'hello'\n });\n }\n\n ['@test const bindings can be set as attrs']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n this.render('{{foo-bar classNameBindings=\"foo:enabled:disabled\"}}', {\n foo: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view disabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view enabled') },\n content: 'hello'\n });\n }\n\n ['@test :: class name syntax works with an empty true class']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['isEnabled::not-enabled']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar isEnabled=enabled}}', {\n enabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view not-enabled') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view not-enabled') },\n content: 'hello'\n });\n }\n\n ['@test uses all provided static class names (issue #11193)']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: [':class-one', ':class-two']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}', {\n enabled: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view class-one class-two') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'enabled', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view class-one class-two') },\n content: 'hello'\n });\n }\n\n ['@test Providing a binding with a space in it asserts']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: 'i:think:i am:so:clever'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must not have spaces in them/i);\n }\n\n ['@test it asserts that items must be strings']() {\n let FooBarComponent = _helpers.Component.extend({\n foo: 'foo',\n bar: 'bar',\n classNameBindings: ['foo',, 'bar'] // eslint-disable-line no-sparse-arrays\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must be non-empty strings/);\n }\n\n ['@test it asserts that items must be non-empty strings']() {\n let FooBarComponent = _helpers.Component.extend({\n foo: 'foo',\n bar: 'bar',\n classNameBindings: ['foo', '', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /classNameBindings must be non-empty strings/);\n }\n\n ['@test it can set class name bindings in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: ['foo'],\n\n init() {\n this._super();\n\n let bindings = this.classNameBindings = this.classNameBindings.slice();\n\n if (this.get('bindIsEnabled')) {\n bindings.push('isEnabled:enabled');\n }\n\n if (this.get('bindIsHappy')) {\n bindings.push('isHappy:happy:sad');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar foo=foo bindIsEnabled=true isEnabled=isEnabled bindIsHappy=false isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=false isEnabled=isEnabled bindIsHappy=true isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=true isEnabled=isEnabled bindIsHappy=true isHappy=isHappy}}\n {{foo-bar foo=foo bindIsEnabled=false isEnabled=isEnabled bindIsHappy=false isHappy=isHappy}}\n `, { foo: 'foo', isEnabled: true, isHappy: false });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'isEnabled', false);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view FOO') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', undefined);\n (0, _metal.set)(this.context, 'isHappy', true);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view happy') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'foo');\n (0, _metal.set)(this.context, 'isEnabled', true);\n (0, _metal.set)(this.context, 'isHappy', false);\n });\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo enabled sad') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(3), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n ['@test using a computed property for classNameBindings triggers an assertion']() {\n let FooBarComponent = _helpers.Component.extend({\n classNameBindings: (0, _metal.computed)(function () {\n return ['isHappy:happy:sad'];\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /Only arrays are allowed/);\n }\n });\n\n (0, _testCase.moduleFor)('ClassBinding integration', class extends _testCase.RenderingTest {\n ['@test it should apply classBinding without condition always']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\":foo\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') }\n });\n }\n\n ['@test it should merge classBinding with class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"birdman:respeck\" class=\"myName\"}}', {\n birdman: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck myName ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck myName ember-view') }\n });\n }\n\n ['@test it should apply classBinding with only truthy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName:respeck\"}}', {\n myName: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('respeck ember-view') }\n });\n }\n\n ['@test it should apply classBinding with only falsy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName::shade\"}}', {\n myName: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('shade ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('shade ember-view') }\n });\n }\n\n ['@test it should apply nothing when classBinding is falsy but only supplies truthy class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName:respeck\"}}', {\n myName: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n }\n\n ['@test it should apply nothing when classBinding is truthy but only supplies falsy class']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"myName::shade\"}}', { myName: true });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n }\n\n ['@test it should apply classBinding with falsy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"swag:fresh:scrub\"}}', {\n swag: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('scrub ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('scrub ember-view') }\n });\n }\n\n ['@test it should apply classBinding with truthy condition']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar classBinding=\"swag:fresh:scrub\"}}', {\n swag: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fresh ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fresh ember-view') }\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/contextual-components-test', ['@ember/polyfills', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime'], function (_polyfills, _helpers, _abstractTestCase, _testCase, _metal, _runtime) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: contextual components', class extends _testCase.RenderingTest {\n ['@test renders with component helper']() {\n let expectedText = 'Hodi';\n\n this.registerComponent('-looked-up', {\n template: expectedText\n });\n\n this.render('{{component (component \"-looked-up\")}}');\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n }\n\n ['@test renders with component helper with invocation params, hash']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"-looked-up\") \"Hodari\" greeting=\"Hodi\"}}`);\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test GH#13742 keeps nested rest positional parameters if rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.greeting model.name)}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack'\n }\n });\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack');\n\n this.runTask(() => this.context.set('model.name', 'Matthew'));\n\n this.assertText('Good morning Matthew');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack' }));\n\n this.assertText('Gabon Zack');\n }\n\n // Take a look at this one. Seems to pass even when currying isn't implemented.\n ['@test overwrites nested rest positional parameters if rendered with positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.greeting model.name) model.name model.greeting}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack '\n }\n });\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack Zack Good morning ');\n\n this.runTask(() => this.context.set('model.name', 'Matthew '));\n\n this.assertText('Good morning Matthew Matthew Good morning ');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack ' }));\n\n this.assertText('Gabon Zack Zack Gabon ');\n }\n\n ['@test GH#13742 keeps nested rest positional parameters if nested and rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" model.greeting model.name))}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack'\n }\n });\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack');\n\n this.runTask(() => this.context.set('model.name', 'Matthew'));\n\n this.assertText('Good morning Matthew');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack' }));\n\n this.assertText('Gabon Zack');\n }\n\n ['@test overwrites nested rest positional parameters if nested with new pos params and rendered with no positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{#each params as |p|}}{{p}}{{/each}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" model.greeting model.name) model.name model.greeting)}}', {\n model: {\n greeting: 'Gabon ',\n name: 'Zack '\n }\n });\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Gabon Zack Zack Gabon ');\n\n this.runTask(() => this.context.set('model.greeting', 'Good morning '));\n\n this.assertText('Good morning Zack Zack Good morning ');\n\n this.runTask(() => this.context.set('model.name', 'Matthew '));\n\n this.assertText('Good morning Matthew Matthew Good morning ');\n\n this.runTask(() => this.context.set('model', { greeting: 'Gabon ', name: 'Zack ' }));\n\n this.assertText('Gabon Zack Zack Gabon ');\n }\n\n ['@test renders with component helper with curried params, hash']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"-looked-up\" \"Hodari\" greeting=\"Hodi\")\n greeting=\"Hola\"}}`);\n\n this.assertText('Hola Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola Hodari');\n }\n\n ['@test updates when component path is bound']() {\n this.registerComponent('-mandarin', {\n template: 'ni hao'\n });\n\n this.registerComponent('-hindi', {\n template: 'Namaste'\n });\n\n this.render('{{component (component model.lookupComponent)}}', {\n model: {\n lookupComponent: '-mandarin'\n }\n });\n\n this.assertText('ni hao');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ni hao');\n\n this.runTask(() => this.context.set('model.lookupComponent', '-hindi'));\n\n this.assertText('Namaste');\n\n this.runTask(() => this.context.set('model', { lookupComponent: '-mandarin' }));\n\n this.assertText('ni hao');\n }\n\n ['@test updates when curried hash argument is bound']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}}'\n });\n\n this.render(`{{component (component \"-looked-up\" greeting=model.greeting)}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi');\n\n this.runTask(() => this.context.set('model.greeting', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi');\n }\n\n ['@test updates when curried hash arguments is bound in block form']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash comp=(component \"-looked-up\" greeting=model.greeting)) as |my|}}\n {{#my.comp}}{{/my.comp}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi');\n\n this.runTask(() => this.context.set('model.greeting', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi');\n }\n\n ['@test nested components do not overwrite positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" \"Sergio\" 29) \"Marvin\" 21) \"Hodari\"}}');\n\n this.assertText('Sergio 29');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio 29');\n }\n\n ['@test positional parameters are combined not clobbered']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n this.render('{{component (component (component \"-looked-up\" \"Hi\") \"Max\") 9}}');\n\n this.assertText('Hi Max 9');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hi Max 9');\n }\n\n ['@test nested components positional parameters override named parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component (component \"-looked-up\" \"Sergio\" 29) name=\"Marvin\" age=21)}}');\n }, 'You cannot specify both a positional param (at position 1) and the hash argument `age`.');\n\n this.assertText('Sergio 29');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio 29');\n }\n\n ['@test nested components with positional params at outer layer are override hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" \"Hola\" \"Dolores\" 33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 1) and the hash argument `name`.');\n\n this.assertText('Hola Dolores 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola Dolores 33');\n }\n\n ['@test nested components with positional params at middle layer partially override hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first \"Hej\" \"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `greeting`.');\n\n this.assertText('Hej Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hej Sigmundur 33');\n }\n\n ['@test nested components with positional params at invocation override earlier hash parameters [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['greeting', 'name', 'age']\n }),\n\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n expectDeprecation(() => {\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `greeting`.');\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.context.set('model.greeting', 'Kaixo'));\n\n this.assertText('Kaixo Sigmundur 33');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi Sigmundur 33');\n }\n\n ['@test nested components overwrite hash parameters']() {\n this.registerComponent('-looked-up', {\n template: '{{greeting}} {{name}} {{age}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (component \"-looked-up\" greeting=\"Hola\" name=\"Dolores\" age=33) as |first|}}\n {{#with (component first greeting=\"Hej\" name=\"Sigmundur\") as |second|}}\n {{component second greeting=model.greeting}}\n {{/with}}\n {{/with}}`, {\n model: {\n greeting: 'Hodi'\n }\n });\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Sigmundur 33');\n\n this.runTask(() => this.context.set('model.greeting', 'Kaixo'));\n\n this.assertText('Kaixo Sigmundur 33');\n\n this.runTask(() => this.context.set('model', { greeting: 'Hodi' }));\n\n this.assertText('Hodi Sigmundur 33');\n }\n\n ['@test bound outer named parameters get updated in the right scope']() {\n this.registerComponent('-inner-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['comp']\n }),\n template: '{{component comp \"Inner\"}}'\n });\n\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component \"-inner-component\" (component \"-looked-up\" model.outerName model.outerAge)}}', {\n model: {\n outerName: 'Outer',\n outerAge: 28\n }\n });\n\n this.assertText('Outer 28');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Outer 28');\n\n this.runTask(() => this.context.set('model.outerAge', 29));\n\n this.assertText('Outer 29');\n\n this.runTask(() => this.context.set('model.outerName', 'Not outer'));\n\n this.assertText('Not outer 29');\n\n this.runTask(() => {\n this.context.set('model', {\n outerName: 'Outer',\n outerAge: 28\n });\n });\n\n this.assertText('Outer 28');\n }\n\n ['@test bound outer hash parameters get updated in the right scope']() {\n this.registerComponent('-inner-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['comp']\n }),\n template: '{{component comp name=\"Inner\"}}'\n });\n\n this.registerComponent('-looked-up', {\n template: '{{name}} {{age}}'\n });\n\n this.render('{{component \"-inner-component\" (component \"-looked-up\" name=model.outerName age=model.outerAge)}}', {\n model: {\n outerName: 'Outer',\n outerAge: 28\n }\n });\n\n this.assertText('Inner 28');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Inner 28');\n\n this.runTask(() => this.context.set('model.outerAge', 29));\n\n this.assertText('Inner 29');\n\n this.runTask(() => this.context.set('model.outerName', 'Not outer'));\n\n this.assertText('Inner 29');\n\n this.runTask(() => {\n this.context.set('model', {\n outerName: 'Outer',\n outerAge: 28\n });\n });\n\n this.assertText('Inner 28');\n }\n\n ['@test conflicting positional and hash parameters trigger a deprecation if in the same component context [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component \"-looked-up\" \"Hodari\" name=\"Sergio\") \"Hodari\" greeting=\"Hodi\"}}');\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n }\n\n ['@test conflicting positional and hash parameters does not raise an assertion if rerendered']() {\n // In some cases, rerendering with a positional param used to cause an\n // assertion. This test checks it does not.\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n this.render('{{component (component \"-looked-up\" model.name greeting=\"Hodi\")}}', {\n model: {\n name: 'Hodari'\n }\n });\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.context.set('model.name', 'Sergio'));\n\n this.assertText('Hodi Sergio');\n\n this.runTask(() => this.context.set('model', { name: 'Hodari' }));\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test conflicting positional and hash parameters trigger a deprecation [DEPRECATED]']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{greeting}} {{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{component (component \"-looked-up\" \"Hodari\") name=\"Sergio\" greeting=\"Hodi\"}}');\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n\n this.assertText('Hodi Hodari');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hodi Hodari');\n }\n\n ['@test component with dynamic component name resolving to undefined, then an existing component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: undefined,\n name: 'Alex'\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', undefined));\n\n this.assertText('');\n }\n\n ['@test component with dynamic component name resolving to a component, then undefined']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', undefined));\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test component with dynamic component name resolving to null, then an existing component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: null,\n name: 'Alex'\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', null));\n\n this.assertText('');\n }\n\n ['@test component with dynamic component name resolving to a component, then null']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component (component componentName name=name)}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.context.set('componentName', null));\n\n this.assertText('');\n\n this.runTask(() => this.context.set('componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test raises an assertion when component path is not a component name (static)']() {\n expectAssertion(() => {\n this.render('{{component (component \"not-a-component\")}}');\n }, 'Could not find component named \"not-a-component\" (no component or template with that name was found)');\n }\n\n ['@test raises an assertion when component path is not a component name (dynamic)']() {\n expectAssertion(() => {\n this.render('{{component (component compName)}}', {\n compName: 'not-a-component'\n });\n }, 'Could not find component named \"not-a-component\" (no component or template with that name was found)');\n }\n\n ['@test renders with dot path']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: expectedText\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup}}\n {{/with}}`);\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and attr']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: '{{expectedText}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup expectedText=model.expectedText}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n\n this.runTask(() => this.context.set('model.expectedText', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and curried over attr']() {\n let expectedText = 'Hodi';\n this.registerComponent('-looked-up', {\n template: '{{expectedText}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\" expectedText=model.expectedText)) as |object|}}\n {{object.lookedup}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(expectedText);\n\n this.runTask(() => this.rerender());\n\n this.assertText(expectedText);\n\n this.runTask(() => this.context.set('model.expectedText', 'Hola'));\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(expectedText);\n }\n\n ['@test renders with dot path and with rest positional parameters']() {\n this.registerComponent('-looked-up', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'params'\n }),\n template: '{{params}}'\n });\n\n let expectedText = 'Hodi';\n\n this.render(_abstractTestCase.strip`\n {{#with (hash lookedup=(component \"-looked-up\")) as |object|}}\n {{object.lookedup model.expectedText \"Hola\"}}\n {{/with}}`, {\n model: {\n expectedText\n }\n });\n\n this.assertText(`${expectedText},Hola`);\n\n this.runTask(() => this.rerender());\n\n this.assertText(`${expectedText},Hola`);\n\n this.runTask(() => this.context.set('model.expectedText', 'Kaixo'));\n\n this.assertText('Kaixo,Hola');\n\n this.runTask(() => this.context.set('model', { expectedText }));\n\n this.assertText(`${expectedText},Hola`);\n }\n\n ['@test renders with dot path and rest parameter does not leak'](assert) {\n // In the original implementation, positional parameters were not handled\n // correctly causing the first positional parameter to be the contextual\n // component itself.\n let value = false;\n\n this.registerComponent('my-component', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n value = this.getAttr('value');\n }\n }).reopenClass({\n positionalParams: ['value']\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#with (hash my-component=(component 'my-component' first)) as |c|}}\n {{c.my-component}}\n {{/with}}`, { first: 'first' });\n\n assert.equal(value, 'first', 'value is the expected parameter');\n }\n\n ['@test renders with dot path and updates attributes'](assert) {\n this.registerComponent('my-nested-component', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n this.set('myProp', this.getAttr('my-parent-attr'));\n }\n }),\n template: '{{myProp}}'\n });\n\n this.registerComponent('my-component', {\n template: '{{yield (hash my-nested-component=(component \"my-nested-component\" my-parent-attr=my-attr))}}'\n });\n\n this.registerComponent('my-action-component', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n changeValue() {\n this.incrementProperty('myProp');\n }\n }\n }),\n template: _abstractTestCase.strip`\n {{#my-component my-attr=myProp as |api|}}\n {{api.my-nested-component}}\n {{/my-component}}\n
\n `\n });\n\n this.render('{{my-action-component myProp=model.myProp}}', {\n model: {\n myProp: 1\n }\n });\n\n assert.equal(this.$('#nested-prop').text(), '1');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#nested-prop').text(), '1');\n\n this.runTask(() => this.$('button').click());\n\n assert.equal(this.$('#nested-prop').text(), '2');\n\n this.runTask(() => this.$('button').click());\n\n assert.equal(this.$('#nested-prop').text(), '3');\n\n this.runTask(() => this.context.set('model', { myProp: 1 }));\n\n assert.equal(this.$('#nested-prop').text(), '1');\n }\n\n [\"@test adding parameters to a contextual component's instance does not add it to other instances\"]() {\n // If parameters and attributes are not handled correctly, setting a value\n // in an invokation can leak to others invocation.\n this.registerComponent('select-box', {\n template: '{{yield (hash option=(component \"select-box-option\"))}}'\n });\n\n this.registerComponent('select-box-option', {\n template: '{{label}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#select-box as |sb|}}\n {{sb.option label=\"Foo\"}}\n {{sb.option}}\n {{/select-box}}`);\n\n this.assertText('Foo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo');\n }\n\n ['@test parameters in a contextual component are mutable when value is a param'](assert) {\n // This checks that a `(mut)` is added to parameters and attributes to\n // contextual components when it is a param.\n\n this.registerComponent('change-button', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['val']\n }),\n template: _abstractTestCase.strip`\n `\n });\n\n this.render(_abstractTestCase.strip`\n {{component (component \"change-button\" model.val2)}}\n {{model.val2}}`, {\n model: {\n val2: 8\n }\n });\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.$('.my-button').click());\n\n assert.equal(this.$('.value').text(), '10');\n\n this.runTask(() => this.context.set('model', { val2: 8 }));\n\n assert.equal(this.$('.value').text(), '8');\n }\n\n ['@test tagless blockless components render'](assert) {\n this.registerComponent('my-comp', {\n ComponentClass: _helpers.Component.extend({ tagName: '' })\n });\n\n this.render(`{{my-comp}}`);\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$().text(), '');\n }\n\n ['@test GH#13494 tagless blockless component with property binding'](assert) {\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n message: 'hello',\n actions: {\n change() {\n this.set('message', 'goodbye');\n }\n }\n }),\n template: _abstractTestCase.strip`\n message: {{message}}{{inner-component message=message}}\n `\n });\n\n setup.call(this, assert);\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('.value').text(), '8');\n\n this.runTask(() => this.$('.my-button').click());\n\n assert.equal(this.$('.value').text(), '10');\n\n this.runTask(() => this.context.set('model', { val2: 8 }));\n\n assert.equal(this.$('.value').text(), '8');\n }\n };\n }\n }\n\n (0, _abstractTestCase.applyMixins)(ContextualComponentMutableParamsTest, new MutableParamTestGenerator([{\n title: 'param',\n setup() {\n this.render('{{component (component \"change-button\" model.val2)}}');\n }\n }, {\n title: 'nested param',\n setup() {\n this.registerComponent('my-comp', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['components']\n }),\n template: '{{component components.comp}}'\n });\n\n this.render('{{my-comp (hash comp=(component \"change-button\" model.val2))}}');\n }\n }, {\n title: 'hash value',\n setup() {\n this.registerComponent('my-comp', {\n template: '{{component component}}'\n });\n\n this.render('{{my-comp component=(component \"change-button\" val=model.val2)}}');\n }\n }, {\n title: 'nested hash value',\n setup() {\n this.registerComponent('my-comp', {\n template: '{{component components.button}}'\n });\n\n this.render('{{my-comp components=(hash button=(component \"change-button\" val=model.val2))}}');\n }\n }]));\n\n (0, _testCase.moduleFor)('Components test: contextual components -- mutable params', ContextualComponentMutableParamsTest);\n});","enifed('@ember/-internals/glimmer/tests/integration/components/curly-components-test', ['@ember/runloop', '@ember/-internals/metal', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_runloop, _metal, _service, _runtime, _views, _helpers, _abstractTestCase, _testCase, _testHelpers) {\n 'use strict';\n\n /* globals EmberDev */\n (0, _testCase.moduleFor)('Components test: curly components', class extends _testCase.RenderingTest {\n ['@test it can render a basic component']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it can have a custom id and it is not bound']() {\n this.registerComponent('foo-bar', { template: '{{id}} {{elementId}}' });\n\n this.render('{{foo-bar id=customId}}', {\n customId: 'bizz'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bar bizz'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'customId', 'bizz'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'bizz' },\n content: 'bizz bizz'\n });\n }\n\n ['@test elementId cannot change'](assert) {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{elementId}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'blahzorz' },\n content: 'blahzorz'\n });\n\n if (EmberDev && !EmberDev.runningProdBuild) {\n let willThrow = () => (0, _runloop.run)(null, _metal.set, component, 'elementId', 'herpyderpy');\n\n assert.throws(willThrow, /Changing a view's elementId after creation is not allowed/);\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'blahzorz' },\n content: 'blahzorz'\n });\n }\n }\n\n ['@test can specify template with `layoutName` property']() {\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n layoutName: 'fizz-bar',\n init() {\n this._super(...arguments);\n this.local = 'hey';\n }\n });\n\n this.registerTemplate('fizz-bar', `FIZZ BAR {{local}}`);\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n\n this.assertText('FIZZ BAR hey');\n }\n\n ['@test layout supports computed property']() {\n let FooBarComponent = _helpers.Component.extend({\n elementId: 'blahzorz',\n layout: (0, _metal.computed)(function () {\n return (0, _helpers.compile)('so much layout wat {{lulz}}');\n }),\n init() {\n this._super(...arguments);\n this.lulz = 'heyo';\n }\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n\n this.assertText('so much layout wat heyo');\n }\n\n ['@test passing undefined elementId results in a default elementId'](assert) {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'h1'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'something'\n });\n\n this.render('{{foo-bar id=somethingUndefined}}');\n\n let foundId = this.$('h1').attr('id');\n assert.ok(/^ember/.test(foundId), 'Has a reasonable id attribute (found id=' + foundId + ').');\n\n this.runTask(() => this.rerender());\n\n let newFoundId = this.$('h1').attr('id');\n assert.ok(/^ember/.test(newFoundId), 'Has a reasonable id attribute (found id=' + newFoundId + ').');\n\n assert.equal(foundId, newFoundId);\n }\n\n ['@test id is an alias for elementId'](assert) {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'h1'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'something'\n });\n\n this.render('{{foo-bar id=\"custom-id\"}}');\n\n let foundId = this.$('h1').attr('id');\n assert.equal(foundId, 'custom-id');\n\n this.runTask(() => this.rerender());\n\n let newFoundId = this.$('h1').attr('id');\n assert.equal(newFoundId, 'custom-id');\n\n assert.equal(foundId, newFoundId);\n }\n\n ['@test cannot pass both id and elementId at the same time']() {\n this.registerComponent('foo-bar', { template: '' });\n\n expectAssertion(() => {\n this.render('{{foo-bar id=\"zomg\" elementId=\"lol\"}}');\n }, /You cannot invoke a component with both 'id' and 'elementId' at the same time./);\n }\n\n ['@test it can have a custom tagName']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test it can have a custom tagName set in the constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n this.tagName = 'foo-bar';\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test it can have a custom tagName from the invocation']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar tagName=\"foo-bar\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'foo-bar',\n content: 'hello'\n });\n }\n\n ['@test tagName can not be a computed property']() {\n let FooBarComponent = _helpers.Component.extend({\n tagName: (0, _metal.computed)(function () {\n return 'foo-bar';\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You cannot use a computed property for the component's `tagName` \\(<.+?>\\)\\./);\n }\n\n ['@test class is applied before didInsertElement'](assert) {\n let componentClass;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n componentClass = this.element.className;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar class=\"foo-bar\"}}');\n\n assert.equal(componentClass, 'foo-bar ember-view');\n }\n\n ['@test it can have custom classNames']() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo', 'bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar') },\n content: 'hello'\n });\n }\n\n ['@test should not apply falsy class name']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=somethingFalsy}}', {\n somethingFalsy: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n }\n\n ['@test should update class using inline if, initially false, no alternate']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if predicate \"thing\") }}', {\n predicate: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', true));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', false));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n }\n\n ['@test should update class using inline if, initially true, no alternate']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if predicate \"thing\") }}', {\n predicate: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', false));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'ember-view' },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'predicate', true));\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view thing') },\n content: 'hello'\n });\n }\n\n ['@test should apply classes of the dasherized property name when bound property specified is true']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=model.someTruth}}', {\n model: { someTruth: true }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { someTruth: true }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view some-truth') },\n content: 'hello'\n });\n }\n\n ['@test class property on components can be dynamic']() {\n this.registerComponent('foo-bar', { template: 'hello' });\n\n this.render('{{foo-bar class=(if fooBar \"foo-bar\")}}', {\n fooBar: true\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo-bar') }\n });\n }\n\n ['@test it can have custom classNames from constructor']() {\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n this.classNames = this.classNames.slice();\n this.classNames.push('foo', 'bar', `outside-${this.get('extraClass')}`);\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar extraClass=\"baz\"}}');\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar outside-baz') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar outside-baz') },\n content: 'hello'\n });\n }\n\n ['@test it can set custom classNames from the invocation']() {\n let FooBarComponent = _helpers.Component.extend({\n classNames: ['foo']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render(_abstractTestCase.strip`\n {{foo-bar class=\"bar baz\"}}\n {{foo-bar classNames=\"bar baz\"}}\n {{foo-bar}}\n `);\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.nthChild(0), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(1), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo bar baz') },\n content: 'hello'\n });\n this.assertComponentElement(this.nthChild(2), {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view foo') },\n content: 'hello'\n });\n }\n\n ['@test it has an element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test an empty component does not have childNodes'](assert) {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'input',\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { tagName: 'input' });\n\n assert.strictEqual(fooBarInstance.element.childNodes.length, 0);\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { tagName: 'input' });\n\n assert.strictEqual(fooBarInstance.element.childNodes.length, 0);\n }\n\n ['@test it has the right parentView and childViews'](assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('{{foo-bar}}');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n ['@feature(ember-glimmer-named-arguments) it renders passed named arguments']() {\n this.registerComponent('foo-bar', {\n template: '{{@foo}}'\n });\n\n this.render('{{foo-bar foo=model.bar}}', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n ['@test it reflects named arguments as properties']() {\n this.registerComponent('foo-bar', {\n template: '{{foo}}'\n });\n\n this.render('{{foo-bar foo=model.bar}}', {\n model: {\n bar: 'Hola'\n }\n });\n\n this.assertText('Hola');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hola');\n\n this.runTask(() => this.context.set('model.bar', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => this.context.set('model', { bar: 'Hola' }));\n\n this.assertText('Hola');\n }\n\n ['@test it can render a basic component with a block']() {\n this.registerComponent('foo-bar', {\n template: '{{yield}} - In component'\n });\n\n this.render('{{#foo-bar}}hello{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello - In component'\n });\n }\n\n ['@test it can render a basic component with a block when the yield is in a partial']() {\n this.registerPartial('_partialWithYield', 'yielded: [{{yield}}]');\n\n this.registerComponent('foo-bar', {\n template: '{{partial \"partialWithYield\"}} - In component'\n });\n\n this.render('{{#foo-bar}}hello{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n }\n\n ['@test it can render a basic component with a block param when the yield is in a partial']() {\n this.registerPartial('_partialWithYield', 'yielded: [{{yield \"hello\"}}]');\n\n this.registerComponent('foo-bar', {\n template: '{{partial \"partialWithYield\"}} - In component'\n });\n\n this.render('{{#foo-bar as |value|}}{{value}}{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'yielded: [hello] - In component'\n });\n }\n\n ['@test it renders the layout with the component instance as the context']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n this.set('message', 'hello');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{message}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it preserves the outer context when yielding']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#foo-bar}}{{message}}{{/foo-bar}}', { message: 'hello' });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it can yield a block param named for reserved words [GH#14096]']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n\n name: 'foo-bar'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield this}}'\n });\n\n this.render('{{#foo-bar as |component|}}{{component.name}}{{/foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'foo-bar' });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'name', 'derp-qux'));\n\n this.assertComponentElement(this.firstChild, { content: 'derp-qux' });\n\n this.runTask(() => (0, _metal.set)(instance, 'name', 'foo-bar'));\n\n this.assertComponentElement(this.firstChild, { content: 'foo-bar' });\n }\n\n ['@test it can yield internal and external properties positionally']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n greeting: 'hello'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{yield greeting greetee.firstName}}'\n });\n\n this.render('{{#foo-bar greetee=person as |greeting name|}}{{name}} {{person.lastName}}, {{greeting}}{{/foo-bar}}', {\n person: {\n firstName: 'Joel',\n lastName: 'Kang'\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'Dora',\n lastName: 'the Explorer'\n }));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hello'\n });\n\n this.runTask(() => (0, _metal.set)(instance, 'greeting', 'hola'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Dora the Explorer, hola'\n });\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'greeting', 'hello');\n (0, _metal.set)(this.context, 'person', {\n firstName: 'Joel',\n lastName: 'Kang'\n });\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Joel Kang, hello'\n });\n }\n\n ['@test #11519 - block param infinite loop']() {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n },\n danger: 0\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{danger}}{{yield danger}}'\n });\n\n // On initial render, create streams. The bug will not have manifested yet, but at this point\n // we have created streams that create a circular invalidation.\n this.render(`{{#foo-bar as |dangerBlockParam|}}{{/foo-bar}}`);\n\n this.assertText('0');\n\n // Trigger a non-revalidating re-render. The yielded block will not be dirtied\n // nor will block param streams, and thus no infinite loop will occur.\n this.runTask(() => this.rerender());\n\n this.assertText('0');\n\n // Trigger a revalidation, which will cause an infinite loop without the fix\n // in place. Note that we do not see the infinite loop is in testing mode,\n // because a deprecation warning about re-renders is issued, which Ember\n // treats as an exception.\n this.runTask(() => (0, _metal.set)(instance, 'danger', 1));\n\n this.assertText('1');\n\n this.runTask(() => (0, _metal.set)(instance, 'danger', 0));\n\n this.assertText('0');\n }\n\n ['@test the component and its child components are destroyed'](assert) {\n let destroyed = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0 };\n\n this.registerComponent('foo-bar', {\n template: '{{id}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed[this.get('id')]++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond1}}\n {{#foo-bar id=1}}\n {{#if cond2}}\n {{#foo-bar id=2}}{{/foo-bar}}\n {{#if cond3}}\n {{#foo-bar id=3}}\n {{#if cond4}}\n {{#foo-bar id=4}}\n {{#if cond5}}\n {{#foo-bar id=5}}{{/foo-bar}}\n {{#foo-bar id=6}}{{/foo-bar}}\n {{#foo-bar id=7}}{{/foo-bar}}\n {{/if}}\n {{#foo-bar id=8}}{{/foo-bar}}\n {{/foo-bar}}\n {{/if}}\n {{/foo-bar}}\n {{/if}}\n {{/if}}\n {{/foo-bar}}\n {{/if}}`, {\n cond1: true,\n cond2: true,\n cond3: true,\n cond4: true,\n cond5: true\n });\n\n this.assertText('1 2 3 4 5 6 7 8 ');\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 0,\n 6: 0,\n 7: 0,\n 8: 0\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond5', false));\n\n this.assertText('1 2 3 4 8 ');\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 0\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond3', false);\n (0, _metal.set)(this.context, 'cond5', true);\n (0, _metal.set)(this.context, 'cond4', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', false);\n (0, _metal.set)(this.context, 'cond1', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 1,\n 2: 1,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n }\n\n ['@test should escape HTML in normal mustaches']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: 'you need to be more bold'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{output}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('you need to be more bold');\n\n this.runTask(() => this.rerender());\n\n this.assertText('you need to be more bold');\n\n this.runTask(() => (0, _metal.set)(component, 'output', 'you are so super'));\n\n this.assertText('you are so super');\n\n this.runTask(() => (0, _metal.set)(component, 'output', 'you need to be more bold'));\n }\n\n ['@test should not escape HTML in triple mustaches']() {\n let expectedHtmlBold = 'you need to be more bold';\n let expectedHtmlItalic = 'you are so super';\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: expectedHtmlBold\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{{output}}}'\n });\n\n this.render('{{foo-bar}}');\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => this.rerender());\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => (0, _metal.set)(component, 'output', expectedHtmlItalic));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlItalic);\n\n this.runTask(() => (0, _metal.set)(component, 'output', expectedHtmlBold));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n }\n\n ['@test should not escape HTML if string is a htmlSafe']() {\n let expectedHtmlBold = 'you need to be more bold';\n let expectedHtmlItalic = 'you are so super';\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n output: (0, _helpers.htmlSafe)(expectedHtmlBold)\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{output}}'\n });\n\n this.render('{{foo-bar}}');\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => this.rerender());\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n\n this.runTask(() => (0, _metal.set)(component, 'output', (0, _helpers.htmlSafe)(expectedHtmlItalic)));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlItalic);\n\n this.runTask(() => (0, _metal.set)(component, 'output', (0, _helpers.htmlSafe)(expectedHtmlBold)));\n\n (0, _testHelpers.equalTokens)(this.firstChild, expectedHtmlBold);\n }\n\n ['@test late bound layouts return the same definition'](assert) {\n let templateIds = [];\n\n // This is testing the scenario where you import a template and\n // set it to the layout property:\n //\n // import Component from '@ember/component';\n // import layout from './template';\n //\n // export default Component.extend({\n // layout\n // });\n let hello = (0, _helpers.compile)('Hello');\n let bye = (0, _helpers.compile)('Bye');\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.layout = this.cond ? hello : bye;\n templateIds.push(this.layout.id);\n }\n });\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar cond=true}}{{foo-bar cond=false}}{{foo-bar cond=true}}{{foo-bar cond=false}}');\n\n let [t1, t2, t3, t4] = templateIds;\n assert.equal(t1, t3);\n assert.equal(t2, t4);\n }\n\n ['@test can use isStream property without conflict (#13271)']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n isStream: true,\n\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: _abstractTestCase.strip`\n {{#if isStream}}\n true\n {{else}}\n false\n {{/if}}\n `\n });\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n\n this.runTask(() => (0, _metal.set)(component, 'isStream', false));\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n\n this.runTask(() => (0, _metal.set)(component, 'isStream', true));\n\n this.assertComponentElement(this.firstChild, { content: 'true' });\n }\n ['@test lookup of component takes priority over property']() {\n this.registerComponent('some-component', {\n template: 'some-component'\n });\n\n this.render('{{some-prop}} {{some-component}}', {\n 'some-component': 'not-some-component',\n 'some-prop': 'some-prop'\n });\n\n this.assertText('some-prop some-component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('some-prop some-component');\n }\n\n ['@test component without dash is not looked up']() {\n this.registerComponent('somecomponent', {\n template: 'somecomponent'\n });\n\n this.render('{{somecomponent}}', {\n somecomponent: 'notsomecomponent'\n });\n\n this.assertText('notsomecomponent');\n\n this.runTask(() => this.rerender());\n\n this.assertText('notsomecomponent');\n\n this.runTask(() => this.context.set('somecomponent', 'not not notsomecomponent'));\n\n this.assertText('not not notsomecomponent');\n\n this.runTask(() => this.context.set('somecomponent', 'notsomecomponent'));\n\n this.assertText('notsomecomponent');\n }\n\n ['@test non-block with properties on attrs']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{attrs.someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'other thing there'));\n\n this.assertText('In layout - someProp: other thing there');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@feature(ember-glimmer-named-arguments) non-block with named argument']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{@someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'other thing there'));\n\n this.assertText('In layout - someProp: other thing there');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@test non-block with properties overridden in init']() {\n let instance;\n this.registerComponent('non-block', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n this.someProp = 'value set in instance';\n }\n }),\n template: 'In layout - someProp: {{someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something passed when invoked'\n });\n\n this.assertText('In layout - someProp: value set in instance');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: value set in instance');\n\n this.runTask(() => this.context.set('prop', 'updated something passed when invoked'));\n\n this.assertText('In layout - someProp: updated something passed when invoked');\n\n this.runTask(() => instance.set('someProp', 'update value set in instance'));\n\n this.assertText('In layout - someProp: update value set in instance');\n\n this.runTask(() => this.context.set('prop', 'something passed when invoked'));\n this.runTask(() => instance.set('someProp', 'value set in instance'));\n\n this.assertText('In layout - someProp: value set in instance');\n }\n\n ['@test rerendering component with attrs from parent'](assert) {\n let willUpdateCount = 0;\n let didReceiveAttrsCount = 0;\n\n function expectHooks({ willUpdate, didReceiveAttrs }, callback) {\n willUpdateCount = 0;\n didReceiveAttrsCount = 0;\n\n callback();\n\n if (willUpdate) {\n assert.strictEqual(willUpdateCount, 1, 'The willUpdate hook was fired');\n } else {\n assert.strictEqual(willUpdateCount, 0, 'The willUpdate hook was not fired');\n }\n\n if (didReceiveAttrs) {\n assert.strictEqual(didReceiveAttrsCount, 1, 'The didReceiveAttrs hook was fired');\n } else {\n assert.strictEqual(didReceiveAttrsCount, 0, 'The didReceiveAttrs hook was not fired');\n }\n }\n\n this.registerComponent('non-block', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n didReceiveAttrsCount++;\n },\n\n willUpdate() {\n willUpdateCount++;\n }\n }),\n template: 'In layout - someProp: {{someProp}}'\n });\n\n expectHooks({ willUpdate: false, didReceiveAttrs: true }, () => {\n this.render('{{non-block someProp=someProp}}', {\n someProp: 'wycats'\n });\n });\n\n this.assertText('In layout - someProp: wycats');\n\n // Note: Hooks are not fired in Glimmer for idempotent re-renders\n expectHooks({ willUpdate: false, didReceiveAttrs: false }, () => {\n this.runTask(() => this.rerender());\n });\n\n this.assertText('In layout - someProp: wycats');\n\n expectHooks({ willUpdate: true, didReceiveAttrs: true }, () => {\n this.runTask(() => this.context.set('someProp', 'tomdale'));\n });\n\n this.assertText('In layout - someProp: tomdale');\n\n // Note: Hooks are not fired in Glimmer for idempotent re-renders\n expectHooks({ willUpdate: false, didReceiveAttrs: false }, () => {\n this.runTask(() => this.rerender());\n });\n\n this.assertText('In layout - someProp: tomdale');\n\n expectHooks({ willUpdate: true, didReceiveAttrs: true }, () => {\n this.runTask(() => this.context.set('someProp', 'wycats'));\n });\n\n this.assertText('In layout - someProp: wycats');\n }\n\n ['@feature(!ember-glimmer-named-arguments) this.attrs.foo === attrs.foo === foo']() {\n this.registerComponent('foo-bar', {\n template: _abstractTestCase.strip`\n Args: {{this.attrs.value}} | {{attrs.value}} | {{value}}\n {{#each this.attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each items as |item|}}\n {{item}}\n {{/each}}\n `\n });\n\n this.render('{{foo-bar value=model.value items=model.items}}', {\n model: {\n value: 'wat',\n items: [1, 2, 3]\n }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.context.set('model.value', 'lul');\n this.context.set('model.items', [1]);\n });\n\n this.assertText(_abstractTestCase.strip`Args: lul | lul | lul111`);\n\n this.runTask(() => this.context.set('model', { value: 'wat', items: [1, 2, 3] }));\n\n this.assertText('Args: wat | wat | wat123123123');\n }\n\n ['@feature(ember-glimmer-named-arguments) this.attrs.foo === attrs.foo === @foo === foo']() {\n this.registerComponent('foo-bar', {\n template: _abstractTestCase.strip`\n Args: {{this.attrs.value}} | {{attrs.value}} | {{@value}} | {{value}}\n {{#each this.attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each attrs.items as |item|}}\n {{item}}\n {{/each}}\n {{#each @items as |item|}}\n {{item}}\n {{/each}}\n {{#each items as |item|}}\n {{item}}\n {{/each}}\n `\n });\n\n this.render('{{foo-bar value=model.value items=model.items}}', {\n model: {\n value: 'wat',\n items: [1, 2, 3]\n }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.context.set('model.value', 'lul');\n this.context.set('model.items', [1]);\n });\n\n this.assertText(_abstractTestCase.strip`Args: lul | lul | lul | lul1111`);\n\n this.runTask(() => this.context.set('model', { value: 'wat', items: [1, 2, 3] }));\n\n this.assertText('Args: wat | wat | wat | wat123123123123');\n }\n\n ['@test non-block with properties on self']() {\n this.registerComponent('non-block', {\n template: 'In layout - someProp: {{someProp}}'\n });\n\n this.render('{{non-block someProp=prop}}', {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here');\n }\n\n ['@test block with properties on self']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@test block with properties on attrs']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{attrs.someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@feature(ember-glimmer-named-arguments) block with named argument']() {\n this.registerComponent('with-block', {\n template: 'In layout - someProp: {{@someProp}} - {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block someProp=prop}}\n In template\n {{/with-block}}`, {\n prop: 'something here'\n });\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout - someProp: something here - In template');\n\n this.runTask(() => this.context.set('prop', 'something else'));\n\n this.assertText('In layout - someProp: something else - In template');\n\n this.runTask(() => this.context.set('prop', 'something here'));\n\n this.assertText('In layout - someProp: something here - In template');\n }\n\n ['@test static arbitrary number of positional parameters'](assert) {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{sample-component \"Foo\" 4 \"Bar\" elementId=\"args-3\"}}\n {{sample-component \"Foo\" 4 \"Bar\" 5 \"Baz\" elementId=\"args-5\"}}`);\n\n assert.equal(this.$('#args-3').text(), 'Foo4Bar');\n assert.equal(this.$('#args-5').text(), 'Foo4Bar5Baz');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#args-3').text(), 'Foo4Bar');\n assert.equal(this.$('#args-5').text(), 'Foo4Bar5Baz');\n }\n\n ['@test arbitrary positional parameter conflict with hash parameter is reported']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n expectAssertion(() => {\n this.render(`{{sample-component \"Foo\" 4 \"Bar\" names=numbers id=\"args-3\"}}`, {\n numbers: [1, 2, 3]\n });\n }, 'You cannot specify positional parameters and the hash argument `names`.');\n }\n\n ['@test can use hash parameter instead of arbitrary positional param [GH #12444]']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render('{{sample-component names=things}}', {\n things: (0, _runtime.A)(['Foo', 4, 'Bar'])\n });\n\n this.assertText('Foo4Bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4Bar');\n\n this.runTask(() => this.context.get('things').pushObject(5));\n\n this.assertText('Foo4Bar5');\n\n this.runTask(() => this.context.get('things').shiftObject());\n\n this.assertText('4Bar5');\n\n this.runTask(() => this.context.get('things').clear());\n\n this.assertText('');\n\n this.runTask(() => this.context.set('things', (0, _runtime.A)(['Foo', 4, 'Bar'])));\n\n this.assertText('Foo4Bar');\n }\n\n ['@test can use hash parameter instead of positional param'](assert) {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['first', 'second']\n }),\n template: '{{first}} - {{second}}'\n });\n\n // TODO: Fix when id is implemented\n this.render(_abstractTestCase.strip`\n {{sample-component \"one\" \"two\" elementId=\"two-positional\"}}\n {{sample-component \"one\" second=\"two\" elementId=\"one-positional\"}}\n {{sample-component first=\"one\" second=\"two\" elementId=\"no-positional\"}}`);\n\n assert.equal(this.$('#two-positional').text(), 'one - two');\n assert.equal(this.$('#one-positional').text(), 'one - two');\n assert.equal(this.$('#no-positional').text(), 'one - two');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#two-positional').text(), 'one - two');\n assert.equal(this.$('#one-positional').text(), 'one - two');\n assert.equal(this.$('#no-positional').text(), 'one - two');\n }\n\n ['@test dynamic arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'n'\n }),\n template: _abstractTestCase.strip`\n {{#each n as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{sample-component user1 user2}}`, {\n user1: 'Foo',\n user2: 4\n });\n\n this.assertText('Foo4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4');\n\n this.runTask(() => this.context.set('user1', 'Bar'));\n\n this.assertText('Bar4');\n\n this.runTask(() => this.context.set('user2', '5'));\n\n this.assertText('Bar5');\n\n this.runTask(() => {\n this.context.set('user1', 'Foo');\n this.context.set('user2', 4);\n });\n\n this.assertText('Foo4');\n }\n\n ['@test with ariaRole specified']() {\n this.registerComponent('aria-test', {\n template: 'Here!'\n });\n\n this.render('{{aria-test ariaRole=role}}', {\n role: 'main'\n });\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n\n this.runTask(() => this.context.set('role', 'input'));\n\n this.assertComponentElement(this.firstChild, {\n attrs: { role: 'input' }\n });\n\n this.runTask(() => this.context.set('role', 'main'));\n\n this.assertComponentElement(this.firstChild, { attrs: { role: 'main' } });\n }\n\n ['@test with ariaRole defined but initially falsey GH#16379']() {\n this.registerComponent('aria-test', {\n template: 'Here!'\n });\n\n this.render('{{aria-test ariaRole=role}}', {\n role: undefined\n });\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.context.set('role', 'input'));\n\n this.assertComponentElement(this.firstChild, {\n attrs: { role: 'input' }\n });\n\n this.runTask(() => this.context.set('role', undefined));\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n }\n\n ['@test without ariaRole defined initially']() {\n // we are using the ability to lazily add a role as a sign that we are\n // doing extra work\n let instance;\n this.registerComponent('aria-test', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n instance = this;\n }\n }),\n template: 'Here!'\n });\n\n this.render('{{aria-test}}');\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n\n this.runTask(() => instance.set('ariaRole', 'input'));\n\n this.assertComponentElement(this.firstChild, { attrs: {} });\n }\n\n ['@test `template` specified in component is overridden by block']() {\n this.registerComponent('with-template', {\n ComponentClass: _helpers.Component.extend({\n template: (0, _helpers.compile)('Should not be used')\n }),\n template: '[In layout - {{name}}] {{yield}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-template name=\"with-block\"}}\n [In block - {{name}}]\n {{/with-template}}\n {{with-template name=\"without-block\"}}`, {\n name: 'Whoop, whoop!'\n });\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n\n this.runTask(() => this.context.set('name', 'Ole, ole'));\n\n this.assertText('[In layout - with-block] [In block - Ole, ole][In layout - without-block] ');\n\n this.runTask(() => this.context.set('name', 'Whoop, whoop!'));\n\n this.assertText('[In layout - with-block] [In block - Whoop, whoop!][In layout - without-block] ');\n }\n\n ['@test hasBlock is true when block supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n {{yield}}\n {{else}}\n No Block!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block}}\n In template\n {{/with-block}}`);\n\n this.assertText('In template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In template');\n }\n\n ['@test hasBlock is false when no block supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n {{yield}}\n {{else}}\n No Block!\n {{/if}}`\n });\n\n this.render('{{with-block}}');\n\n this.assertText('No Block!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Block!');\n }\n\n ['@test hasBlockParams is true when block param supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n {{yield this}} - In Component\n {{else}}\n {{yield}} No Block!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block as |something|}}\n In template\n {{/with-block}}`);\n\n this.assertText('In template - In Component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In template - In Component');\n }\n\n ['@test hasBlockParams is false when no block param supplied']() {\n this.registerComponent('with-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n {{yield this}}\n {{else}}\n {{yield}} No Block Param!\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#with-block}}\n In block\n {{/with-block}}`);\n\n this.assertText('In block No Block Param!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In block No Block Param!');\n }\n\n ['@test static named positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}}{{age}}'\n });\n\n this.render('{{sample-component \"Quint\" 4}}');\n\n this.assertText('Quint4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Quint4');\n }\n\n ['@test dynamic named positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n }),\n template: '{{name}}{{age}}'\n });\n\n this.render('{{sample-component myName myAge}}', {\n myName: 'Quint',\n myAge: 4\n });\n\n this.assertText('Quint4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Quint4');\n\n this.runTask(() => this.context.set('myName', 'Sergio'));\n\n this.assertText('Sergio4');\n\n this.runTask(() => this.context.set('myAge', 2));\n\n this.assertText('Sergio2');\n\n this.runTask(() => {\n this.context.set('myName', 'Quint');\n this.context.set('myAge', 4);\n });\n\n this.assertText('Quint4');\n }\n\n ['@test if a value is passed as a non-positional parameter, it raises an assertion']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name']\n }),\n template: '{{name}}'\n });\n\n expectDeprecation(() => {\n this.render('{{sample-component notMyName name=myName}}', {\n myName: 'Quint',\n notMyName: 'Sergio'\n });\n }, 'You cannot specify both a positional param (at position 0) and the hash argument `name`.');\n }\n\n ['@test yield to inverse']() {\n this.registerComponent('my-if', {\n template: _abstractTestCase.strip`\n {{#if predicate}}\n Yes:{{yield someValue}}\n {{else}}\n No:{{yield to=\"inverse\"}}\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#my-if predicate=activated someValue=42 as |result|}}\n Hello{{result}}\n {{else}}\n Goodbye\n {{/my-if}}`, {\n activated: true\n });\n\n this.assertText('Yes:Hello42');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Yes:Hello42');\n\n this.runTask(() => this.context.set('activated', false));\n\n this.assertText('No:Goodbye');\n\n this.runTask(() => this.context.set('activated', true));\n\n this.assertText('Yes:Hello42');\n }\n\n ['@test expression hasBlock inverse']() {\n this.registerComponent('check-inverse', {\n template: _abstractTestCase.strip`\n {{#if (hasBlock \"inverse\")}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-inverse}}{{/check-inverse}}\n {{#check-inverse}}{{else}}{{/check-inverse}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlock default']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (hasBlock)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{check-block}}\n {{#check-block}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams inverse']() {\n this.registerComponent('check-inverse', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams \"inverse\")}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-inverse}}{{/check-inverse}}\n {{#check-inverse as |something|}}{{/check-inverse}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'No' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams default']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-block}}{{/check-block}}\n {{#check-block as |something|}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test non-expression hasBlock']() {\n this.registerComponent('check-block', {\n template: _abstractTestCase.strip`\n {{#if hasBlock}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{check-block}}\n {{#check-block}}{{/check-block}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test expression hasBlockParams']() {\n this.registerComponent('check-params', {\n template: _abstractTestCase.strip`\n {{#if (hasBlockParams)}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-params}}{{/check-params}}\n {{#check-params as |foo|}}{{/check-params}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test non-expression hasBlockParams']() {\n this.registerComponent('check-params', {\n template: _abstractTestCase.strip`\n {{#if hasBlockParams}}\n Yes\n {{else}}\n No\n {{/if}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-params}}{{/check-params}}\n {{#check-params as |foo|}}{{/check-params}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'No' });\n this.assertComponentElement(this.nthChild(1), { content: 'Yes' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n });\n\n this.render(_abstractTestCase.strip`\n {{check-attr}}\n {{#check-attr}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock inverse expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n }, '');\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr}}{{else}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr as |something|}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'true' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams inverse expression in an attribute'](assert) {\n this.registerComponent('check-attr', {\n template: ''\n }, '');\n\n this.render(_abstractTestCase.strip`\n {{#check-attr}}{{/check-attr}}\n {{#check-attr as |something|}}{{/check-attr}}`);\n\n (0, _testHelpers.equalsElement)(assert, this.$('button')[0], 'button', { name: 'false' }, '');\n (0, _testHelpers.equalsElement)(assert, this.$('button')[1], 'button', { name: 'false' }, '');\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if hasBlock \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{check-helper}}\n {{#check-helper}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock as an expression param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlock) \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{check-helper}}\n {{#check-helper}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlock inverse as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlock \"inverse\") \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper}}{{else}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if hasBlockParams \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams as an expression param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlockParams) \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'true' });\n\n this.assertStableRerender();\n }\n\n ['@test hasBlockParams inverse as a param to a helper']() {\n this.registerComponent('check-helper', {\n template: '{{if (hasBlockParams \"inverse\") \"true\" \"false\"}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#check-helper}}{{/check-helper}}\n {{#check-helper as |something|}}{{/check-helper}}`);\n\n this.assertComponentElement(this.firstChild, { content: 'false' });\n this.assertComponentElement(this.nthChild(1), { content: 'false' });\n\n this.assertStableRerender();\n }\n\n ['@test component in template of a yielding component should have the proper parentView'](assert) {\n let outer, innerTemplate, innerLayout;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n }),\n template: '{{x-inner-in-layout}}{{yield}}'\n });\n\n this.registerComponent('x-inner-in-template', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerTemplate = this;\n }\n })\n });\n\n this.registerComponent('x-inner-in-layout', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerLayout = this;\n }\n })\n });\n\n this.render('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}');\n\n assert.equal(innerTemplate.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n assert.equal(innerLayout.parentView, outer, 'receives the wrapping component as its parentView in layout');\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n\n this.runTask(() => this.rerender());\n\n assert.equal(innerTemplate.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n assert.equal(innerLayout.parentView, outer, 'receives the wrapping component as its parentView in layout');\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n }\n\n ['@test newly-added sub-components get correct parentView'](assert) {\n let outer, inner;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n })\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n inner = this;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#x-outer}}\n {{#if showInner}}\n {{x-inner}}\n {{/if}}\n {{/x-outer}}`, {\n showInner: false\n });\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n\n this.runTask(() => this.rerender());\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView (after rerender)');\n\n this.runTask(() => this.context.set('showInner', true));\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n assert.equal(inner.parentView, outer, 'receives the wrapping component as its parentView in template blocks');\n\n this.runTask(() => this.context.set('showInner', false));\n\n assert.equal(outer.parentView, this.context, 'x-outer receives the ambient scope as its parentView');\n }\n\n [\"@test when a property is changed during children's rendering\"](assert) {\n let outer, middle;\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n },\n value: 1\n }),\n template: '{{#x-middle}}{{x-inner value=value}}{{/x-middle}}'\n });\n\n this.registerComponent('x-middle', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n middle = this;\n },\n value: null\n }),\n template: '
{{value}}
{{yield}}'\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n value: null,\n pushDataUp: (0, _metal.observer)('value', function () {\n middle.set('value', this.get('value'));\n })\n }),\n template: '
{{value}}
'\n });\n\n this.render('{{x-outer}}');\n\n assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner');\n assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner');\n assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)');\n\n let expectedBacktrackingMessage = /modified \"value\" twice on <.+?> in a single render\\. It was rendered in \"component:x-middle\" and modified in \"component:x-inner\"/;\n\n expectAssertion(() => {\n this.runTask(() => outer.set('value', 2));\n }, expectedBacktrackingMessage);\n }\n\n [\"@test when a shared dependency is changed during children's rendering\"]() {\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n value: 1,\n wrapper: _runtime.Object.create({ content: null })\n }),\n template: '
{{wrapper.content}}
{{x-inner value=value wrapper=wrapper}}'\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n this.get('wrapper').set('content', this.get('value'));\n },\n value: null\n }),\n template: '
{{wrapper.content}}
'\n });\n\n let expectedBacktrackingMessage = /modified \"wrapper\\.content\" twice on <.+?> in a single render\\. It was rendered in \"component:x-outer\" and modified in \"component:x-inner\"/;\n\n expectAssertion(() => {\n this.render('{{x-outer}}');\n }, expectedBacktrackingMessage);\n }\n\n ['@test non-block with each rendering child components']() {\n this.registerComponent('non-block', {\n template: _abstractTestCase.strip`\n In layout. {{#each items as |item|}}\n [{{child-non-block item=item}}]\n {{/each}}`\n });\n\n this.registerComponent('child-non-block', {\n template: 'Child: {{item}}.'\n });\n\n let items = (0, _runtime.A)(['Tom', 'Dick', 'Harry']);\n\n this.render('{{non-block items=items}}', { items });\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n\n this.runTask(() => this.context.get('items').pushObject('Sergio'));\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.][Child: Sergio.]');\n\n this.runTask(() => this.context.get('items').shiftObject());\n\n this.assertText('In layout. [Child: Dick.][Child: Harry.][Child: Sergio.]');\n\n this.runTask(() => this.context.set('items', (0, _runtime.A)(['Tom', 'Dick', 'Harry'])));\n\n this.assertText('In layout. [Child: Tom.][Child: Dick.][Child: Harry.]');\n }\n\n ['@test specifying classNames results in correct class'](assert) {\n this.registerComponent('some-clicky-thing', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'button',\n classNames: ['foo', 'bar']\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#some-clicky-thing classNames=\"baz\"}}\n Click Me\n {{/some-clicky-thing}}`);\n\n // TODO: ember-view is no longer viewable in the classNames array. Bug or\n // feature?\n let expectedClassNames = ['ember-view', 'foo', 'bar', 'baz'];\n\n assert.ok(this.$('button').is('.foo.bar.baz.ember-view'), `the element has the correct classes: ${this.$('button').attr('class')}`);\n // `ember-view` is no longer in classNames.\n // assert.deepEqual(clickyThing.get('classNames'), expectedClassNames, 'classNames are properly combined');\n this.assertComponentElement(this.firstChild, {\n tagName: 'button',\n attrs: { class: (0, _testHelpers.classes)(expectedClassNames.join(' ')) }\n });\n\n this.runTask(() => this.rerender());\n\n assert.ok(this.$('button').is('.foo.bar.baz.ember-view'), `the element has the correct classes: ${this.$('button').attr('class')} (rerender)`);\n // `ember-view` is no longer in classNames.\n // assert.deepEqual(clickyThing.get('classNames'), expectedClassNames, 'classNames are properly combined (rerender)');\n this.assertComponentElement(this.firstChild, {\n tagName: 'button',\n attrs: { class: (0, _testHelpers.classes)(expectedClassNames.join(' ')) }\n });\n }\n\n ['@test specifying custom concatenatedProperties avoids clobbering']() {\n this.registerComponent('some-clicky-thing', {\n ComponentClass: _helpers.Component.extend({\n concatenatedProperties: ['blahzz'],\n blahzz: ['blark', 'pory']\n }),\n template: _abstractTestCase.strip`\n {{#each blahzz as |p|}}\n {{p}}\n {{/each}}\n - {{yield}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#some-clicky-thing blahzz=\"baz\"}}\n Click Me\n {{/some-clicky-thing}}`);\n\n this.assertText('blarkporybaz- Click Me');\n\n this.runTask(() => this.rerender());\n\n this.assertText('blarkporybaz- Click Me');\n }\n\n ['@test a two way binding flows upstream when consumed in the template']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: '{{bar}}'\n });\n\n this.render('{{localBar}} - {{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value - initial value');\n\n if (true /* DEBUG */) {\n expectAssertion(() => {\n component.bar = 'foo-bar';\n }, /You must use set\\(\\) to set the `bar` property \\(of .+\\) to `foo-bar`\\./);\n\n this.assertText('initial value - initial value');\n }\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value - updated value');\n\n this.runTask(() => {\n component.set('bar', undefined);\n });\n\n this.assertText(' - ');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value - initial value');\n }\n\n ['@test a two way binding flows upstream through a CP when consumed in the template']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n\n bar: (0, _metal.computed)({\n get() {\n return this._bar;\n },\n\n set(key, value) {\n this._bar = value;\n return this._bar;\n }\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n\n template: '{{bar}}'\n });\n\n this.render('{{localBar}} - {{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value - initial value');\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value - updated value');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value - initial value');\n }\n\n ['@test a two way binding flows upstream through a CP without template consumption']() {\n let component;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n\n bar: (0, _metal.computed)({\n get() {\n return this._bar;\n },\n\n set(key, value) {\n this._bar = value;\n return this._bar;\n }\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: ''\n });\n\n this.render('{{localBar}}{{foo-bar bar=localBar}}', {\n localBar: 'initial value'\n });\n\n this.assertText('initial value');\n\n this.runTask(() => this.rerender());\n\n this.assertText('initial value');\n\n this.runTask(() => {\n component.set('bar', 'updated value');\n });\n\n this.assertText('updated value');\n\n this.runTask(() => {\n this.component.set('localBar', 'initial value');\n });\n\n this.assertText('initial value');\n }\n\n ['@test services can be injected into components']() {\n let service;\n this.registerService('name', _service.default.extend({\n init() {\n this._super(...arguments);\n service = this;\n },\n last: 'Jackson'\n }));\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n name: (0, _service.inject)()\n }),\n template: '{{name.last}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Jackson');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Jackson');\n\n this.runTask(() => {\n service.set('last', 'McGuffey');\n });\n\n this.assertText('McGuffey');\n\n this.runTask(() => {\n service.set('last', 'Jackson');\n });\n\n this.assertText('Jackson');\n }\n\n ['@test injecting an unknown service raises an exception']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n missingService: (0, _service.inject)()\n })\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, \"Attempting to inject an unknown injection: 'service:missingService'\");\n }\n\n ['@test throws if `this._super` is not called from `init`']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {}\n })\n });\n\n expectAssertion(() => {\n this.render('{{foo-bar}}');\n }, /You must call `this._super\\(...arguments\\);` when overriding `init` on a framework object. Please update .* to call `this._super\\(...arguments\\);` from `init`./);\n }\n\n ['@test should toggle visibility with isVisible'](assert) {\n let assertStyle = expected => {\n let matcher = (0, _testHelpers.styles)(expected);\n let actual = this.firstChild.getAttribute('style');\n\n assert.pushResult({\n result: matcher.match(actual),\n message: matcher.message(),\n actual,\n expected\n });\n };\n\n this.registerComponent('foo-bar', {\n template: `

foo

`\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" isVisible=visible}}`, {\n visible: false\n });\n\n assertStyle('display: none;');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n assertStyle('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n });\n assertStyle('display: none;');\n }\n\n ['@test isVisible does not overwrite component style']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n style: (0, _helpers.htmlSafe)('color: blue;')\n }),\n\n template: `

foo

`\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" isVisible=visible}}`, {\n visible: false\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue; display: none;') }\n });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue;') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { id: 'foo-bar', style: (0, _testHelpers.styles)('color: blue; display: none;') }\n });\n }\n\n ['@test adds isVisible binding when style binding is missing and other bindings exist'](assert) {\n let assertStyle = expected => {\n let matcher = (0, _testHelpers.styles)(expected);\n let actual = this.firstChild.getAttribute('style');\n\n assert.pushResult({\n result: matcher.match(actual),\n message: matcher.message(),\n actual,\n expected\n });\n };\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['foo'],\n foo: 'bar'\n }),\n template: `

foo

`\n });\n\n this.render(`{{foo-bar id=\"foo-bar\" foo=foo isVisible=visible}}`, {\n visible: false,\n foo: 'baz'\n });\n\n assertStyle('display: none;');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', true);\n });\n\n assertStyle('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'visible', false);\n (0, _metal.set)(this.context, 'foo', 'woo');\n });\n\n assertStyle('display: none;');\n assert.equal(this.firstChild.getAttribute('foo'), 'woo');\n }\n\n ['@test it can use readDOMAttr to read input value']() {\n let component;\n let assertElement = expectedValue => {\n // value is a property, not an attribute\n this.assertHTML(``);\n this.assert.equal(this.firstChild.value, expectedValue, 'value property is correct');\n this.assert.equal((0, _metal.get)(component, 'value'), expectedValue, 'component.get(\"value\") is correct');\n };\n\n this.registerComponent('one-way-input', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'input',\n attributeBindings: ['value'],\n\n init() {\n this._super(...arguments);\n component = this;\n },\n\n change() {\n let value = this.readDOMAttr('value');\n this.set('value', value);\n }\n })\n });\n\n this.render('{{one-way-input value=value}}', {\n value: 'foo'\n });\n\n assertElement('foo');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.firstChild.value = 'bar';\n this.$('input').trigger('change');\n });\n\n assertElement('bar');\n\n this.runTask(() => {\n this.firstChild.value = 'foo';\n this.$('input').trigger('change');\n });\n\n assertElement('foo');\n\n this.runTask(() => {\n (0, _metal.set)(component, 'value', 'bar');\n });\n\n assertElement('bar');\n\n this.runTask(() => {\n this.firstChild.value = 'foo';\n this.$('input').trigger('change');\n });\n\n assertElement('foo');\n }\n\n ['@test child triggers revalidate during parent destruction (GH#13846)']() {\n this.registerComponent('x-select', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'select',\n\n init() {\n this._super();\n this.options = (0, _runtime.A)([]);\n this.value = null;\n },\n\n updateValue() {\n var newValue = this.get('options.lastObject.value');\n\n this.set('value', newValue);\n },\n\n registerOption(option) {\n this.get('options').addObject(option);\n },\n\n unregisterOption(option) {\n this.get('options').removeObject(option);\n\n this.updateValue();\n }\n }),\n\n template: '{{yield this}}'\n });\n\n this.registerComponent('x-option', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'option',\n attributeBindings: ['selected'],\n\n didInsertElement() {\n this._super(...arguments);\n\n this.get('select').registerOption(this);\n },\n\n selected: (0, _metal.computed)('select.value', function () {\n return this.get('value') === this.get('select.value');\n }),\n\n willDestroyElement() {\n this._super(...arguments);\n this.get('select').unregisterOption(this);\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#x-select value=value as |select|}}\n {{#x-option value=\"1\" select=select}}1{{/x-option}}\n {{#x-option value=\"2\" select=select}}2{{/x-option}}\n {{/x-select}}\n `);\n\n this.teardown();\n\n this.assert.ok(true, 'no errors during teardown');\n }\n\n ['@test setting a property in willDestroyElement does not assert (GH#14273)'](assert) {\n assert.expect(2);\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.showFoo = true;\n },\n\n willDestroyElement() {\n this.set('showFoo', false);\n assert.ok(true, 'willDestroyElement was fired');\n this._super(...arguments);\n }\n }),\n\n template: `{{#if showFoo}}things{{/if}}`\n });\n\n this.render(`{{foo-bar}}`);\n\n this.assertText('things');\n }\n\n ['@test didReceiveAttrs fires after .init() but before observers become active'](assert) {\n let barCopyDidChangeCount = 0;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.didInit = true;\n },\n\n didReceiveAttrs() {\n assert.ok(this.didInit, 'expected init to have run before didReceiveAttrs');\n this.set('barCopy', this.attrs.bar.value + 1);\n },\n\n barCopyDidChange: (0, _metal.observer)('barCopy', () => {\n barCopyDidChangeCount++;\n })\n }),\n\n template: '{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar bar=bar}}`, { bar: 3 });\n\n this.assertText('3-4');\n\n assert.strictEqual(barCopyDidChangeCount, 1, 'expected observer firing for: barCopy');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 7));\n\n this.assertText('7-8');\n\n assert.strictEqual(barCopyDidChangeCount, 2, 'expected observer firing for: barCopy');\n }\n\n ['@test overriding didReceiveAttrs does not trigger deprecation'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didReceiveAttrs() {\n assert.equal(1, this.get('foo'), 'expected attrs to have correct value');\n }\n }),\n\n template: '{{foo}}-{{fooCopy}}-{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar foo=foo bar=bar}}`, { foo: 1, bar: 3 });\n }\n\n ['@test overriding didUpdateAttrs does not trigger deprecation'](assert) {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didUpdateAttrs() {\n assert.equal(5, this.get('foo'), 'expected newAttrs to have new value');\n }\n }),\n\n template: '{{foo}}-{{fooCopy}}-{{bar}}-{{barCopy}}'\n });\n\n this.render(`{{foo-bar foo=foo bar=bar}}`, { foo: 1, bar: 3 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 5));\n }\n\n ['@test returning `true` from an action does not bubble if `target` is not specified (GH#14275)'](assert) {\n this.registerComponent('display-toggle', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n show() {\n assert.ok(true, 'display-toggle show action was called');\n return true;\n }\n }\n }),\n\n template: ``\n });\n\n this.render(`{{display-toggle}}`, {\n send() {\n assert.notOk(true, 'send should not be called when action is not \"subscribed\" to');\n }\n });\n\n this.assertText('Show');\n\n this.runTask(() => this.$('button').click());\n }\n\n ['@test returning `true` from an action bubbles to the `target` if specified'](assert) {\n assert.expect(4);\n\n this.registerComponent('display-toggle', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n show() {\n assert.ok(true, 'display-toggle show action was called');\n return true;\n }\n }\n }),\n\n template: ``\n });\n\n this.render(`{{display-toggle target=this}}`, {\n send(actionName) {\n assert.ok(true, 'send should be called when action is \"subscribed\" to');\n assert.equal(actionName, 'show');\n }\n });\n\n this.assertText('Show');\n\n this.runTask(() => this.$('button').click());\n }\n\n ['@test triggering an event only attempts to invoke an identically named method, if it actually is a function (GH#15228)'](assert) {\n assert.expect(3);\n\n let payload = ['arbitrary', 'event', 'data'];\n\n this.registerComponent('evented-component', {\n ComponentClass: _helpers.Component.extend({\n someTruthyProperty: true,\n\n init() {\n this._super(...arguments);\n this.trigger('someMethod', ...payload);\n this.trigger('someTruthyProperty', ...payload);\n },\n\n someMethod(...data) {\n assert.deepEqual(data, payload, 'the method `someMethod` should be called, when `someMethod` is triggered');\n },\n\n listenerForSomeMethod: (0, _metal.on)('someMethod', function (...data) {\n assert.deepEqual(data, payload, 'the listener `listenerForSomeMethod` should be called, when `someMethod` is triggered');\n }),\n\n listenerForSomeTruthyProperty: (0, _metal.on)('someTruthyProperty', function (...data) {\n assert.deepEqual(data, payload, 'the listener `listenerForSomeTruthyProperty` should be called, when `someTruthyProperty` is triggered');\n })\n })\n });\n\n this.render(`{{evented-component}}`);\n }\n\n ['@test component yielding in an {{#each}} has correct block values after rerendering (GH#14284)']() {\n this.registerComponent('list-items', {\n template: `{{#each items as |item|}}{{yield item}}{{/each}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#list-items items=items as |thing|}}\n |{{thing}}|\n\n {{#if editMode}}\n Remove {{thing}}\n {{/if}}\n {{/list-items}}\n `, {\n editMode: false,\n items: ['foo', 'bar', 'qux', 'baz']\n });\n\n this.assertText('|foo||bar||qux||baz|');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'editMode', true));\n\n this.assertText('|foo|Remove foo|bar|Remove bar|qux|Remove qux|baz|Remove baz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'editMode', false));\n\n this.assertText('|foo||bar||qux||baz|');\n }\n\n ['@test unimplimented positionalParams do not cause an error GH#14416']() {\n this.registerComponent('foo-bar', {\n template: 'hello'\n });\n\n this.render('{{foo-bar wat}}');\n this.assertText('hello');\n }\n\n ['@test using attrs for positional params']() {\n let MyComponent = _helpers.Component.extend();\n\n this.registerComponent('foo-bar', {\n ComponentClass: MyComponent.reopenClass({\n positionalParams: ['myVar']\n }),\n template: 'MyVar1: {{attrs.myVar}} {{myVar}} MyVar2: {{myVar2}} {{attrs.myVar2}}'\n });\n\n this.render('{{foo-bar 1 myVar2=2}}');\n\n this.assertText('MyVar1: 1 1 MyVar2: 2 2');\n }\n\n ['@feature(ember-glimmer-named-arguments) using named arguments for positional params']() {\n let MyComponent = _helpers.Component.extend();\n\n this.registerComponent('foo-bar', {\n ComponentClass: MyComponent.reopenClass({\n positionalParams: ['myVar']\n }),\n template: 'MyVar1: {{@myVar}} {{myVar}} MyVar2: {{myVar2}} {{@myVar2}}'\n });\n\n this.render('{{foo-bar 1 myVar2=2}}');\n\n this.assertText('MyVar1: 1 1 MyVar2: 2 2');\n }\n\n [\"@test can use `{{this}}` to emit the component's toString value [GH#14581]\"]() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n toString() {\n return 'special sauce goes here!';\n }\n }),\n template: '{{this}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('special sauce goes here!');\n }\n\n ['@test can use `{{this` to access paths on current context [GH#14581]']() {\n let instance;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n instance = this;\n },\n\n foo: {\n bar: {\n baz: 'huzzah!'\n }\n }\n }),\n template: '{{this.foo.bar.baz}}'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('huzzah!');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'foo.bar.baz', 'yippie!'));\n\n this.assertText('yippie!');\n\n this.runTask(() => (0, _metal.set)(instance, 'foo.bar.baz', 'huzzah!'));\n\n this.assertText('huzzah!');\n }\n\n ['@test can use custom element in component layout']() {\n this.registerComponent('foo-bar', {\n template: 'Hi!'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Hi!');\n }\n\n ['@test can use nested custom element in component layout']() {\n this.registerComponent('foo-bar', {\n template: 'Hi!'\n });\n\n this.render('{{foo-bar}}');\n\n this.assertText('Hi!');\n }\n\n ['@feature(!ember-glimmer-named-arguments) can access properties off of rest style positionalParams array']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'things'\n }),\n // using `attrs` here to simulate `@things.length`\n template: `{{attrs.things.length}}`\n });\n\n this.render('{{foo-bar \"foo\" \"bar\" \"baz\"}}');\n\n this.assertText('3');\n }\n\n ['@feature(ember-glimmer-named-arguments) can access properties off of rest style positionalParams array']() {\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'things'\n }),\n template: `{{@things.length}}`\n });\n\n this.render('{{foo-bar \"foo\" \"bar\" \"baz\"}}');\n\n this.assertText('3');\n }\n\n ['@test has attrs by didReceiveAttrs with native classes'](assert) {\n class FooBarComponent extends _helpers.Component {\n constructor(injections) {\n super(injections);\n // analagous to class field defaults\n this.foo = 'bar';\n }\n\n didReceiveAttrs() {\n assert.equal(this.foo, 'bar', 'received default attrs correctly');\n }\n }\n\n this.registerComponent('foo-bar', { ComponentClass: FooBarComponent });\n\n this.render('{{foo-bar}}');\n }\n });\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Components test: curly components: jQuery disabled', class extends _testCase.RenderingTest {\n ['@test jQuery proxy is not available without jQuery']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n expectAssertion(() => {\n instance.$()[0];\n }, 'You cannot access this.$() with `jQuery` disabled.');\n }\n });\n } else {\n (0, _testCase.moduleFor)('Components test: curly components: jQuery enabled', class extends _testCase.RenderingTest {\n ['@test it has a jQuery proxy to the element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{foo-bar}}');\n\n let element1 = instance.$()[0];\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.$()[0];\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it scopes the jQuery proxy to the component element'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'inner'\n });\n\n this.render('outer{{foo-bar}}');\n\n let $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n\n this.runTask(() => this.rerender());\n\n $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/destroy-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Component destroy', class extends _testCase.RenderingTest {\n ['@test it correctly releases the destroyed components'](assert) {\n let FooBarComponent = _helpers.Component.extend({});\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n this.assertText('');\n\n assert.equal(this.env.destroyedComponents.length, 0, 'environment.destroyedComponents should be empty');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/dynamic-components-test', ['@ember/-internals/metal', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _views, _helpers, _abstractTestCase, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: dynamic components', class extends _testCase.RenderingTest {\n ['@test it can render a basic component with a static component name argument']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component \"foo-bar\" name=name}}', { name: 'Sarah' });\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Gavin'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello Gavin' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Sarah'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello Sarah' });\n }\n\n ['@test it can render a basic component with a dynamic component name argument']() {\n this.registerComponent('foo-bar', {\n template: 'hello {{name}} from foo-bar'\n });\n this.registerComponent('foo-bar-baz', {\n template: 'hello {{name}} from foo-bar-baz'\n });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben from foo-bar-baz'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'foo-bar');\n (0, _metal.set)(this.context, 'name', 'Alex');\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex from foo-bar'\n });\n }\n\n ['@test it has an element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n let element1 = instance.element;\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.element;\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it has the right parentView and childViews'](assert) {\n let fooBarInstance, fooBarBazInstance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n }\n });\n\n let FooBarBazComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarBazInstance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'foo-bar {{foo-bar-baz}}'\n });\n this.registerComponent('foo-bar-baz', {\n ComponentClass: FooBarBazComponent,\n template: 'foo-bar-baz'\n });\n\n this.render('{{component \"foo-bar\"}}');\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n\n this.runTask(() => this.rerender());\n this.assertText('foo-bar foo-bar-baz');\n\n assert.equal(fooBarInstance.parentView, this.component);\n assert.equal(fooBarBazInstance.parentView, fooBarInstance);\n\n assert.deepEqual(this.component.childViews, [fooBarInstance]);\n assert.deepEqual(fooBarInstance.childViews, [fooBarBazInstance]);\n }\n\n ['@test it can render a basic component with a block']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#component \"foo-bar\"}}hello{{/component}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it renders the layout with the component instance as the context']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n this.set('message', 'hello');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{message}}'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(instance, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test it preserves the outer context when yielding']() {\n this.registerComponent('foo-bar', { template: '{{yield}}' });\n\n this.render('{{#component \"foo-bar\"}}{{message}}{{/component}}', {\n message: 'hello'\n });\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertComponentElement(this.firstChild, { content: 'goodbye' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n }\n\n ['@test the component and its child components are destroyed'](assert) {\n let destroyed = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0 };\n\n this.registerComponent('foo-bar', {\n template: '{{id}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed[this.get('id')]++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond1}}\n {{#component \"foo-bar\" id=1}}\n {{#if cond2}}\n {{#component \"foo-bar\" id=2}}{{/component}}\n {{#if cond3}}\n {{#component \"foo-bar\" id=3}}\n {{#if cond4}}\n {{#component \"foo-bar\" id=4}}\n {{#if cond5}}\n {{#component \"foo-bar\" id=5}}{{/component}}\n {{#component \"foo-bar\" id=6}}{{/component}}\n {{#component \"foo-bar\" id=7}}{{/component}}\n {{/if}}\n {{#component \"foo-bar\" id=8}}{{/component}}\n {{/component}}\n {{/if}}\n {{/component}}\n {{/if}}\n {{/if}}\n {{/component}}\n {{/if}}`, {\n cond1: true,\n cond2: true,\n cond3: true,\n cond4: true,\n cond5: true\n });\n\n this.assertText('1 2 3 4 5 6 7 8 ');\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 0,\n 6: 0,\n 7: 0,\n 8: 0\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond5', false));\n\n this.assertText('1 2 3 4 8 ');\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 0,\n 4: 0,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 0\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond3', false);\n (0, _metal.set)(this.context, 'cond5', true);\n (0, _metal.set)(this.context, 'cond4', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 0,\n 2: 0,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', false);\n (0, _metal.set)(this.context, 'cond1', false);\n });\n\n assert.deepEqual(destroyed, {\n 1: 1,\n 2: 1,\n 3: 1,\n 4: 1,\n 5: 1,\n 6: 1,\n 7: 1,\n 8: 1\n });\n }\n\n ['@test component helper destroys underlying component when it is swapped out'](assert) {\n let destroyed = { 'foo-bar': 0, 'foo-bar-baz': 0 };\n let testContext = this;\n\n this.registerComponent('foo-bar', {\n template: 'hello from foo-bar',\n ComponentClass: _helpers.Component.extend({\n willDestroyElement() {\n assert.equal(testContext.$(`#${this.elementId}`).length, 1, 'element is still attached to the document');\n },\n\n willDestroy() {\n this._super();\n destroyed['foo-bar']++;\n }\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'hello from foo-bar-baz',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyed['foo-bar-baz']++;\n }\n })\n });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar'\n });\n\n assert.deepEqual(destroyed, { 'foo-bar': 0, 'foo-bar-baz': 0 });\n\n this.runTask(() => this.rerender());\n\n assert.deepEqual(destroyed, { 'foo-bar': 0, 'foo-bar-baz': 0 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n assert.deepEqual(destroyed, { 'foo-bar': 1, 'foo-bar-baz': 0 });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar'));\n\n assert.deepEqual(destroyed, { 'foo-bar': 1, 'foo-bar-baz': 1 });\n }\n\n ['@test component helper with bound properties are updating correctly in init of component']() {\n this.registerComponent('foo-bar', {\n template: 'foo-bar {{location}} {{locationCopy}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n init: function () {\n this._super(...arguments);\n this.set('locationCopy', this.get('location'));\n }\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'foo-bar-baz {{location}} {{locationCopy}} {{yield}}',\n ComponentClass: _helpers.Component.extend({\n init: function () {\n this._super(...arguments);\n this.set('locationCopy', this.get('location'));\n }\n })\n });\n\n this.registerComponent('outer-component', {\n template: '{{#component componentName location=location}}arepas!{{/component}}',\n ComponentClass: _helpers.Component.extend({\n componentName: (0, _metal.computed)('location', function () {\n if (this.get('location') === 'Caracas') {\n return 'foo-bar';\n } else {\n return 'foo-bar-baz';\n }\n })\n })\n });\n\n this.render('{{outer-component location=location}}', {\n location: 'Caracas'\n });\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Loisaida'));\n\n this.assertText('foo-bar-baz Loisaida Loisaida arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Caracas'));\n\n this.assertText('foo-bar Caracas Caracas arepas!');\n }\n\n ['@test component helper with actions'](assert) {\n this.registerComponent('inner-component', {\n template: 'inner-component {{yield}}',\n ComponentClass: _helpers.Component.extend({\n classNames: 'inner-component',\n didInsertElement() {\n // trigger action on click in absence of app's EventDispatcher\n let sendAction = this.eventHandler = () => {\n if (this.somethingClicked) {\n this.somethingClicked();\n }\n };\n this.element.addEventListener('click', sendAction);\n },\n willDestroyElement() {\n this.element.removeEventListener('click', this.eventHandler);\n }\n })\n });\n\n let actionTriggered = 0;\n this.registerComponent('outer-component', {\n template: '{{#component componentName somethingClicked=(action \"mappedAction\")}}arepas!{{/component}}',\n ComponentClass: _helpers.Component.extend({\n classNames: 'outer-component',\n componentName: 'inner-component',\n actions: {\n mappedAction() {\n actionTriggered++;\n }\n }\n })\n });\n\n this.render('{{outer-component}}');\n\n assert.equal(actionTriggered, 0, 'action was not triggered');\n\n this.runTask(() => {\n this.$('.inner-component').click();\n });\n\n assert.equal(actionTriggered, 1, 'action was triggered');\n }\n\n ['@test nested component helpers']() {\n this.registerComponent('foo-bar', {\n template: 'yippie! {{attrs.location}} {{yield}}'\n });\n this.registerComponent('baz-qux', {\n template: 'yummy {{attrs.location}} {{yield}}'\n });\n this.registerComponent('corge-grault', {\n template: 'delicious {{attrs.location}} {{yield}}'\n });\n\n this.render('{{#component componentName1 location=location}}{{#component componentName2 location=location}}arepas!{{/component}}{{/component}}', {\n componentName1: 'foo-bar',\n componentName2: 'baz-qux',\n location: 'Caracas'\n });\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'location', 'Loisaida'));\n\n this.assertText('yippie! Loisaida yummy Loisaida arepas!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName1', 'corge-grault'));\n\n this.assertText('delicious Loisaida yummy Loisaida arepas!');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName1', 'foo-bar');\n (0, _metal.set)(this.context, 'location', 'Caracas');\n });\n\n this.assertText('yippie! Caracas yummy Caracas arepas!');\n }\n\n ['@test component with dynamic name argument resolving to non-existent component']() {\n expectAssertion(() => {\n this.render('{{component componentName}}', {\n componentName: 'does-not-exist'\n });\n }, /Could not find component named \"does-not-exist\"/);\n }\n\n ['@test component with static name argument for non-existent component']() {\n expectAssertion(() => {\n this.render('{{component \"does-not-exist\"}}');\n }, /Could not find component named \"does-not-exist\"/);\n }\n\n ['@test component with dynamic component name resolving to a component, then non-existent component']() {\n this.registerComponent('foo-bar', { template: 'hello {{name}}' });\n\n this.render('{{component componentName name=name}}', {\n componentName: 'foo-bar',\n name: 'Alex'\n });\n\n this.assertText('hello Alex');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello Alex');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', undefined));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar'));\n\n this.assertText('hello Alex');\n }\n\n ['@test component helper properly invalidates hash params inside an {{each}} invocation #11044']() {\n this.registerComponent('foo-bar', {\n template: '[{{internalName}} - {{name}}]',\n ComponentClass: _helpers.Component.extend({\n willRender() {\n // store internally available name to ensure that the name available in `this.attrs.name`\n // matches the template lookup name\n (0, _metal.set)(this, 'internalName', this.get('name'));\n }\n })\n });\n\n this.render('{{#each items as |item|}}{{component \"foo-bar\" name=item.name}}{{/each}}', {\n items: [{ name: 'Robert' }, { name: 'Jacquie' }]\n });\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', [{ name: 'Max' }, { name: 'James' }]));\n\n this.assertText('[Max - Max][James - James]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', [{ name: 'Robert' }, { name: 'Jacquie' }]));\n\n this.assertText('[Robert - Robert][Jacquie - Jacquie]');\n }\n\n ['@test dashless components should not be found'](assert) {\n if (true /* EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION */) {\n assert.ok(true, 'test is not applicable');\n return;\n }\n\n this.registerComponent('dashless2', { template: 'Do not render me!' });\n\n expectAssertion(() => {\n this.render('{{component \"dashless\"}}');\n }, /You cannot use 'dashless' as a component name. Component names must contain a hyphen./);\n }\n\n ['@test positional parameters does not clash when rendering different components']() {\n this.registerComponent('foo-bar', {\n template: 'hello {{name}} ({{age}}) from foo-bar',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n })\n });\n\n this.registerComponent('foo-bar-baz', {\n template: 'hello {{name}} ({{age}}) from foo-bar-baz',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['name', 'age']\n })\n });\n\n this.render('{{component componentName name age}}', {\n componentName: 'foo-bar',\n name: 'Alex',\n age: 29\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (29) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 22));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (22) from foo-bar'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'foo-bar-baz'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Ben (22) from foo-bar-baz'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'foo-bar');\n (0, _metal.set)(this.context, 'name', 'Alex');\n (0, _metal.set)(this.context, 'age', 29);\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'hello Alex (29) from foo-bar'\n });\n }\n\n ['@test positional parameters does not pollute the attributes when changing components']() {\n this.registerComponent('normal-message', {\n template: 'Normal: {{something}}!',\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: ['something']\n })\n });\n\n this.registerComponent('alternative-message', {\n template: 'Alternative: {{something}} {{somethingElse}}!',\n ComponentClass: _helpers.Component.extend({\n something: 'Another'\n }).reopenClass({\n positionalParams: ['somethingElse']\n })\n });\n\n this.render('{{component componentName message}}', {\n componentName: 'normal-message',\n message: 'Hello'\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'alternative-message'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Alternative: Another Hello!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'Hi'));\n\n this.assertComponentElement(this.firstChild, {\n content: 'Alternative: Another Hi!'\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'componentName', 'normal-message');\n (0, _metal.set)(this.context, 'message', 'Hello');\n });\n\n this.assertComponentElement(this.firstChild, {\n content: 'Normal: Hello!'\n });\n }\n\n ['@test static arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'names'\n }),\n template: _abstractTestCase.strip`\n {{#each names as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{component \"sample-component\" \"Foo\" 4 \"Bar\" 5 \"Baz\" elementId=\"helper\"}}`);\n\n this.assertText('Foo4Bar5Baz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4Bar5Baz');\n }\n\n ['@test dynamic arbitrary number of positional parameters']() {\n this.registerComponent('sample-component', {\n ComponentClass: _helpers.Component.extend().reopenClass({\n positionalParams: 'n'\n }),\n template: _abstractTestCase.strip`\n {{#each n as |name|}}\n {{name}}\n {{/each}}`\n });\n\n this.render(`{{component \"sample-component\" user1 user2}}`, {\n user1: 'Foo',\n user2: 4\n });\n\n this.assertText('Foo4');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Foo4');\n\n this.runTask(() => this.context.set('user1', 'Bar'));\n\n this.assertText('Bar4');\n\n this.runTask(() => this.context.set('user2', '5'));\n\n this.assertText('Bar5');\n\n this.runTask(() => {\n this.context.set('user1', 'Foo');\n this.context.set('user2', 4);\n });\n\n this.assertText('Foo4');\n }\n\n ['@test component helper emits useful backtracking re-render assertion message']() {\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person', { name: 'Alex' });\n }\n }),\n template: `Hi {{person.name}}! {{component \"error-component\" person=person}}`\n });\n\n this.registerComponent('error-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person.name', { name: 'Ben' });\n }\n }),\n template: '{{person.name}}'\n });\n\n let expectedBacktrackingMessage = /modified \"person\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"component:outer-component\" and modified in \"component:error-component\"/;\n\n expectAssertion(() => {\n this.render('{{component componentName}}', {\n componentName: 'outer-component'\n });\n }, expectedBacktrackingMessage);\n }\n });\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Components test: dynamic components: jQuery disabled', class extends _testCase.RenderingTest {\n ['@test jQuery proxy is not available without jQuery']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n expectAssertion(() => {\n instance.$()[0];\n }, 'You cannot access this.$() with `jQuery` disabled.');\n }\n });\n } else {\n (0, _testCase.moduleFor)('Components test: dynamic components : jQuery enabled', class extends _testCase.RenderingTest {\n ['@test it has a jQuery proxy to the element']() {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{component \"foo-bar\"}}');\n\n let element1 = instance.$()[0];\n\n this.assertComponentElement(element1, { content: 'hello' });\n\n this.runTask(() => this.rerender());\n\n let element2 = instance.$()[0];\n\n this.assertComponentElement(element2, { content: 'hello' });\n\n this.assertSameNode(element2, element1);\n }\n\n ['@test it scopes the jQuery proxy to the component element'](assert) {\n let instance;\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n instance = this;\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'inner'\n });\n\n this.render('outer{{component \"foo-bar\"}}');\n\n let $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n\n this.runTask(() => this.rerender());\n\n $span = instance.$('span');\n\n assert.equal($span.length, 1);\n assert.equal($span.attr('class'), 'inner');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/error-handling-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Errors thrown during render', class extends _testCase.RenderingTest {\n ['@test it can recover resets the transaction when an error is thrown during initial render'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake in init!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n assert.throws(() => {\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', { switch: true });\n }, /silly mistake in init/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n shouldThrow = false;\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during rerender'](assert) {\n let shouldThrow = false;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake in init!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n shouldThrow = true;\n\n assert.throws(() => {\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n }, /silly mistake in init/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n shouldThrow = false;\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during didInsertElement'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n assert.throws(() => {\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', { switch: true });\n }, /silly mistake/);\n\n assert.equal(this.env.inTransaction, false, 'should not be in a transaction even though an error was thrown');\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n this.assertText('');\n }\n\n ['@test it can recover resets the transaction when an error is thrown during destroy'](assert) {\n let shouldThrow = true;\n let FooBarComponent = _helpers.Component.extend({\n destroy() {\n this._super(...arguments);\n if (shouldThrow) {\n throw new Error('silly mistake!');\n }\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{#foo-bar}}{{foo-bar}}{{/foo-bar}}{{/if}}', {\n switch: true\n });\n\n this.assertText('hello');\n\n assert.throws(() => {\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n }, /silly mistake/);\n\n this.assertText('');\n\n shouldThrow = false;\n this.runTask(() => (0, _metal.set)(this.context, 'switch', true));\n\n this.assertText('hello');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/fragment-components-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _abstractTestCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: fragment components', class extends _testCase.RenderingTest {\n getCustomDispatcherEvents() {\n return {\n hitDem: 'folks'\n };\n }\n\n ['@test fragments do not render an outer tag']() {\n let instance;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n init() {\n this._super();\n instance = this;\n this.foo = true;\n this.bar = 'bar';\n }\n });\n\n let template = `{{#if foo}}
Hey
{{/if}}{{yield bar}}`;\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n this.render(`{{#foo-bar as |bar|}}{{bar}}{{/foo-bar}}`);\n\n this.assertHTML(_abstractTestCase.strip`
Hey
bar`);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(instance, 'foo', false));\n\n this.assertHTML(_abstractTestCase.strip`bar`);\n\n this.runTask(() => (0, _metal.set)(instance, 'bar', 'bizz'));\n\n this.assertHTML(_abstractTestCase.strip`bizz`);\n\n this.runTask(() => {\n (0, _metal.set)(instance, 'bar', 'bar');\n (0, _metal.set)(instance, 'foo', true);\n });\n }\n\n ['@test throws an error if an event function is defined in a tagless component']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n click() {}\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You can not define a function that handles DOM events in the .* tagless component since it doesn't have any DOM element./);\n }\n\n ['@test throws an error if a custom defined event function is defined in a tagless component']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n folks() {}\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You can not define a function that handles DOM events in the .* tagless component since it doesn't have any DOM element./);\n }\n\n ['@test throws an error if `tagName` is an empty string and `classNameBindings` are specified']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n foo: true,\n classNameBindings: ['foo:is-foo:is-bar']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `classNameBindings` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `attributeBindings` are specified']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n attributeBindings: ['href']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `attributeBindings` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `elementId` is specified via JS']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n elementId: 'turntUp'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot use `elementId` on a tag-less component/);\n }\n\n ['@test throws an error if `tagName` is an empty string and `elementId` is specified via template']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n expectAssertion(() => {\n this.render(`{{#foo-bar elementId='turntUp'}}{{/foo-bar}}`);\n }, /You cannot use `elementId` on a tag-less component/);\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via JS']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n id: 'baz'\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via template']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n this.render(`{{#foo-bar id='baz'}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is bound property specified via template']() {\n let template = `{{id}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n this.render(`{{#foo-bar id=fooBarId}}{{/foo-bar}}`, { fooBarId: 'baz' });\n\n this.assertText('baz');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBarId', 'qux'));\n\n this.assertText('qux');\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBarId', 'baz'));\n\n this.assertText('baz');\n }\n\n ['@test does not throw an error if `tagName` is an empty string and `id` is specified via template and passed to child component']() {\n let fooBarTemplate = `{{#baz-child id=id}}{{/baz-child}}`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: ''\n });\n let BazChildComponent = _helpers.Component.extend();\n let bazChildTemplate = `{{id}}`;\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: fooBarTemplate\n });\n this.registerComponent('baz-child', {\n ComponentClass: BazChildComponent,\n template: bazChildTemplate\n });\n this.render(`{{#foo-bar id='baz'}}{{/foo-bar}}`);\n this.assertText('baz');\n }\n\n ['@test throws an error if when $() is accessed on component where `tagName` is an empty string']() {\n let template = `hit dem folks`;\n let FooBarComponent = _helpers.Component.extend({\n tagName: '',\n init() {\n this._super();\n this.$();\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template\n });\n\n expectAssertion(() => {\n this.render(`{{#foo-bar}}{{/foo-bar}}`);\n }, /You cannot access this.\\$\\(\\) on a component with `tagName: \\'\\'` specified/);\n }\n\n ['@test renders a contained view with omitted start tag and tagless parent view context']() {\n this.registerComponent('root-component', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'section'\n }),\n template: '{{frag-ment}}'\n });\n\n this.registerComponent('frag-ment', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n template: '{{my-span}}'\n });\n\n this.registerComponent('my-span', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'span'\n }),\n template: 'dab'\n });\n\n this.render(`{{root-component}}`);\n\n this.assertElement(this.firstChild, { tagName: 'section' });\n this.assertElement(this.firstChild.firstElementChild, {\n tagName: 'span'\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, { tagName: 'section' });\n this.assertElement(this.firstChild.firstElementChild, {\n tagName: 'span'\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/instrumentation-compile-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/instrumentation'], function (_testCase, _helpers, _instrumentation) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components compile instrumentation', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.resetEvents();\n\n (0, _instrumentation.subscribe)('render.getComponentDefinition', {\n before: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.before.push(payload);\n }\n },\n after: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.after.push(payload);\n }\n }\n });\n }\n\n resetEvents() {\n this.expected = {\n before: [],\n after: []\n };\n\n this.actual = {\n before: [],\n after: []\n };\n }\n\n teardown() {\n this.assert.deepEqual(this.actual.before, [], 'No unexpected events (before)');\n this.assert.deepEqual(this.actual.after, [], 'No unexpected events (after)');\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test it should only receive an instrumentation event for initial render']() {\n let testCase = this;\n\n let BaseClass = _helpers.Component.extend({\n tagName: '',\n\n willRender() {\n testCase.expected.before.push(this);\n testCase.expected.after.unshift(this);\n }\n });\n\n this.registerComponent('x-bar', {\n template: '[x-bar: {{bar}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.render(`[-top-level: {{foo}}] {{x-bar bar=bar}}`, {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertText('[-top-level: foo] [x-bar: bar]');\n\n this.assertEvents('after initial render');\n\n this.runTask(() => this.rerender());\n\n this.assertEvents('after no-op rerender');\n }\n\n assertEvents(label) {\n let { actual, expected } = this;\n this.assert.strictEqual(actual.before.length, actual.after.length, `${label}: before and after callbacks should be balanced`);\n\n this._assertEvents(`${label} (before):`, actual.before, expected.before);\n this._assertEvents(`${label} (after):`, actual.before, expected.before);\n\n this.resetEvents();\n }\n\n _assertEvents(label, actual, expected) {\n this.assert.equal(actual.length, expected.length, `${label}: expected ${expected.length} and got ${actual.length}`);\n\n actual.forEach((payload, i) => this.assertPayload(payload, expected[i]));\n }\n\n assertPayload(payload, component) {\n this.assert.equal(payload.object, component._debugContainerKey, 'payload.object');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/instrumentation-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/instrumentation'], function (_testCase, _helpers, _metal, _instrumentation) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components instrumentation', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n this.resetEvents();\n\n (0, _instrumentation.subscribe)('render.component', {\n before: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.before.push(payload);\n }\n },\n after: (name, timestamp, payload) => {\n if (payload.view !== this.component) {\n this.actual.after.push(payload);\n }\n }\n });\n }\n\n resetEvents() {\n this.expected = {\n before: [],\n after: []\n };\n\n this.actual = {\n before: [],\n after: []\n };\n }\n\n teardown() {\n this.assert.deepEqual(this.actual.before, [], 'No unexpected events (before)');\n this.assert.deepEqual(this.actual.after, [], 'No unexpected events (after)');\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test zomg'](assert) {\n assert.ok(true);\n }\n\n ['@test it should receive an instrumentation event for both initial render and updates']() {\n let testCase = this;\n\n let BaseClass = _helpers.Component.extend({\n tagName: '',\n\n willRender() {\n testCase.expected.before.push(this);\n testCase.expected.after.unshift(this);\n }\n });\n\n this.registerComponent('x-bar', {\n template: '[x-bar: {{bar}}] {{yield}}',\n ComponentClass: BaseClass.extend()\n });\n\n this.registerComponent('x-baz', {\n template: '[x-baz: {{baz}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.registerComponent('x-bat', {\n template: '[x-bat: {{bat}}]',\n ComponentClass: BaseClass.extend()\n });\n\n this.render(`[-top-level: {{foo}}] {{#x-bar bar=bar}}{{x-baz baz=baz}}{{/x-bar}} {{x-bat bat=bat}}`, {\n foo: 'foo',\n bar: 'bar',\n baz: 'baz',\n bat: 'bat'\n });\n\n this.assertText('[-top-level: foo] [x-bar: bar] [x-baz: baz] [x-bat: bat]');\n\n this.assertEvents('after initial render', true);\n\n this.runTask(() => this.rerender());\n\n this.assertEvents('after no-op rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'FOO'));\n\n this.assertEvents('after updating top-level');\n\n this.runTask(() => (0, _metal.set)(this.context, 'baz', 'BAZ'));\n\n this.assertEvents('after updating inner-most');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'bar', 'BAR');\n (0, _metal.set)(this.context, 'bat', 'BAT');\n });\n\n this.assertEvents('after updating the rest');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'FOO');\n (0, _metal.set)(this.context, 'bar', 'BAR');\n (0, _metal.set)(this.context, 'baz', 'BAZ');\n (0, _metal.set)(this.context, 'bat', 'BAT');\n });\n\n this.assertEvents('after reset');\n }\n\n assertEvents(label, initialRender = false) {\n let { actual, expected } = this;\n\n this.assert.strictEqual(actual.before.length, actual.after.length, `${label}: before and after callbacks should be balanced`);\n\n this._assertEvents(`${label} (before):`, actual.before, expected.before, initialRender);\n this._assertEvents(`${label} (after):`, actual.before, expected.before, initialRender);\n\n this.resetEvents();\n }\n\n _assertEvents(label, actual, expected, initialRender) {\n this.assert.equal(actual.length, expected.length, `${label}: expected ${expected.length} and got ${actual.length}`);\n\n actual.forEach((payload, i) => this.assertPayload(payload, expected[i], initialRender));\n }\n\n assertPayload(payload, component, initialRender) {\n this.assert.equal(payload.object, component.toString(), 'payload.object');\n this.assert.ok(payload.containerKey, 'the container key should be present');\n this.assert.equal(payload.containerKey, component._debugContainerKey, 'payload.containerKey');\n this.assert.equal(payload.view, component, 'payload.view');\n this.assert.strictEqual(payload.initialRender, initialRender, 'payload.initialRender');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/life-cycle-test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/utils', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _helpers, _abstractTestCase, _testCase, _views, _testHelpers, _utils, _internalTestHelpers) {\n 'use strict';\n\n class LifeCycleHooksTest extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.hooks = [];\n this.components = {};\n this.componentRegistry = [];\n this.teardownAssertions = [];\n this.viewRegistry = this.owner.lookup('-view-registry:main');\n }\n\n afterEach() {\n super.afterEach();\n\n for (let i = 0; i < this.teardownAssertions.length; i++) {\n this.teardownAssertions[i]();\n }\n }\n\n get isInteractive() {\n return true;\n }\n\n getBootOptions() {\n return {\n isInteractive: this.isInteractive\n };\n }\n\n /* abstract */\n get ComponentClass() {\n throw new Error('Not implemented: `ComponentClass`');\n }\n\n /* abstract */\n invocationFor() /* name, namedArgs = {} */{\n throw new Error('Not implemented: `invocationFor`');\n }\n\n /* abstract */\n attrFor() /* name */{\n throw new Error('Not implemented: `attrFor`');\n }\n\n get boundHelpers() {\n return {\n invoke: bind(this.invocationFor, this),\n attr: bind(this.attrFor, this)\n };\n }\n\n assertRegisteredViews(label) {\n let viewRegistry = this.viewRegistry;\n let topLevelId = (0, _views.getViewId)(this.component);\n let actual = Object.keys(viewRegistry).sort().filter(id => id !== topLevelId);\n\n if (this.isInteractive) {\n let expected = this.componentRegistry.sort();\n\n this.assert.deepEqual(actual, expected, 'registered views - ' + label);\n } else {\n this.assert.deepEqual(actual, [], 'no views should be registered for non-interactive mode');\n }\n }\n\n registerComponent(name, { template = null }) {\n let pushComponent = instance => {\n this.components[name] = instance;\n this.componentRegistry.push((0, _views.getViewId)(instance));\n };\n\n let removeComponent = instance => {\n let index = this.componentRegistry.indexOf(instance);\n this.componentRegistry.splice(index, 1);\n\n delete this.components[name];\n };\n\n let pushHook = (hookName, args) => {\n this.hooks.push(hook(name, hookName, args));\n };\n\n let assertParentView = (hookName, instance) => {\n this.assert.ok(instance.parentView, `parentView should be present in ${hookName}`);\n\n if (hookName === 'willDestroyElement') {\n this.assert.ok(instance.parentView.childViews.indexOf(instance) !== -1, `view is still connected to parentView in ${hookName}`);\n }\n };\n\n let assertElement = (hookName, instance, inDOM = true) => {\n if (instance.tagName === '') {\n return;\n }\n\n this.assert.ok((0, _views.getViewElement)(instance), `element should be present on ${instance} during ${hookName}`);\n\n if (this.isInteractive) {\n this.assert.ok(instance.element, `this.element should be present on ${instance} during ${hookName}`);\n this.assert.equal(document.body.contains(instance.element), inDOM, `element for ${instance} ${inDOM ? 'should' : 'should not'} be in the DOM during ${hookName}`);\n } else {\n this.assert.throws(() => instance.element, /Accessing `this.element` is not allowed in non-interactive environments/);\n }\n };\n\n let assertNoElement = (hookName, instance) => {\n this.assert.strictEqual((0, _views.getViewElement)(instance), null, `element should not be present in ${hookName}`);\n\n if (this.isInteractive) {\n this.assert.strictEqual(instance.element, null, `this.element should not be present in ${hookName}`);\n } else {\n this.assert.throws(() => instance.element, /Accessing `this.element` is not allowed in non-interactive environments/);\n }\n };\n\n let assertState = (hookName, expectedState, instance) => {\n this.assert.equal(instance._state, expectedState, `within ${hookName} the expected _state is ${expectedState}`);\n };\n\n let { isInteractive } = this;\n\n let ComponentClass = this.ComponentClass.extend({\n init() {\n this._super(...arguments);\n\n this.isInitialRender = true;\n this.componentName = name;\n pushHook('init');\n pushComponent(this);\n assertParentView('init', this);\n assertNoElement('init', this);\n assertState('init', 'preRender', this);\n\n this.on('init', () => pushHook('on(init)'));\n\n (0, _runloop.schedule)('afterRender', () => {\n this.isInitialRender = false;\n });\n },\n\n didReceiveAttrs(options) {\n pushHook('didReceiveAttrs', options);\n assertParentView('didReceiveAttrs', this);\n\n if (this.isInitialRender) {\n assertNoElement('didReceiveAttrs', this);\n assertState('didReceiveAttrs', 'preRender', this);\n } else {\n assertElement('didReceiveAttrs', this);\n\n if (isInteractive) {\n assertState('didReceiveAttrs', 'inDOM', this);\n } else {\n assertState('didReceiveAttrs', 'hasElement', this);\n }\n }\n },\n\n willInsertElement() {\n pushHook('willInsertElement');\n assertParentView('willInsertElement', this);\n assertElement('willInsertElement', this, false);\n assertState('willInsertElement', 'hasElement', this);\n },\n\n willRender() {\n pushHook('willRender');\n assertParentView('willRender', this);\n\n if (this.isInitialRender) {\n assertNoElement('willRender', this, false);\n assertState('willRender', 'preRender', this);\n } else {\n assertElement('willRender', this);\n assertState('willRender', 'inDOM', this);\n }\n },\n\n didInsertElement() {\n pushHook('didInsertElement');\n assertParentView('didInsertElement', this);\n assertElement('didInsertElement', this);\n assertState('didInsertElement', 'inDOM', this);\n },\n\n didRender() {\n pushHook('didRender');\n assertParentView('didRender', this);\n assertElement('didRender', this);\n assertState('didRender', 'inDOM', this);\n },\n\n didUpdateAttrs(options) {\n pushHook('didUpdateAttrs', options);\n assertParentView('didUpdateAttrs', this);\n\n if (isInteractive) {\n assertState('didUpdateAttrs', 'inDOM', this);\n } else {\n assertState('didUpdateAttrs', 'hasElement', this);\n }\n },\n\n willUpdate(options) {\n pushHook('willUpdate', options);\n assertParentView('willUpdate', this);\n assertElement('willUpdate', this);\n assertState('willUpdate', 'inDOM', this);\n },\n\n didUpdate(options) {\n pushHook('didUpdate', options);\n assertParentView('didUpdate', this);\n assertElement('didUpdate', this);\n assertState('didUpdate', 'inDOM', this);\n },\n\n willDestroyElement() {\n pushHook('willDestroyElement');\n assertParentView('willDestroyElement', this);\n assertElement('willDestroyElement', this);\n assertState('willDestroyElement', 'inDOM', this);\n },\n\n willClearRender() {\n pushHook('willClearRender');\n assertParentView('willClearRender', this);\n assertElement('willClearRender', this);\n assertState('willClearRender', 'inDOM', this);\n },\n\n didDestroyElement() {\n pushHook('didDestroyElement');\n assertNoElement('didDestroyElement', this);\n assertState('didDestroyElement', 'destroying', this);\n },\n\n willDestroy() {\n pushHook('willDestroy');\n removeComponent(this);\n\n this._super(...arguments);\n }\n });\n\n super.registerComponent(name, { ComponentClass, template });\n }\n\n assertHooks({ label, interactive, nonInteractive }) {\n let rawHooks = this.isInteractive ? interactive : nonInteractive;\n let hooks = rawHooks.map(raw => hook(...raw));\n this.assert.deepEqual(json(this.hooks), json(hooks), label);\n this.hooks = [];\n }\n\n ['@test lifecycle hooks are invoked in a predictable order']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-top', {\n template: _abstractTestCase.strip`\n
\n Twitter: {{${attr('twitter')}}}|\n ${invoke('the-middle', { name: string('Tom Dale') })}\n
`\n });\n\n this.registerComponent('the-middle', {\n template: _abstractTestCase.strip`\n
\n Name: {{${attr('name')}}}|\n ${invoke('the-bottom', { website: string('tomdale.net') })}\n
`\n });\n\n this.registerComponent('the-bottom', {\n template: _abstractTestCase.strip`\n
\n Website: {{${attr('website')}}}\n
`\n });\n\n this.render(invoke('the-top', { twitter: expr('twitter') }), {\n twitter: '@tomdale'\n });\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'],\n\n // Async hooks\n\n ['the-bottom', 'didInsertElement'], ['the-bottom', 'didRender'], ['the-middle', 'didInsertElement'], ['the-middle', 'didRender'], ['the-top', 'didInsertElement'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.components['the-bottom'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (bottom)',\n\n interactive: [\n // Sync hooks\n ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'], ['the-bottom', 'willUpdate'], ['the-bottom', 'willRender'],\n\n // Async hooks\n\n ['the-bottom', 'didUpdate'], ['the-bottom', 'didRender'], ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-middle'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (middle)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'],\n\n // Async hooks\n\n ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-top'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (top)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'willUpdate'], ['the-top', 'willRender'],\n\n // Async hooks\n\n ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'twitter', '@horsetomdale'));\n\n this.assertText('Twitter: @horsetomdale|Name: Tom Dale|Website: tomdale.net');\n\n // Because the `twitter` attr is only used by the topmost component,\n // and not passed down, we do not expect to see lifecycle hooks\n // called for child components. If the `didReceiveAttrs` hook used\n // the new attribute to rerender itself imperatively, that would result\n // in lifecycle hooks being invoked for the child.\n\n this.assertHooks({\n label: 'after update',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willUpdate'], ['the-top', 'willRender'],\n\n // Async hooks\n\n ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-top', 'willDestroyElement'], ['the-top', 'willClearRender'], ['the-middle', 'willDestroyElement'], ['the-middle', 'willClearRender'], ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'], ['the-top', 'didDestroyElement'], ['the-middle', 'didDestroyElement'], ['the-bottom', 'didDestroyElement'], ['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']],\n\n nonInteractive: [['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test lifecycle hooks are invoked in a correct sibling order']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-parent', {\n template: _abstractTestCase.strip`\n
\n ${invoke('the-first-child', { twitter: expr(attr('twitter')) })}|\n ${invoke('the-second-child', { name: expr(attr('name')) })}|\n ${invoke('the-last-child', { website: expr(attr('website')) })}\n
`\n });\n\n this.registerComponent('the-first-child', {\n template: `Twitter: {{${attr('twitter')}}}`\n });\n\n this.registerComponent('the-second-child', {\n template: `Name: {{${attr('name')}}}`\n });\n\n this.registerComponent('the-last-child', {\n template: `Website: {{${attr('website')}}}`\n });\n\n this.render(invoke('the-parent', {\n twitter: expr('twitter'),\n name: expr('name'),\n website: expr('website')\n }), {\n twitter: '@tomdale',\n name: 'Tom Dale',\n website: 'tomdale.net'\n });\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'init'], ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-parent', 'willRender'], ['the-parent', 'willInsertElement'], ['the-first-child', 'init'], ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-first-child', 'willRender'], ['the-first-child', 'willInsertElement'], ['the-second-child', 'init'], ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-second-child', 'willRender'], ['the-second-child', 'willInsertElement'], ['the-last-child', 'init'], ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs'], ['the-last-child', 'willRender'], ['the-last-child', 'willInsertElement'],\n\n // Async hooks\n\n ['the-first-child', 'didInsertElement'], ['the-first-child', 'didRender'], ['the-second-child', 'didInsertElement'], ['the-second-child', 'didRender'], ['the-last-child', 'didInsertElement'], ['the-last-child', 'didRender'], ['the-parent', 'didInsertElement'], ['the-parent', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-parent', 'init'], ['the-parent', 'on(init)'], ['the-parent', 'didReceiveAttrs'], ['the-first-child', 'init'], ['the-first-child', 'on(init)'], ['the-first-child', 'didReceiveAttrs'], ['the-second-child', 'init'], ['the-second-child', 'on(init)'], ['the-second-child', 'didReceiveAttrs'], ['the-last-child', 'init'], ['the-last-child', 'on(init)'], ['the-last-child', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.components['the-first-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (first child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-first-child', 'willUpdate'], ['the-first-child', 'willRender'],\n\n // Async hooks\n\n ['the-first-child', 'didUpdate'], ['the-first-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-second-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (second child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-second-child', 'willUpdate'], ['the-second-child', 'willRender'],\n\n // Async hooks\n\n ['the-second-child', 'didUpdate'], ['the-second-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-last-child'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (last child)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-last-child', 'willUpdate'], ['the-last-child', 'willRender'],\n\n // Async hooks\n\n ['the-last-child', 'didUpdate'], ['the-last-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => this.components['the-parent'].rerender());\n\n this.assertText('Twitter: @tomdale|Name: Tom Dale|Website: tomdale.net');\n\n this.assertHooks({\n label: 'after no-op rerender (parent)',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'willUpdate'], ['the-parent', 'willRender'],\n\n // Async hooks\n\n ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: []\n });\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n twitter: '@horsetomdale',\n name: 'Horse Tom Dale',\n website: 'horsetomdale.net'\n }));\n\n this.assertText('Twitter: @horsetomdale|Name: Horse Tom Dale|Website: horsetomdale.net');\n\n this.assertHooks({\n label: 'after update',\n\n interactive: [\n // Sync hooks\n\n ['the-parent', 'didUpdateAttrs'], ['the-parent', 'didReceiveAttrs'], ['the-parent', 'willUpdate'], ['the-parent', 'willRender'], ['the-first-child', 'didUpdateAttrs'], ['the-first-child', 'didReceiveAttrs'], ['the-first-child', 'willUpdate'], ['the-first-child', 'willRender'], ['the-second-child', 'didUpdateAttrs'], ['the-second-child', 'didReceiveAttrs'], ['the-second-child', 'willUpdate'], ['the-second-child', 'willRender'], ['the-last-child', 'didUpdateAttrs'], ['the-last-child', 'didReceiveAttrs'], ['the-last-child', 'willUpdate'], ['the-last-child', 'willRender'],\n\n // Async hooks\n\n ['the-first-child', 'didUpdate'], ['the-first-child', 'didRender'], ['the-second-child', 'didUpdate'], ['the-second-child', 'didRender'], ['the-last-child', 'didUpdate'], ['the-last-child', 'didRender'], ['the-parent', 'didUpdate'], ['the-parent', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-parent', 'didUpdateAttrs'], ['the-parent', 'didReceiveAttrs'], ['the-first-child', 'didUpdateAttrs'], ['the-first-child', 'didReceiveAttrs'], ['the-second-child', 'didUpdateAttrs'], ['the-second-child', 'didReceiveAttrs'], ['the-last-child', 'didUpdateAttrs'], ['the-last-child', 'didReceiveAttrs']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-parent', 'willDestroyElement'], ['the-parent', 'willClearRender'], ['the-first-child', 'willDestroyElement'], ['the-first-child', 'willClearRender'], ['the-second-child', 'willDestroyElement'], ['the-second-child', 'willClearRender'], ['the-last-child', 'willDestroyElement'], ['the-last-child', 'willClearRender'], ['the-parent', 'didDestroyElement'], ['the-first-child', 'didDestroyElement'], ['the-second-child', 'didDestroyElement'], ['the-last-child', 'didDestroyElement'], ['the-parent', 'willDestroy'], ['the-first-child', 'willDestroy'], ['the-second-child', 'willDestroy'], ['the-last-child', 'willDestroy']],\n\n nonInteractive: [['the-parent', 'willDestroy'], ['the-first-child', 'willDestroy'], ['the-second-child', 'willDestroy'], ['the-last-child', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test passing values through attrs causes lifecycle hooks to fire if the attribute values have changed']() {\n let { attr, invoke } = this.boundHelpers;\n\n this.registerComponent('the-top', {\n template: _abstractTestCase.strip`\n
\n Top: ${invoke('the-middle', { twitterTop: expr(attr('twitter')) })}\n
`\n });\n\n this.registerComponent('the-middle', {\n template: _abstractTestCase.strip`\n
\n Middle: ${invoke('the-bottom', {\n twitterMiddle: expr(attr('twitterTop'))\n })}\n
`\n });\n\n this.registerComponent('the-bottom', {\n template: _abstractTestCase.strip`\n
\n Bottom: {{${attr('twitterMiddle')}}}\n
`\n });\n\n this.render(invoke('the-top', { twitter: expr('twitter') }), {\n twitter: '@tomdale'\n });\n\n this.assertText('Top: Middle: Bottom: @tomdale');\n this.assertRegisteredViews('intial render');\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willRender'], ['the-top', 'willInsertElement'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willRender'], ['the-middle', 'willInsertElement'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willRender'], ['the-bottom', 'willInsertElement'],\n\n // Async hooks\n\n ['the-bottom', 'didInsertElement'], ['the-bottom', 'didRender'], ['the-middle', 'didInsertElement'], ['the-middle', 'didRender'], ['the-top', 'didInsertElement'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-top', 'init'], ['the-top', 'on(init)'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'init'], ['the-middle', 'on(init)'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'init'], ['the-bottom', 'on(init)'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'twitter', '@horsetomdale'));\n\n this.assertText('Top: Middle: Bottom: @horsetomdale');\n\n // Because the `twitter` attr is used by the all of the components,\n // the lifecycle hooks are invoked for all components.\n\n this.assertHooks({\n label: 'after updating (root)',\n\n interactive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-top', 'willUpdate'], ['the-top', 'willRender'], ['the-middle', 'didUpdateAttrs'], ['the-middle', 'didReceiveAttrs'], ['the-middle', 'willUpdate'], ['the-middle', 'willRender'], ['the-bottom', 'didUpdateAttrs'], ['the-bottom', 'didReceiveAttrs'], ['the-bottom', 'willUpdate'], ['the-bottom', 'willRender'],\n\n // Async hooks\n\n ['the-bottom', 'didUpdate'], ['the-bottom', 'didRender'], ['the-middle', 'didUpdate'], ['the-middle', 'didRender'], ['the-top', 'didUpdate'], ['the-top', 'didRender']],\n\n nonInteractive: [\n // Sync hooks\n\n ['the-top', 'didUpdateAttrs'], ['the-top', 'didReceiveAttrs'], ['the-middle', 'didUpdateAttrs'], ['the-middle', 'didReceiveAttrs'], ['the-bottom', 'didUpdateAttrs'], ['the-bottom', 'didReceiveAttrs']]\n });\n\n this.runTask(() => this.rerender());\n\n this.assertText('Top: Middle: Bottom: @horsetomdale');\n\n // In this case, because the attrs are passed down, all child components are invoked.\n\n this.assertHooks({\n label: 'after no-op rernder (root)',\n interactive: [],\n nonInteractive: []\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['the-top', 'willDestroyElement'], ['the-top', 'willClearRender'], ['the-middle', 'willDestroyElement'], ['the-middle', 'willClearRender'], ['the-bottom', 'willDestroyElement'], ['the-bottom', 'willClearRender'], ['the-top', 'didDestroyElement'], ['the-middle', 'didDestroyElement'], ['the-bottom', 'didDestroyElement'], ['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']],\n\n nonInteractive: [['the-top', 'willDestroy'], ['the-middle', 'willDestroy'], ['the-bottom', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n\n ['@test components rendered from `{{each}}` have correct life-cycle hooks to be called']() {\n let { invoke } = this.boundHelpers;\n\n this.registerComponent('nested-item', { template: `{{yield}}` });\n\n this.registerComponent('an-item', {\n template: _abstractTestCase.strip`\n {{#nested-item}}Item: {{count}}{{/nested-item}}\n `\n });\n\n this.registerComponent('no-items', {\n template: _abstractTestCase.strip`\n {{#nested-item}}Nothing to see here{{/nested-item}}\n `\n });\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n ${invoke('an-item', { count: expr('item') })}\n {{else}}\n ${invoke('no-items')}\n {{/each}}\n `, {\n items: [1, 2, 3, 4, 5]\n });\n\n this.assertText('Item: 1Item: 2Item: 3Item: 4Item: 5');\n this.assertRegisteredViews('intial render');\n\n let initialHooks = () => {\n let ret = [['an-item', 'init'], ['an-item', 'on(init)'], ['an-item', 'didReceiveAttrs']];\n if (this.isInteractive) {\n ret.push(['an-item', 'willRender'], ['an-item', 'willInsertElement']);\n }\n ret.push(['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs']);\n if (this.isInteractive) {\n ret.push(['nested-item', 'willRender'], ['nested-item', 'willInsertElement']);\n }\n return ret;\n };\n\n let initialAfterRenderHooks = () => {\n if (this.isInteractive) {\n return [['nested-item', 'didInsertElement'], ['nested-item', 'didRender'], ['an-item', 'didInsertElement'], ['an-item', 'didRender']];\n } else {\n return [];\n }\n };\n\n this.assertHooks({\n label: 'after initial render',\n\n interactive: [\n // Sync hooks\n ...initialHooks(1), ...initialHooks(2), ...initialHooks(3), ...initialHooks(4), ...initialHooks(5),\n\n // Async hooks\n ...initialAfterRenderHooks(5), ...initialAfterRenderHooks(4), ...initialAfterRenderHooks(3), ...initialAfterRenderHooks(2), ...initialAfterRenderHooks(1)],\n\n nonInteractive: [\n // Sync hooks\n ...initialHooks(1), ...initialHooks(2), ...initialHooks(3), ...initialHooks(4), ...initialHooks(5),\n\n // Async hooks\n ...initialAfterRenderHooks(5), ...initialAfterRenderHooks(4), ...initialAfterRenderHooks(3), ...initialAfterRenderHooks(2), ...initialAfterRenderHooks(1)]\n });\n\n // TODO: Is this correct? Should childViews be populated in non-interactive mode?\n if (this.isInteractive) {\n this.assert.equal(this.component.childViews.length, 5, 'childViews precond');\n }\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', []));\n\n // TODO: Is this correct? Should childViews be populated in non-interactive mode?\n if (this.isInteractive) {\n this.assert.equal(this.component.childViews.length, 1, 'childViews updated');\n }\n\n this.assertText('Nothing to see here');\n\n this.assertHooks({\n label: 'reset to empty array',\n\n interactive: [['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['an-item', 'willDestroyElement'], ['an-item', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['no-items', 'init'], ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['no-items', 'willRender'], ['no-items', 'willInsertElement'], ['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['nested-item', 'willRender'], ['nested-item', 'willInsertElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['an-item', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['nested-item', 'didInsertElement'], ['nested-item', 'didRender'], ['no-items', 'didInsertElement'], ['no-items', 'didRender'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy']],\n\n nonInteractive: [['no-items', 'init'], ['no-items', 'on(init)'], ['no-items', 'didReceiveAttrs'], ['nested-item', 'init'], ['nested-item', 'on(init)'], ['nested-item', 'didReceiveAttrs'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy'], ['an-item', 'willDestroy'], ['nested-item', 'willDestroy']]\n });\n\n this.teardownAssertions.push(() => {\n this.assertHooks({\n label: 'destroy',\n\n interactive: [['no-items', 'willDestroyElement'], ['no-items', 'willClearRender'], ['nested-item', 'willDestroyElement'], ['nested-item', 'willClearRender'], ['no-items', 'didDestroyElement'], ['nested-item', 'didDestroyElement'], ['no-items', 'willDestroy'], ['nested-item', 'willDestroy']],\n\n nonInteractive: [['no-items', 'willDestroy'], ['nested-item', 'willDestroy']]\n });\n\n this.assertRegisteredViews('after destroy');\n });\n }\n }\n\n class CurlyComponentsTest extends LifeCycleHooksTest {\n get ComponentClass() {\n return _helpers.Component;\n }\n\n invocationFor(name, namedArgs = {}) {\n let attrs = Object.keys(namedArgs).map(k => `${k}=${this.val(namedArgs[k])}`).join(' ');\n return `{{${name} ${attrs}}}`;\n }\n\n attrFor(name) {\n return `${name}`;\n }\n\n /* private */\n val(value) {\n if (value.isString) {\n return JSON.stringify(value.value);\n } else if (value.isExpr) {\n return `(readonly ${value.value})`;\n } else {\n throw new Error(`Unknown value: ${value}`);\n }\n }\n }\n\n (0, _testCase.moduleFor)('Components test: interactive lifecycle hooks (curly components)', class extends CurlyComponentsTest {\n get isInteractive() {\n return true;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: non-interactive lifecycle hooks (curly components)', class extends CurlyComponentsTest {\n get isInteractive() {\n return false;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: interactive lifecycle hooks (tagless curly components)', class extends CurlyComponentsTest {\n get ComponentClass() {\n return _helpers.Component.extend({ tagName: '' });\n }\n\n get isInteractive() {\n return true;\n }\n });\n\n (0, _testCase.moduleFor)('Components test: non-interactive lifecycle hooks (tagless curly components)', class extends CurlyComponentsTest {\n get ComponentClass() {\n return _helpers.Component.extend({ tagName: '' });\n }\n\n get isInteractive() {\n return false;\n }\n });\n\n (0, _testCase.moduleFor)('Run loop and lifecycle hooks', class extends _testCase.RenderingTest {\n ['@test afterRender set']() {\n let ComponentClass = _helpers.Component.extend({\n width: '5',\n didInsertElement() {\n (0, _runloop.schedule)('afterRender', () => {\n this.set('width', '10');\n });\n }\n });\n\n let template = `{{width}}`;\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render('{{foo-bar}}');\n\n this.assertText('10');\n\n this.runTask(() => this.rerender());\n\n this.assertText('10');\n }\n\n ['@test afterRender set on parent']() {\n let ComponentClass = _helpers.Component.extend({\n didInsertElement() {\n (0, _runloop.schedule)('afterRender', () => {\n let parent = this.get('parent');\n parent.set('foo', 'wat');\n });\n }\n });\n\n let template = `{{foo}}`;\n\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render('{{foo-bar parent=this foo=foo}}');\n\n this.assertText('wat');\n\n this.runTask(() => this.rerender());\n\n this.assertText('wat');\n }\n\n ['@test `willRender` can set before render (GH#14458)']() {\n let ComponentClass = _helpers.Component.extend({\n tagName: 'a',\n customHref: 'http://google.com',\n attributeBindings: ['customHref:href'],\n willRender() {\n this.set('customHref', 'http://willRender.com');\n }\n });\n\n let template = `Hello World`;\n\n this.registerComponent('foo-bar', { ComponentClass, template });\n\n this.render(`{{foo-bar id=\"foo\"}}`);\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n attrs: {\n id: 'foo',\n href: 'http://willRender.com',\n class: (0, _testHelpers.classes)('ember-view')\n }\n });\n }\n\n ['@test that thing about destroying'](assert) {\n let ParentDestroyedElements = [];\n let ChildDestroyedElements = [];\n\n let ParentComponent = _helpers.Component.extend({\n willDestroyElement() {\n ParentDestroyedElements.push({\n id: this.itemId,\n name: 'parent-component',\n hasParent: !!this.element.parentNode,\n nextSibling: !!this.element.nextSibling,\n previousSibling: !!this.element.previousSibling\n });\n }\n });\n\n let PartentTemplate = _abstractTestCase.strip`\n {{yield}}\n
    \n {{#nested-component nestedId=(concat itemId '-A')}}A{{/nested-component}}\n {{#nested-component nestedId=(concat itemId '-B')}}B{{/nested-component}}\n
\n `;\n\n let NestedComponent = _helpers.Component.extend({\n willDestroyElement() {\n ChildDestroyedElements.push({\n id: this.nestedId,\n name: 'nested-component',\n hasParent: !!this.element.parentNode,\n nextSibling: !!this.element.nextSibling,\n previousSibling: !!this.element.previousSibling\n });\n }\n });\n\n let NestedTemplate = `{{yield}}`;\n\n this.registerComponent('parent-component', {\n ComponentClass: ParentComponent,\n template: PartentTemplate\n });\n\n this.registerComponent('nested-component', {\n ComponentClass: NestedComponent,\n template: NestedTemplate\n });\n\n let array = (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]);\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{#parent-component itemId=item.id}}{{item.id}}{{/parent-component}}\n {{/each}}\n {{#if model.shouldShow}}\n {{#parent-component itemId=6}}6{{/parent-component}}\n {{/if}}\n {{#if model.shouldShow}}\n {{#parent-component itemId=7}}7{{/parent-component}}\n {{/if}}\n `, {\n items: array,\n model: { shouldShow: true }\n });\n\n this.assertText('1AB2AB3AB4AB5AB6AB7AB');\n\n this.runTask(() => {\n array.removeAt(2);\n array.removeAt(2);\n (0, _metal.set)(this.context, 'model.shouldShow', false);\n });\n\n this.assertText('1AB2AB5AB');\n\n assertDestroyHooks(assert, [...ParentDestroyedElements], [{\n id: 3,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 4,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 6,\n hasParent: true,\n nextSibling: true,\n previousSibling: true\n }, {\n id: 7,\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }]);\n\n assertDestroyHooks(assert, [...ChildDestroyedElements], [{\n id: '3-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '3-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '4-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '4-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '6-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '6-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }, {\n id: '7-A',\n hasParent: true,\n nextSibling: true,\n previousSibling: false\n }, {\n id: '7-B',\n hasParent: true,\n nextSibling: false,\n previousSibling: true\n }]);\n }\n\n ['@test lifecycle hooks exist on the base class'](assert) {\n // Make sure we get the finalized component prototype\n let prototype = _helpers.Component.proto();\n\n assert.equal(typeof prototype.didDestroyElement, 'function', 'didDestroyElement exists');\n assert.equal(typeof prototype.didInsertElement, 'function', 'didInsertElement exists');\n assert.equal(typeof prototype.didReceiveAttrs, 'function', 'didReceiveAttrs exists');\n assert.equal(typeof prototype.didRender, 'function', 'didRender exists');\n assert.equal(typeof prototype.didUpdate, 'function', 'didUpdate exists');\n assert.equal(typeof prototype.didUpdateAttrs, 'function', 'didUpdateAttrs exists');\n assert.equal(typeof prototype.willClearRender, 'function', 'willClearRender exists');\n assert.equal(typeof prototype.willDestroy, 'function', 'willDestroy exists');\n assert.equal(typeof prototype.willDestroyElement, 'function', 'willDestroyElement exists');\n assert.equal(typeof prototype.willInsertElement, 'function', 'willInsertElement exists');\n assert.equal(typeof prototype.willRender, 'function', 'willRender exists');\n assert.equal(typeof prototype.willUpdate, 'function', 'willUpdate exists');\n }\n });\n\n if (!_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('Run loop and lifecycle hooks - jQuery only', class extends _testCase.RenderingTest {\n ['@test lifecycle hooks have proper access to this.$()'](assert) {\n assert.expect(6);\n let component;\n let FooBarComponent = _helpers.Component.extend({\n tagName: 'div',\n init() {\n assert.notOk(this.$(), 'no access to element via this.$() on init() enter');\n this._super(...arguments);\n assert.notOk(this.$(), 'no access to element via this.$() after init() finished');\n },\n willInsertElement() {\n component = this;\n assert.ok(this.$(), 'willInsertElement has access to element via this.$()');\n },\n didInsertElement() {\n assert.ok(this.$(), 'didInsertElement has access to element via this.$()');\n },\n willDestroyElement() {\n assert.ok(this.$(), 'willDestroyElement has access to element via this.$()');\n },\n didDestroyElement() {\n assert.notOk(this.$(), 'didDestroyElement does not have access to element via this.$()');\n }\n });\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n let { owner } = this;\n let comp = owner.lookup('component:foo-bar');\n (0, _internalTestHelpers.runAppend)(comp);\n this.runTask(() => (0, _utils.tryInvoke)(component, 'destroy'));\n }\n });\n }\n\n function assertDestroyHooks(assert, _actual, _expected) {\n _expected.forEach((expected, i) => {\n let name = expected.name;\n assert.equal(expected.id, _actual[i].id, `${name} id is the same`);\n assert.equal(expected.hasParent, _actual[i].hasParent, `${name} has parent node`);\n assert.equal(expected.nextSibling, _actual[i].nextSibling, `${name} has next sibling node`);\n assert.equal(expected.previousSibling, _actual[i].previousSibling, `${name} has previous sibling node`);\n });\n }\n\n function bind(func, thisArg) {\n return (...args) => func.apply(thisArg, args);\n }\n\n function string(value) {\n return { isString: true, value };\n }\n\n function expr(value) {\n return { isExpr: true, value };\n }\n\n function hook(name, hook, { attrs, oldAttrs, newAttrs } = {}) {\n return { name, hook, args: { attrs, oldAttrs, newAttrs } };\n }\n\n function json(serializable) {\n return JSON.parse(JSON.stringify(serializable));\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/link-to-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/controller', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _controller, _metal, _helpers, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Link-to component', class extends _testCase.ApplicationTest {\n visitWithDeprecation(path, deprecation) {\n let p;\n\n expectDeprecation(() => {\n p = this.visit(path);\n }, deprecation);\n\n return p;\n }\n\n ['@test should be able to be inserted in DOM when the router is not present']() {\n this.addTemplate('application', `{{#link-to 'index'}}Go to Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertText('Go to Index');\n });\n }\n\n ['@test re-renders when title changes']() {\n let controller;\n\n this.addTemplate('application', '{{link-to title routeName}}');\n this.add('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n },\n title: 'foo',\n routeName: 'index'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('foo');\n this.runTask(() => (0, _metal.set)(controller, 'title', 'bar'));\n this.assertText('bar');\n });\n }\n\n ['@test re-computes active class when params change'](assert) {\n let controller;\n\n this.addTemplate('application', '{{link-to \"foo\" routeName}}');\n\n this.add('controller:application', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n },\n routeName: 'index'\n }));\n\n this.router.map(function () {\n this.route('bar', { path: '/bar' });\n });\n\n return this.visit('/bar').then(() => {\n assert.equal(this.firstChild.classList.contains('active'), false);\n this.runTask(() => (0, _metal.set)(controller, 'routeName', 'bar'));\n assert.equal(this.firstChild.classList.contains('active'), true);\n });\n }\n\n ['@test escaped inline form (double curlies) escapes link title']() {\n this.addTemplate('application', `{{link-to title 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n });\n }\n\n ['@test escaped inline form with (-html-safe) does not escape link title'](assert) {\n this.addTemplate('application', `{{link-to (-html-safe title) 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n assert.equal(this.$('b').length, 1);\n });\n }\n\n ['@test unescaped inline form (triple curlies) does not escape link title'](assert) {\n this.addTemplate('application', `{{{link-to title 'index'}}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'blah'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('blah');\n assert.equal(this.$('b').length, 1);\n });\n }\n\n ['@test able to safely extend the built-in component and use the normal path']() {\n this.addComponent('custom-link-to', {\n ComponentClass: _helpers.LinkComponent.extend()\n });\n this.addTemplate('application', `{{#custom-link-to 'index'}}{{title}}{{/custom-link-to}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'Hello'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('Hello');\n });\n }\n\n ['@test [GH#13432] able to safely extend the built-in component and invoke it inline']() {\n this.addComponent('custom-link-to', {\n ComponentClass: _helpers.LinkComponent.extend()\n });\n this.addTemplate('application', `{{custom-link-to title 'index'}}`);\n this.add('controller:application', _controller.default.extend({\n title: 'Hello'\n }));\n\n return this.visit('/').then(() => {\n this.assertText('Hello');\n });\n }\n });\n\n (0, _testCase.moduleFor)('Link-to component with query-params', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: '123',\n bar: 'yes'\n }));\n }\n\n ['@test populates href with fully supplied query param values']() {\n this.addTemplate('index', `{{#link-to 'index' (query-params foo='456' bar='NAW')}}Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: '/?bar=NAW&foo=456' },\n content: 'Index'\n });\n });\n }\n\n ['@test populates href with partially supplied query param values, but omits if value is default value']() {\n this.addTemplate('index', `{{#link-to 'index' (query-params foo='123')}}Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.firstChild, {\n tagName: 'a',\n attrs: { href: '/', class: (0, _testHelpers.classes)('ember-view active') },\n content: 'Index'\n });\n });\n }\n });\n\n (0, _testCase.moduleFor)('Link-to component', class extends _testCase.RenderingTest {\n ['@test should be able to be inserted in DOM when the router is not present - block']() {\n this.render(`{{#link-to 'index'}}Go to Index{{/link-to}}`);\n\n this.assertText('Go to Index');\n }\n\n ['@test should be able to be inserted in DOM when the router is not present - inline']() {\n this.render(`{{link-to 'Go to Index' 'index'}}`);\n\n this.assertText('Go to Index');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/local-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'ember-template-compiler', 'internal-test-helpers', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer'], function (_testCase, _emberTemplateCompiler, _internalTestHelpers, _helpers, _glimmer) {\n 'use strict';\n\n class LocalLookupTest extends _testCase.RenderingTest {\n ['@test it can lookup a local template']() {\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says: {{yield}}'\n });\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test tagless blockless component can lookup local template']() {\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says: {{yield}}'\n });\n this.registerTemplate('components/x-outer', '{{#x-inner}}Hi!{{/x-inner}}');\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({ tagName: '' })\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test it can lookup a local component template']() {\n this.registerTemplate('components/x-outer/x-inner', 'Nested template says: {{yield}}');\n this.registerTemplate('components/x-outer', '{{#x-inner}}Hi!{{/x-inner}}');\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested template says: Hi!', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says: Hi!', 'Re-render works');\n }\n\n ['@test it can local lookup a dynamic component']() {\n this.registerComponent('foo-bar', {\n template: 'yall finished {{component child}}'\n });\n this.registerComponent('foo-bar/biz-baz', { template: 'or yall done?' });\n\n this.render('{{foo-bar child=child}}', { child: 'biz-baz' });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a dynamic component from a dynamic component']() {\n this.registerComponent('foo-bar', {\n template: 'yall finished {{component child}}'\n });\n this.registerComponent('foo-bar/biz-baz', { template: 'or yall done?' });\n\n this.render('{{component componentName child=child}}', {\n componentName: 'foo-bar',\n child: 'biz-baz'\n });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a dynamic component from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-biz baz=(component 'local-bar')}}`\n });\n this.registerComponent('global-biz', { template: 'or {{component baz}}' });\n this.registerComponent('parent-foo/local-bar', { template: 'yall done?' });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can local lookup a re-wrapped dynamic component from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component 'local-bar')}}`\n });\n this.registerComponent('global-x', {\n template: `or {{global-y comp=(component comp phrase='done')}}`\n });\n this.registerComponent('global-y', { template: `{{component comp}}?` });\n this.registerComponent('parent-foo/local-bar', {\n template: 'yall {{phrase}}'\n });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can nest local lookups of dynamic components from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component 'local-bar')}}`\n });\n this.registerComponent('global-x', {\n template: `or {{global-y comp=(component comp phrase='done')}}`\n });\n this.registerComponent('global-y', {\n template: `{{component comp}}{{component 'local-bar'}}`\n });\n this.registerComponent('parent-foo/local-bar', {\n template: 'yall {{phrase}}'\n });\n this.registerComponent('global-y/local-bar', { template: `?` });\n\n this.render('{{parent-foo}}');\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall done?');\n }\n\n ['@test it can switch from local to global lookups of dynamic components from a passed named argument']() {\n this.registerComponent('parent-foo', {\n template: `yall finished {{global-x comp=(component bar)}}`\n });\n this.registerComponent('global-x', {\n template: `or yall {{component comp}}`\n });\n this.registerComponent('parent-foo/local-bar', { template: 'done?' });\n this.registerComponent('global-bar', { template: `ready?` });\n\n this.render('{{parent-foo bar=bar}}', { bar: 'local-bar' });\n\n this.assertText('yall finished or yall done?');\n\n this.runTask(() => this.context.set('bar', 'global-bar'));\n\n this.runTask(() => this.rerender());\n\n this.assertText('yall finished or yall ready?');\n }\n\n ['@test it can lookup a local helper']() {\n this.registerHelper('x-outer/x-helper', () => {\n return 'Who dis?';\n });\n this.registerComponent('x-outer', { template: 'Who dat? {{x-helper}}' });\n\n this.render('{{x-outer}}');\n\n this.assertText('Who dat? Who dis?', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who dat? Who dis?', 'Re-render works');\n }\n\n ['@test it overrides global helper lookup']() {\n this.registerHelper('x-outer/x-helper', () => {\n return 'Who dis?';\n });\n\n this.registerHelper('x-helper', () => {\n return 'I dunno';\n });\n\n this.registerComponent('x-outer', { template: 'Who dat? {{x-helper}}' });\n\n this.render('{{x-outer}} {{x-helper}}');\n\n this.assertText('Who dat? Who dis? I dunno', 'Initial render works');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who dat? Who dis? I dunno', 'Re-render works');\n }\n\n ['@test lookup without match issues standard assertion (with local helper name)']() {\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n\n expectAssertion(() => {\n this.render('{{x-outer}}');\n }, /A component or helper named \"x-inner\" could not be found/);\n }\n\n ['@test overrides global lookup']() {\n this.registerComponent('x-outer', {\n template: '{{#x-inner}}Hi!{{/x-inner}}'\n });\n this.registerComponent('x-outer/x-inner', {\n template: 'Nested template says (from local): {{yield}}'\n });\n this.registerComponent('x-inner', {\n template: 'Nested template says (from global): {{yield}}'\n });\n\n this.render('{{#x-inner}}Hi!{{/x-inner}} {{x-outer}} {{#x-outer/x-inner}}Hi!{{/x-outer/x-inner}}');\n\n this.assertText('Nested template says (from global): Hi! Nested template says (from local): Hi! Nested template says (from local): Hi!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested template says (from global): Hi! Nested template says (from local): Hi! Nested template says (from local): Hi!');\n }\n }\n\n // first run these tests with expandLocalLookup\n\n function buildResolver() {\n let resolver = {\n resolve() {},\n expandLocalLookup(fullName, sourceFullName) {\n if (!sourceFullName) {\n return null;\n }\n\n let [sourceType, sourceName] = sourceFullName.split(':');\n let [type, name] = fullName.split(':');\n\n sourceName = sourceName.replace('my-app/', '');\n\n if (sourceType === 'template' && sourceName.slice(0, 21) === 'templates/components/') {\n sourceName = sourceName.slice(21);\n }\n\n name = name.replace('my-app/', '');\n\n if (type === 'template' && name.slice(0, 11) === 'components/') {\n name = name.slice(11);\n sourceName = `components/${sourceName}`;\n }\n\n sourceName = sourceName.replace('.hbs', '');\n\n let result = `${type}:${sourceName}/${name}`;\n return result;\n }\n };\n\n return resolver;\n }\n\n (0, _testCase.moduleFor)('Components test: local lookup with expandLocalLookup feature', class extends LocalLookupTest {\n getResolver() {\n return buildResolver();\n }\n });\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n class LocalLookupTestResolver extends _internalTestHelpers.ModuleBasedTestResolver {\n expandLocalLookup(specifier, source) {\n if (source && source.indexOf('components/') !== -1) {\n let namespace = source.split('components/')[1];\n let [type, name] = specifier.split(':');\n name = name.replace('components/', '');\n\n namespace = namespace.replace('.hbs', '');\n return `${type}:${type === 'template' ? 'components/' : ''}${namespace}/${name}`;\n }\n\n return super.expandLocalLookup(specifier, source);\n }\n }\n\n /*\n * This sub-classing changes `registerXXX` methods to use the resolver.\n * Required for testing the module unification-friendly `resolve` call\n * with a `referrer` argument.\n *\n * In theory all these tests can be ported to use the resolver instead of\n * the registry.\n */\n (0, _testCase.moduleFor)('Components test: local lookup with resolution referrer', class extends LocalLookupTest {\n get resolver() {\n return this.owner.__registry__.fallback.resolver;\n }\n\n getResolver() {\n return new LocalLookupTestResolver();\n }\n\n registerComponent(name, { ComponentClass = _helpers.Component, template = null }) {\n let { resolver } = this;\n\n if (ComponentClass) {\n resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `my-name/templates/components/${name}.hbs`\n }));\n }\n }\n\n registerTemplate(name, template) {\n let { resolver } = this;\n if (typeof template === 'string') {\n resolver.add(`template:${name}`, this.compile(template, {\n moduleName: `my-name/templates/${name}.hbs`\n }));\n } else {\n throw new Error(`Registered template \"${name}\" must be a string`);\n }\n }\n\n registerHelper(name, funcOrClassBody) {\n let { resolver } = this;\n let type = typeof funcOrClassBody;\n\n if (type === 'function') {\n resolver.add(`helper:${name}`, (0, _glimmer.helper)(funcOrClassBody));\n } else if (type === 'object' && type !== null) {\n resolver.add(`helper:${name}`, _glimmer.Helper.extend(funcOrClassBody));\n } else {\n throw new Error(`Cannot register ${funcOrClassBody} as a helper`);\n }\n }\n });\n }\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n (0, _internalTestHelpers.moduleFor)('Components test: local lookup with resolution referrer (MU)', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Ensure that the same specifier with two sources does not share a cache key'](assert) {\n this.add({\n specifier: 'template:components/x-not-shared',\n source: 'template:my-app/templates/components/x-top.hbs'\n }, (0, _emberTemplateCompiler.compile)('child-x-not-shared'));\n\n this.add({\n specifier: 'template:components/x-top',\n source: 'template:my-app/templates/application.hbs'\n }, (0, _emberTemplateCompiler.compile)('top-level-x-top ({{x-not-shared}})', {\n moduleName: 'my-app/templates/components/x-top.hbs'\n }));\n\n this.add({\n specifier: 'template:components/x-not-shared',\n source: 'template:my-app/templates/application.hbs'\n }, (0, _emberTemplateCompiler.compile)('top-level-x-not-shared'));\n\n this.addTemplate('application', '{{x-not-shared}} {{x-top}} {{x-not-shared}} {{x-top}}');\n\n return this.visit('/').then(() => {\n assert.equal(this.element.textContent, 'top-level-x-not-shared top-level-x-top (child-x-not-shared) top-level-x-not-shared top-level-x-top (child-x-not-shared)');\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/components/namespaced-lookup-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer'], function (_testCase, _glimmer) {\n 'use strict';\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n (0, _testCase.moduleFor)('Namespaced lookup', class extends _testCase.RenderingTest {\n ['@test it can render a namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'my-addon'\n }, 'namespaced template {{myProp}}');\n\n this.add({\n specifier: 'component:my-component',\n namespace: 'my-addon'\n }, _glimmer.Component.extend({\n myProp: 'My property'\n }));\n\n this.addComponent('x-outer', {\n template: '{{my-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('namespaced template My property');\n\n this.runTask(() => this.rerender());\n\n this.assertText('namespaced template My property');\n }\n\n ['@test it can render a nested namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'second-addon'\n }, 'second namespaced template');\n\n this.addTemplate({\n specifier: 'template:components/my-component',\n namespace: 'first-addon'\n }, 'first namespaced template - {{second-addon::my-component}}');\n\n this.addComponent('x-outer', {\n template: '{{first-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('first namespaced template - second namespaced template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('first namespaced template - second namespaced template');\n }\n\n ['@test it can render a nested un-namespaced component']() {\n this.addTemplate({\n specifier: 'template:components/addon-component',\n source: 'template:first-addon/src/ui/components/my-component.hbs'\n }, 'un-namespaced addon template');\n\n this.addTemplate({\n specifier: 'template:components/my-component',\n moduleName: 'first-addon/src/ui/components/my-component.hbs',\n namespace: 'first-addon'\n }, '{{addon-component}}');\n\n this.addComponent('x-outer', {\n template: '{{first-addon::my-component}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('un-namespaced addon template');\n\n this.runTask(() => this.rerender());\n\n this.assertText('un-namespaced addon template');\n }\n\n ['@test it can render a namespaced main component']() {\n this.addTemplate({\n specifier: 'template:components/addon-component',\n soruce: 'template:first-addon/src/ui/components/main.hbs'\n }, 'Nested namespaced component');\n\n this.addTemplate({\n specifier: 'template:components/first-addon',\n moduleName: 'first-addon/src/ui/components/main.hbs'\n }, '{{addon-component}}');\n\n this.addComponent('x-outer', { template: '{{first-addon}}' });\n\n this.render('{{x-outer}}');\n\n this.assertText('Nested namespaced component');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nested namespaced component');\n }\n\n ['@test it does not render a main component when using a namespace']() {\n this.addTemplate({\n specifier: 'template:components/main',\n namespace: 'my-addon'\n }, 'namespaced template {{myProp}}');\n\n this.add({\n specifier: 'component:main',\n namespace: 'my-addon'\n }, _glimmer.Component.extend({\n myProp: 'My property'\n }));\n\n this.add({\n specifier: 'helper:my-addon',\n namespace: 'empty-namespace'\n }, (0, _glimmer.helper)(() => 'my helper'));\n\n this.render('{{empty-namespace::my-addon}}');\n\n this.assertText('my helper'); // component should be not found\n\n this.runTask(() => this.rerender());\n\n this.assertText('my helper');\n }\n\n ['@test it renders a namespaced helper']() {\n this.add({\n specifier: 'helper:my-helper',\n namespace: 'my-namespace'\n }, (0, _glimmer.helper)(() => 'my helper'));\n\n this.render('{{my-namespace::my-helper}}');\n\n this.assertText('my helper');\n\n this.runTask(() => this.rerender());\n\n this.assertText('my helper');\n }\n });\n }\n});","enifed(\"@ember/-internals/glimmer/tests/integration/components/render-to-element-test\", [], function () {\n \"use strict\";\n});","enifed('@ember/-internals/glimmer/tests/integration/components/target-action-test', ['@ember/polyfills', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/routing'], function (_polyfills, _testCase, _abstractTestCase, _metal, _helpers, _controller, _runtime, _routing) {\n 'use strict';\n\n function expectSendActionDeprecation(fn) {\n expectDeprecation(fn, /You called (.*).sendAction\\((.*)\\) but Component#sendAction is deprecated. Please use closure actions instead./);\n }\n\n (0, _testCase.moduleFor)('Components test: sendAction', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.actionCounts = {};\n this.sendCount = 0;\n this.actionArguments = null;\n\n var self = this;\n\n this.registerComponent('action-delegate', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n self.delegate = this;\n this.name = 'action-delegate';\n }\n })\n });\n }\n\n renderDelegate(template = '{{action-delegate}}', context = {}) {\n let root = this;\n context = (0, _polyfills.assign)(context, {\n send(actionName, ...args) {\n root.sendCount++;\n root.actionCounts[actionName] = root.actionCounts[actionName] || 0;\n root.actionCounts[actionName]++;\n root.actionArguments = args;\n }\n });\n this.render(template, context);\n }\n\n assertSendCount(count) {\n this.assert.equal(this.sendCount, count, `Send was called ${count} time(s)`);\n }\n\n assertNamedSendCount(actionName, count) {\n this.assert.equal(this.actionCounts[actionName], count, `An action named '${actionName}' was sent ${count} times`);\n }\n\n assertSentWithArgs(expected, message = 'arguments were sent with the action') {\n this.assert.deepEqual(this.actionArguments, expected, message);\n }\n\n ['@test Calling sendAction on a component without an action defined does nothing']() {\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction());\n });\n\n this.assertSendCount(0);\n }\n\n ['@test Calling sendAction on a component with an action defined calls send on the controller']() {\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', 'addItem');\n this.delegate.sendAction();\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('addItem', 1);\n }\n\n ['@test Calling sendAction on a component with a function calls the function']() {\n this.assert.expect(2);\n\n this.renderDelegate();\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', () => this.assert.ok(true, 'function is called'));\n this.delegate.sendAction();\n });\n });\n }\n\n ['@test Calling sendAction on a component with a function calls the function with arguments']() {\n this.assert.expect(2);\n let argument = {};\n\n this.renderDelegate();\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', actualArgument => {\n this.assert.deepEqual(argument, actualArgument, 'argument is passed');\n });\n this.delegate.sendAction('action', argument);\n });\n });\n }\n\n // TODO consolidate these next 2 tests\n ['@test Calling sendAction on a component with a reference attr calls the function with arguments']() {\n this.renderDelegate('{{action-delegate playing=playing}}', {\n playing: null\n });\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction());\n });\n\n this.assertSendCount(0);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'playing', 'didStartPlaying');\n });\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n this.delegate.sendAction('playing');\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n }\n\n ['@test Calling sendAction on a component with a {{mut}} attr calls the function with arguments']() {\n this.renderDelegate('{{action-delegate playing=(mut playing)}}', {\n playing: null\n });\n\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction('playing'));\n });\n\n this.assertSendCount(0);\n\n this.runTask(() => this.delegate.attrs.playing.update('didStartPlaying'));\n expectSendActionDeprecation(() => {\n this.runTask(() => this.delegate.sendAction('playing'));\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n }\n\n [\"@test Calling sendAction with a named action uses the component's property as the action name\"]() {\n this.renderDelegate();\n\n let component = this.delegate;\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'playing', 'didStartPlaying');\n component.sendAction('playing');\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n\n expectSendActionDeprecation(() => {\n this.runTask(() => component.sendAction('playing'));\n });\n\n this.assertSendCount(2);\n this.assertNamedSendCount('didStartPlaying', 2);\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(component, 'action', 'didDoSomeBusiness');\n component.sendAction();\n });\n });\n\n this.assertSendCount(3);\n this.assertNamedSendCount('didDoSomeBusiness', 1);\n }\n\n ['@test Calling sendAction when the action name is not a string raises an exception']() {\n this.renderDelegate();\n\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'action', {});\n (0, _metal.set)(this.delegate, 'playing', {});\n });\n expectSendActionDeprecation(() => {\n expectAssertion(() => this.delegate.sendAction());\n });\n expectSendActionDeprecation(() => {\n expectAssertion(() => this.delegate.sendAction('playing'));\n });\n }\n\n ['@test Calling sendAction on a component with contexts']() {\n this.renderDelegate();\n\n let testContext = { song: 'She Broke My Ember' };\n let firstContext = { song: 'She Broke My Ember' };\n let secondContext = { song: 'My Achey Breaky Ember' };\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n (0, _metal.set)(this.delegate, 'playing', 'didStartPlaying');\n this.delegate.sendAction('playing', testContext);\n });\n });\n\n this.assertSendCount(1);\n this.assertNamedSendCount('didStartPlaying', 1);\n this.assertSentWithArgs([testContext], 'context was sent with the action');\n\n expectSendActionDeprecation(() => {\n this.runTask(() => {\n this.delegate.sendAction('playing', firstContext, secondContext);\n });\n });\n\n this.assertSendCount(2);\n this.assertNamedSendCount('didStartPlaying', 2);\n this.assertSentWithArgs([firstContext, secondContext], 'multiple contexts were sent to the action');\n }\n\n ['@test calling sendAction on a component within a block sends to the outer scope GH#14216'](assert) {\n let testContext = this;\n // overrides default action-delegate so actions can be added\n this.registerComponent('action-delegate', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n testContext.delegate = this;\n this.name = 'action-delegate';\n },\n\n actions: {\n derp(arg1) {\n assert.ok(true, 'action called on action-delgate');\n assert.equal(arg1, 'something special', 'argument passed through properly');\n }\n }\n }),\n\n template: _abstractTestCase.strip`\n {{#component-a}}\n {{component-b bar=\"derp\"}}\n {{/component-a}}\n `\n });\n\n this.registerComponent('component-a', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.name = 'component-a';\n },\n actions: {\n derp() {\n assert.ok(false, 'no! bad scoping!');\n }\n }\n })\n });\n\n let innerChild;\n this.registerComponent('component-b', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerChild = this;\n this.name = 'component-b';\n }\n })\n });\n\n this.renderDelegate();\n expectSendActionDeprecation(() => {\n this.runTask(() => innerChild.sendAction('bar', 'something special'));\n });\n }\n\n ['@test asserts if called on a destroyed component']() {\n let component;\n\n this.registerComponent('rip-alley', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n\n toString() {\n return 'component:rip-alley';\n }\n })\n });\n\n this.render('{{#if shouldRender}}{{rip-alley}}{{/if}}', {\n shouldRender: true\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'shouldRender', false);\n });\n\n expectAssertion(() => {\n component.sendAction('trigger-me-dead');\n }, \"Attempted to call .sendAction() with the action 'trigger-me-dead' on the destroyed object 'component:rip-alley'.\");\n }\n });\n\n (0, _testCase.moduleFor)('Components test: sendAction to a controller', class extends _testCase.ApplicationTest {\n [\"@test sendAction should trigger an action on the parent component's controller if it exists\"](assert) {\n assert.expect(20);\n\n let component;\n\n this.router.map(function () {\n this.route('a');\n this.route('b');\n this.route('c', function () {\n this.route('d');\n this.route('e');\n });\n });\n\n this.addComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `{{val}}`\n });\n\n this.add('controller:a', _controller.default.extend({\n send(actionName, actionContext) {\n assert.equal(actionName, 'poke', 'send() method was invoked from a top level controller');\n assert.equal(actionContext, 'top', 'action arguments were passed into the top level controller');\n }\n }));\n this.addTemplate('a', '{{foo-bar val=\"a\" poke=\"poke\"}}');\n\n this.add('route:b', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'top no controller');\n }\n }\n }));\n this.addTemplate('b', '{{foo-bar val=\"b\" poke=\"poke\"}}');\n\n this.add('route:c', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'top with nested no controller');\n }\n }\n }));\n this.addTemplate('c', '{{foo-bar val=\"c\" poke=\"poke\"}}{{outlet}}');\n\n this.add('route:c.d', _routing.Route.extend({}));\n\n this.add('controller:c.d', _controller.default.extend({\n send(actionName, actionContext) {\n assert.equal(actionName, 'poke', 'send() method was invoked from a nested controller');\n assert.equal(actionContext, 'nested', 'action arguments were passed into the nested controller');\n }\n }));\n this.addTemplate('c.d', '{{foo-bar val=\".d\" poke=\"poke\"}}');\n\n this.add('route:c.e', _routing.Route.extend({\n actions: {\n poke(actionContext) {\n assert.ok(true, 'Unhandled action sent to route');\n assert.equal(actionContext, 'nested no controller');\n }\n }\n }));\n this.addTemplate('c.e', '{{foo-bar val=\".e\" poke=\"poke\"}}');\n\n return this.visit('/a').then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'top'));\n }).then(() => {\n this.assertText('a');\n return this.visit('/b');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'top no controller'));\n }).then(() => {\n this.assertText('b');\n return this.visit('/c');\n }).then(() => {\n expectSendActionDeprecation(() => {\n component.sendAction('poke', 'top with nested no controller');\n });\n }).then(() => {\n this.assertText('c');\n return this.visit('/c/d');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'nested'));\n }).then(() => {\n this.assertText('c.d');\n return this.visit('/c/e');\n }).then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke', 'nested no controller'));\n }).then(() => this.assertText('c.e'));\n }\n\n [\"@test sendAction should not trigger an action in an outlet's controller if a parent component handles it\"](assert) {\n assert.expect(2);\n\n let component;\n\n this.addComponent('x-parent', {\n ComponentClass: _helpers.Component.extend({\n actions: {\n poke() {\n assert.ok(true, 'parent component handled the aciton');\n }\n }\n }),\n template: '{{x-child poke=\"poke\"}}'\n });\n\n this.addComponent('x-child', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n })\n });\n\n this.addTemplate('application', '{{x-parent}}');\n this.add('controller:application', _controller.default.extend({\n send() {\n throw new Error('controller action should not be called');\n }\n }));\n\n return this.visit('/').then(() => {\n expectSendActionDeprecation(() => component.sendAction('poke'));\n });\n }\n });\n\n (0, _testCase.moduleFor)('Components test: sendAction of a closure action', class extends _testCase.RenderingTest {\n ['@test action should be called'](assert) {\n assert.expect(2);\n let component;\n\n this.registerComponent('inner-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n outerSubmit() {\n assert.ok(true, 'outerSubmit called');\n }\n }),\n template: '{{inner-component submitAction=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n expectSendActionDeprecation(() => {\n this.runTask(() => component.sendAction('submitAction'));\n });\n }\n\n ['@test contexts passed to sendAction are appended to the bound arguments on a closure action']() {\n let first = 'mitch';\n let second = 'martin';\n let third = 'matt';\n let fourth = 'wacky wycats';\n\n let innerComponent;\n let actualArgs;\n\n this.registerComponent('inner-component', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n }\n }),\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n third,\n actions: {\n outerSubmit() {\n actualArgs = [...arguments];\n }\n }\n }),\n template: `{{inner-component innerSubmit=(action (action \"outerSubmit\" \"${first}\") \"${second}\" third)}}`\n });\n\n this.render('{{outer-component}}');\n expectSendActionDeprecation(() => {\n this.runTask(() => innerComponent.sendAction('innerSubmit', fourth));\n });\n\n this.assert.deepEqual(actualArgs, [first, second, third, fourth], 'action has the correct args');\n }\n });\n\n (0, _testCase.moduleFor)('Components test: send', class extends _testCase.RenderingTest {\n ['@test sending to undefined actions triggers an error'](assert) {\n assert.expect(2);\n\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n actions: {\n foo(message) {\n assert.equal('bar', message);\n }\n }\n })\n });\n\n this.render('{{foo-bar}}');\n\n this.runTask(() => component.send('foo', 'bar'));\n\n expectAssertion(() => {\n return component.send('baz', 'bar');\n }, /had no action handler for: baz/);\n }\n\n ['@test `send` will call send from a target if it is defined']() {\n let component;\n let target = {\n send: (message, payload) => {\n this.assert.equal('foo', message);\n this.assert.equal('baz', payload);\n }\n };\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n target\n })\n });\n\n this.render('{{foo-bar}}');\n\n this.runTask(() => component.send('foo', 'baz'));\n }\n\n ['@test a handled action can be bubbled to the target for continued processing']() {\n this.assert.expect(2);\n\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n poke: () => {\n this.assert.ok(true, 'component action called');\n return true;\n }\n },\n target: _controller.default.extend({\n actions: {\n poke: () => {\n this.assert.ok(true, 'action bubbled to controller');\n }\n }\n }).create()\n })\n });\n\n this.render('{{foo-bar poke=\"poke\"}}');\n\n this.runTask(() => component.send('poke'));\n }\n\n [\"@test action can be handled by a superclass' actions object\"](assert) {\n this.assert.expect(4);\n\n let component;\n\n let SuperComponent = _helpers.Component.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let BarViewMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\n }\n }\n });\n\n this.registerComponent('x-index', {\n ComponentClass: SuperComponent.extend(BarViewMixin, {\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n }\n })\n });\n\n this.render('{{x-index}}');\n\n this.runTask(() => {\n component.send('foo');\n component.send('bar', 'HELLO');\n component.send('baz');\n });\n }\n\n ['@test actions cannot be provided at create time'](assert) {\n this.registerComponent('foo-bar', _helpers.Component.extend());\n let ComponentFactory = this.owner.factoryFor('component:foo-bar');\n\n expectAssertion(() => {\n ComponentFactory.create({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n }\n }\n });\n }, /`actions` must be provided at extend time, not at create time/);\n // but should be OK on an object that doesn't mix in Ember.ActionHandler\n _runtime.Object.create({\n actions: ['foo']\n });\n }\n\n ['@test asserts if called on a destroyed component']() {\n let component;\n\n this.registerComponent('rip-alley', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super();\n component = this;\n },\n\n toString() {\n return 'component:rip-alley';\n }\n })\n });\n\n this.render('{{#if shouldRender}}{{rip-alley}}{{/if}}', {\n shouldRender: true\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'shouldRender', false);\n });\n\n expectAssertion(() => {\n component.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed object 'component:rip-alley'.\");\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/template-only-components-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/environment'], function (_testCase, _testHelpers, _environment) {\n 'use strict';\n\n class TemplateOnlyComponentsTest extends _testCase.RenderingTest {\n registerComponent(name, template) {\n super.registerComponent(name, { template, ComponentClass: null });\n }\n }\n\n (0, _testCase.moduleFor)('Components test: template-only components (glimmer components)', class extends TemplateOnlyComponentsTest {\n constructor() {\n super(...arguments);\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n ['@test it can render a template-only component']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar}}');\n\n this.assertInnerHTML('hello');\n\n this.assertStableRerender();\n }\n\n ['@feature(ember-glimmer-named-arguments) it can render named arguments']() {\n this.registerComponent('foo-bar', '|{{@foo}}|{{@bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertInnerHTML('|foo|bar|');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertInnerHTML('|FOO|bar|');\n\n this.runTask(() => this.context.set('bar', 'BAR'));\n\n this.assertInnerHTML('|FOO|BAR|');\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertInnerHTML('|foo|bar|');\n }\n\n ['@test it does not reflected arguments as properties']() {\n this.registerComponent('foo-bar', '|{{foo}}|{{this.bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertInnerHTML('|||');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertInnerHTML('|||');\n\n this.runTask(() => this.context.set('bar', null));\n\n this.assertInnerHTML('|||');\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertInnerHTML('|||');\n }\n\n ['@test it does not have curly component features']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar tagName=\"p\" class=class}}', {\n class: 'foo bar'\n });\n\n this.assertInnerHTML('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('class', 'foo'));\n\n this.assertInnerHTML('hello');\n\n this.runTask(() => this.context.set('class', null));\n\n this.assertInnerHTML('hello');\n\n this.runTask(() => this.context.set('class', 'foo bar'));\n\n this.assertInnerHTML('hello');\n }\n });\n\n (0, _testCase.moduleFor)('Components test: template-only components (curly components)', class extends TemplateOnlyComponentsTest {\n constructor() {\n super(...arguments);\n this._TEMPLATE_ONLY_GLIMMER_COMPONENTS = _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = false;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = this._TEMPLATE_ONLY_GLIMMER_COMPONENTS;\n }\n\n ['@test it can render a template-only component']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar}}');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.assertStableRerender();\n }\n\n ['@feature(ember-glimmer-named-arguments) it can render named arguments']() {\n this.registerComponent('foo-bar', '|{{@foo}}|{{@bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|bar|' });\n\n this.runTask(() => this.context.set('bar', 'BAR'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|BAR|' });\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n }\n\n ['@test it renders named arguments as reflected properties']() {\n this.registerComponent('foo-bar', '|{{foo}}|{{this.bar}}|');\n\n this.render('{{foo-bar foo=foo bar=bar}}', {\n foo: 'foo',\n bar: 'bar'\n });\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('foo', 'FOO'));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO|bar|' });\n\n this.runTask(() => this.context.set('bar', null));\n\n this.assertComponentElement(this.firstChild, { content: '|FOO||' });\n\n this.runTask(() => this.context.setProperties({ foo: 'foo', bar: 'bar' }));\n\n this.assertComponentElement(this.firstChild, { content: '|foo|bar|' });\n }\n\n ['@test it has curly component features']() {\n this.registerComponent('foo-bar', 'hello');\n\n this.render('{{foo-bar tagName=\"p\" class=class}}', {\n class: 'foo bar'\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo bar ember-view') },\n content: 'hello'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => this.context.set('class', 'foo'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => this.context.set('class', null));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('ember-view') },\n content: 'hello'\n });\n\n this.runTask(() => this.context.set('class', 'foo bar'));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'p',\n attrs: { class: (0, _testHelpers.classes)('foo bar ember-view') },\n content: 'hello'\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/to-string-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer'], function (_testCase, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('built-in component toString', class AbstractAppendTest extends _testCase.RenderingTest {\n '@test text-field has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.TextField.toString(), '@ember/component/text-field');\n }\n\n '@test checkbox has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.Checkbox.toString(), '@ember/component/checkbox');\n }\n\n '@test text-area has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.TextArea.toString(), '@ember/component/text-area');\n }\n\n '@test component has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.Component.toString(), '@ember/component');\n }\n\n '@test LinkTo has the correct toString value'(assert) {\n assert.strictEqual(_glimmer.LinkComponent.toString(), '@ember/routing/link-component');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/utils-test', ['@ember/controller', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_controller, _views, _testCase, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('View tree tests', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.addComponent('x-tagless', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n\n template: '
[{{id}}] {{#if isShowing}}{{yield}}{{/if}}
'\n });\n\n this.addComponent('x-toggle', {\n ComponentClass: _helpers.Component.extend({\n isExpanded: true,\n\n click() {\n this.toggleProperty('isExpanded');\n return false;\n }\n }),\n\n template: '[{{id}}] {{#if isExpanded}}{{yield}}{{/if}}'\n });\n\n let ToggleController = _controller.default.extend({\n isExpanded: true,\n\n actions: {\n toggle: function () {\n this.toggleProperty('isExpanded');\n }\n }\n });\n\n this.add('controller:application', ToggleController);\n\n this.addTemplate('application', `\n {{x-tagless id=\"root-1\"}}\n\n {{#x-toggle id=\"root-2\"}}\n {{x-toggle id=\"inner-1\"}}\n\n {{#x-toggle id=\"inner-2\"}}\n {{x-toggle id=\"inner-3\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n \n\n {{#if isExpanded}}\n {{x-toggle id=\"root-3\"}}\n {{/if}}\n\n {{outlet}}\n `);\n\n this.add('controller:index', ToggleController.extend({\n isExpanded: false\n }));\n\n this.addTemplate('index', `\n {{x-tagless id=\"root-4\"}}\n\n {{#x-toggle id=\"root-5\" isExpanded=false}}\n {{x-toggle id=\"inner-4\"}}\n\n {{#x-toggle id=\"inner-5\"}}\n {{x-toggle id=\"inner-6\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n \n\n {{#if isExpanded}}\n {{x-toggle id=\"root-6\"}}\n {{/if}}\n `);\n\n this.addTemplate('zomg', `\n {{x-tagless id=\"root-7\"}}\n\n {{#x-toggle id=\"root-8\"}}\n {{x-toggle id=\"inner-7\"}}\n\n {{#x-toggle id=\"inner-8\"}}\n {{x-toggle id=\"inner-9\"}}\n {{/x-toggle}}\n {{/x-toggle}}\n\n {{#x-toggle id=\"root-9\"}}\n {{outlet}}\n {{/x-toggle}}\n `);\n\n this.addTemplate('zomg.lol', `\n {{x-toggle id=\"inner-10\"}}\n `);\n\n this.router.map(function () {\n this.route('zomg', function () {\n this.route('lol');\n });\n });\n }\n\n ['@test getRootViews']() {\n return this.visit('/').then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5']);\n\n this.runTask(() => this.$('#toggle-application').click());\n\n this.assertRootViews(['root-1', 'root-2', 'root-4', 'root-5']);\n\n this.runTask(() => {\n this.$('#toggle-application').click();\n this.$('#toggle-index').click();\n });\n\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5', 'root-6']);\n\n return this.visit('/zomg/lol');\n }).then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-7', 'root-8', 'root-9']);\n\n return this.visit('/');\n }).then(() => {\n this.assertRootViews(['root-1', 'root-2', 'root-3', 'root-4', 'root-5', 'root-6']);\n });\n }\n\n assertRootViews(ids) {\n let owner = this.applicationInstance;\n\n let actual = (0, _views.getRootViews)(owner).map(view => view.id).sort();\n let expected = ids.sort();\n\n this.assert.deepEqual(actual, expected, 'root views');\n }\n\n ['@test getChildViews']() {\n return this.visit('/').then(() => {\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n this.assertChildViews('root-5', []);\n this.assertChildViews('inner-2', ['inner-3']);\n\n this.runTask(() => this.$('#root-2').click());\n\n this.assertChildViews('root-2', []);\n\n this.runTask(() => this.$('#root-5').click());\n\n this.assertChildViews('root-5', ['inner-4', 'inner-5']);\n this.assertChildViews('inner-5', ['inner-6']);\n\n return this.visit('/zomg');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-8', ['inner-7', 'inner-8']);\n this.assertChildViews('inner-8', ['inner-9']);\n this.assertChildViews('root-9', []);\n\n this.runTask(() => this.$('#root-8').click());\n\n this.assertChildViews('root-8', []);\n\n return this.visit('/zomg/lol');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-8', []);\n this.assertChildViews('root-9', ['inner-10']);\n\n return this.visit('/');\n }).then(() => {\n this.assertChildViews('root-2', []);\n this.assertChildViews('root-5', []);\n\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#inner-2').click());\n\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n this.assertChildViews('inner-2', []);\n });\n }\n\n ['@test getChildViews does not return duplicates']() {\n return this.visit('/').then(() => {\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n this.runTask(() => this.$('#root-2').click());\n\n this.assertChildViews('root-2', ['inner-1', 'inner-2']);\n });\n }\n\n assertChildViews(parentId, childIds) {\n let parentView = this.viewFor(parentId);\n let childViews = (0, _views.getChildViews)(parentView);\n\n let actual = childViews.map(view => view.id).sort();\n let expected = childIds.sort();\n\n this.assert.deepEqual(actual, expected, `child views for #${parentId}`);\n }\n\n viewFor(id) {\n let owner = this.applicationInstance;\n let registry = owner.lookup('-view-registry:main');\n return registry[id];\n }\n });\n\n let hasGetClientRects, hasGetBoundingClientRect;\n let ClientRectListCtor, ClientRectCtor;\n\n (function () {\n if (document.createRange) {\n let range = document.createRange();\n\n if (range.getClientRects) {\n let clientRectsList = range.getClientRects();\n hasGetClientRects = true;\n ClientRectListCtor = clientRectsList && clientRectsList.constructor;\n }\n\n if (range.getBoundingClientRect) {\n let clientRect = range.getBoundingClientRect();\n hasGetBoundingClientRect = true;\n ClientRectCtor = clientRect && clientRect.constructor;\n }\n }\n })();\n\n (0, _testCase.moduleFor)('Bounds tests', class extends _testCase.RenderingTest {\n ['@test getViewBounds on a regular component'](assert) {\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

Hi, mom!

`\n });\n\n this.render(`{{hi-mom}}`);\n\n let { parentElement, firstNode, lastNode } = (0, _views.getViewBounds)(component);\n\n assert.equal(parentElement, this.element, 'a regular component should have the right parentElement');\n assert.equal(firstNode, component.element, 'a regular component should have a single node that is its element');\n assert.equal(lastNode, component.element, 'a regular component should have a single node that is its element');\n }\n\n ['@test getViewBounds on a tagless component'](assert) {\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `Hi, mom!`\n });\n\n this.render(`{{hi-mom}}`);\n\n let { parentElement, firstNode, lastNode } = (0, _views.getViewBounds)(component);\n\n assert.equal(parentElement, this.element, 'a tagless component should have the right parentElement');\n assert.equal(firstNode, this.$('#start-node')[0], 'a tagless component should have a range enclosing all of its nodes');\n assert.equal(lastNode, this.$('#before-end-node')[0].nextSibling, 'a tagless component should have a range enclosing all of its nodes');\n }\n\n ['@test getViewClientRects'](assert) {\n if (!hasGetClientRects || !ClientRectListCtor) {\n assert.ok(true, 'The test environment does not support the DOM API required to run this test.');\n return;\n }\n\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

Hi, mom!

`\n });\n\n this.render(`{{hi-mom}}`);\n\n assert.ok((0, _views.getViewClientRects)(component) instanceof ClientRectListCtor);\n }\n\n ['@test getViewBoundingClientRect'](assert) {\n if (!hasGetBoundingClientRect || !ClientRectCtor) {\n assert.ok(true, 'The test environment does not support the DOM API required to run this test.');\n return;\n }\n\n let component;\n this.registerComponent('hi-mom', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: `

Hi, mom!

`\n });\n\n this.render(`{{hi-mom}}`);\n\n assert.ok((0, _views.getViewBoundingClientRect)(component) instanceof ClientRectCtor);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/web-component-fallback-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Components test: web component fallback', class extends _testCase.RenderingTest {\n ['@test custom elements are rendered']() {\n let template = `hello`;\n\n this.render(template);\n\n this.assertHTML(template);\n\n this.assertStableRerender();\n }\n\n ['@test custom elements can have bound attributes']() {\n let template = `hello`;\n\n this.render(template, { name: 'Robert' });\n\n this.assertHTML(`hello`);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Kris'));\n\n this.assertHTML(`hello`);\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Robert'));\n\n this.assertHTML(`hello`);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/components/will-destroy-element-hook-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case'], function (_metal, _helpers, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Component willDestroyElement hook', class extends _testCase.RenderingTest {\n ['@test it calls willDestroyElement when removed by if'](assert) {\n let didInsertElementCount = 0;\n let willDestroyElementCount = 0;\n let FooBarComponent = _helpers.Component.extend({\n didInsertElement() {\n didInsertElementCount++;\n assert.notEqual(this.element.parentNode, null, 'precond component is in DOM');\n },\n willDestroyElement() {\n willDestroyElementCount++;\n assert.notEqual(this.element.parentNode, null, 'has not been removed from DOM yet');\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n\n this.render('{{#if switch}}{{foo-bar}}{{/if}}', { switch: true });\n\n assert.equal(didInsertElementCount, 1, 'didInsertElement was called once');\n\n this.assertComponentElement(this.firstChild, { content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'switch', false));\n\n assert.equal(willDestroyElementCount, 1, 'willDestroyElement was called once');\n\n this.assertText('');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/content-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/debug', '@ember/object/computed', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/views', '@ember/-internals/glimmer/tests/utils/helpers'], function (_testCase, _abstractTestCase, _metal, _debug, _computed, _runtime, _testHelpers, _views, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Static content tests', class extends _testCase.RenderingTest {\n ['@test it can render a static text node']() {\n this.render('hello');\n let text1 = this.assertTextNode(this.firstChild, 'hello');\n\n this.runTask(() => this.rerender());\n\n let text2 = this.assertTextNode(this.firstChild, 'hello');\n\n this.assertSameNode(text1, text2);\n }\n\n ['@test it can render a static element']() {\n this.render('

hello

');\n let p1 = this.assertElement(this.firstChild, { tagName: 'p' });\n let text1 = this.assertTextNode(this.firstChild.firstChild, 'hello');\n\n this.runTask(() => this.rerender());\n\n let p2 = this.assertElement(this.firstChild, { tagName: 'p' });\n let text2 = this.assertTextNode(this.firstChild.firstChild, 'hello');\n\n this.assertSameNode(p1, p2);\n this.assertSameNode(text1, text2);\n }\n\n ['@test it can render a static template']() {\n let template = `\n
\n

Welcome to Ember.js

\n
\n
\n

Why you should use Ember.js?

\n
    \n
  1. It's great
  2. \n
  3. It's awesome
  4. \n
  5. It's Ember.js
  6. \n
\n
\n
\n Ember.js is free, open source and always will be.\n
\n `;\n\n this.render(template);\n this.assertHTML(template);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(template);\n }\n }); /* globals EmberDev */\n\n\n class DynamicContentTest extends _testCase.RenderingTest {\n /* abstract */\n renderPath() /* path, context = {} */{\n throw new Error('Not implemented: `renderValues`');\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.firstChild, null);\n }\n\n /* abstract */\n assertContent() /* content */{\n throw new Error('Not implemented: `assertContent`');\n }\n\n ['@test it can render a dynamic path']() {\n this.renderPath('message', { message: 'hello' });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test resolves the string length properly']() {\n this.render('

{{foo.length}}

', { foo: undefined });\n\n this.assertHTML('

');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'foo'));\n\n this.assertHTML('

3

');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', ''));\n\n this.assertHTML('

0

');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertHTML('

');\n }\n\n ['@test resolves the array length properly']() {\n this.render('

{{foo.length}}

', { foo: undefined });\n\n this.assertHTML('

');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', [1, 2, 3]));\n\n this.assertHTML('

3

');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', []));\n\n this.assertHTML('

0

');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', undefined));\n\n this.assertHTML('

');\n }\n\n ['@test it can render a capitalized path with no deprecation']() {\n expectNoDeprecation();\n\n this.renderPath('CaptializedPath', { CaptializedPath: 'no deprecation' });\n\n this.assertContent('no deprecation');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'CaptializedPath', 'still no deprecation'));\n\n this.assertContent('still no deprecation');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'CaptializedPath', 'no deprecation'));\n\n this.assertContent('no deprecation');\n this.assertInvariants();\n }\n\n ['@test it can render undefined dynamic paths']() {\n this.renderPath('name', {});\n\n this.assertIsEmpty();\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'foo-bar'));\n\n this.assertContent('foo-bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', undefined));\n\n this.assertIsEmpty();\n }\n\n ['@test it can render a deeply nested dynamic path']() {\n this.renderPath('a.b.c.d.e.f', {\n a: { b: { c: { d: { e: { f: 'hello' } } } } }\n });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'a.b.c.d.e.f', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'a.b.c.d', { e: { f: 'aloha' } }));\n\n this.assertContent('aloha');\n this.assertInvariants();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'a', { b: { c: { d: { e: { f: 'hello' } } } } });\n });\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a computed property']() {\n let Formatter = _runtime.Object.extend({\n formattedMessage: (0, _metal.computed)('message', function () {\n return this.get('message').toUpperCase();\n })\n });\n\n let m = Formatter.create({ message: 'hello' });\n\n this.renderPath('m.formattedMessage', { m });\n\n this.assertContent('HELLO');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(m, 'message', 'goodbye'));\n\n this.assertContent('GOODBYE');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'm', Formatter.create({ message: 'hello' })));\n\n this.assertContent('HELLO');\n this.assertInvariants();\n }\n\n ['@test it can render a computed property with nested dependency']() {\n let Formatter = _runtime.Object.extend({\n formattedMessage: (0, _metal.computed)('messenger.message', function () {\n return this.get('messenger.message').toUpperCase();\n })\n });\n\n let m = Formatter.create({ messenger: { message: 'hello' } });\n\n this.renderPath('m.formattedMessage', { m });\n\n this.assertContent('HELLO');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(m, 'messenger.message', 'goodbye'));\n\n this.assertContent('GOODBYE');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'm', Formatter.create({ messenger: { message: 'hello' } })));\n\n this.assertContent('HELLO');\n this.assertInvariants();\n }\n\n ['@test it can read from a proxy object']() {\n this.renderPath('proxy.name', {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertContent('Tom Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Yehuda Katz'));\n\n this.assertContent('Yehuda Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertContent('Godfrey Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Stefan Penner'));\n\n this.assertContent('Stefan Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertContent('Tom Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a nested path in a proxy object']() {\n this.renderPath('proxy.name.last', {\n proxy: _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', { first: 'Yehuda', last: 'Katz' }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', {\n name: { first: 'Godfrey', last: 'Chan' }\n }));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', { first: 'Stefan', last: 'Penner' }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a path flipping between a proxy and a real object']() {\n this.renderPath('proxyOrObject.name.last', {\n proxyOrObject: _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', {\n name: { first: 'Tom', last: 'Dale' }\n }));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', {\n name: { first: 'Yehuda', last: 'Katz' }\n }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', _runtime.ObjectProxy.create({\n content: { name: { first: 'Godfrey', last: 'Chan' } }\n })));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject.content.name', {\n first: 'Stefan',\n last: 'Penner'\n }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxyOrObject', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a path flipping between a real object and a proxy']() {\n this.renderPath('objectOrProxy.name.last', {\n objectOrProxy: { name: { first: 'Tom', last: 'Dale' } }\n });\n\n this.assertContent('Dale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', _runtime.ObjectProxy.create({\n content: { name: { first: 'Tom', last: 'Dale' } }\n })));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content.name.last', 'Cruise'));\n\n this.assertContent('Cruise');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content.name.first', 'Suri'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.content', {\n name: { first: 'Yehuda', last: 'Katz' }\n }));\n\n this.assertContent('Katz');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', {\n name: { first: 'Godfrey', last: 'Chan' }\n }));\n\n this.assertContent('Chan');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy.name', {\n first: 'Stefan',\n last: 'Penner'\n }));\n\n this.assertContent('Penner');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', null));\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectOrProxy', {\n name: { first: 'Tom', last: 'Dale' }\n }));\n\n this.assertContent('Dale');\n this.assertInvariants();\n }\n\n ['@test it can read from a null object']() {\n let nullObject = Object.create(null);\n nullObject['message'] = 'hello';\n\n this.renderPath('nullObject.message', { nullObject });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(nullObject, 'message', 'goodbye'));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n nullObject = Object.create(null);\n nullObject['message'] = 'hello';\n\n this.runTask(() => (0, _metal.set)(this.context, 'nullObject', nullObject));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a readOnly property of a path']() {\n let Messenger = _runtime.Object.extend({\n message: (0, _computed.readOnly)('a.b.c')\n });\n\n let messenger = Messenger.create({\n a: {\n b: {\n c: 'hello'\n }\n }\n });\n\n this.renderPath('messenger.message', { messenger });\n\n this.assertContent('hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(messenger, 'a.b.c', 'hi'));\n\n this.assertContent('hi');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'messenger.a.b', {\n c: 'goodbye'\n }));\n\n this.assertContent('goodbye');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'messenger', {\n message: 'hello'\n }));\n\n this.assertContent('hello');\n this.assertInvariants();\n }\n\n ['@test it can render a property on a function']() {\n let func = () => {};\n func.aProp = 'this is a property on a function';\n\n this.renderPath('func.aProp', { func });\n\n this.assertContent('this is a property on a function');\n\n this.assertStableRerender();\n\n // this.runTask(() => set(func, 'aProp', 'still a property on a function'));\n // this.assertContent('still a property on a function');\n // this.assertInvariants();\n\n // func = () => {};\n // func.aProp = 'a prop on a new function';\n\n // this.runTask(() => set(this.context, 'func', func));\n\n // this.assertContent('a prop on a new function');\n // this.assertInvariants();\n }\n }\n\n const EMPTY = {};\n\n class ContentTestGenerator {\n constructor(cases, tag = '@test') {\n this.cases = cases;\n this.tag = tag;\n }\n\n generate([value, expected, label]) {\n let tag = this.tag;\n label = label || value;\n\n if (expected === EMPTY) {\n return {\n [`${tag} rendering ${label}`]() {\n this.renderPath('value', { value });\n\n this.assertIsEmpty();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', value));\n\n this.assertIsEmpty();\n }\n };\n } else {\n return {\n [`${tag} rendering ${label}`]() {\n this.renderPath('value', { value });\n\n this.assertContent(expected);\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('hello');\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', value));\n\n this.assertContent(expected);\n this.assertInvariants();\n }\n };\n }\n }\n }\n\n const SharedContentTestCases = new ContentTestGenerator([['foo', 'foo'], [0, '0'], [-0, '0', '-0'], [1, '1'], [-1, '-1'], [0.0, '0', '0.0'], [0.5, '0.5'], [undefined, EMPTY], [null, EMPTY], [true, 'true'], [false, 'false'], [NaN, 'NaN'], [new Date(2000, 0, 1), String(new Date(2000, 0, 1)), 'a Date object'], [Infinity, 'Infinity'], [1 / -0, '-Infinity'], [{ foo: 'bar' }, '[object Object]', `{ foo: 'bar' }`], [{\n toString() {\n return 'foo';\n }\n }, 'foo', 'an object with a custom toString function'], [{\n valueOf() {\n return 1;\n }\n }, '[object Object]', 'an object with a custom valueOf function'],\n\n // Escaping tests\n ['MaxJames', 'MaxJames']]);\n\n let GlimmerContentTestCases = new ContentTestGenerator([[Object.create(null), EMPTY, 'an object with no toString']]);\n\n if (typeof Symbol !== 'undefined') {\n GlimmerContentTestCases.cases.push([Symbol('debug'), 'Symbol(debug)', 'a symbol']);\n }\n\n (0, _abstractTestCase.applyMixins)(DynamicContentTest, SharedContentTestCases, GlimmerContentTestCases);\n\n (0, _testCase.moduleFor)('Dynamic content tests (content position)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`{{${path}}}`, context);\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one text node');\n this.assertTextNode(this.firstChild, content);\n // this.takeSnapshot();\n }\n\n ['@test it can render empty safe strings [GH#16314]']() {\n this.render('before {{value}} after', { value: (0, _helpers.htmlSafe)('hello') });\n\n this.assertHTML('before hello after');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('')));\n\n this.assertHTML('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('hello')));\n\n this.assertHTML('before hello after');\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (content concat)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`{{concat \"\" ${path} \"\"}}`, context);\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one text node');\n this.assertTextNode(this.firstChild, content);\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (inside an element)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`

{{${path}}}

`, context);\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one

tag');\n this.assertElement(this.firstChild, { tagName: 'p' });\n this.assertText('');\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one

tag');\n this.assertElement(this.firstChild, { tagName: 'p' });\n this.assertText(content);\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (attribute position)', class extends DynamicContentTest {\n renderPath(path, context = {}) {\n this.render(`

`, context);\n }\n\n assertIsEmpty() {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one
tag');\n this.assertElement(this.firstChild, { tagName: 'div', content: '' });\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one
tag');\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { 'data-foo': content },\n content: ''\n });\n }\n });\n\n class TrustedContentTest extends DynamicContentTest {\n assertIsEmpty() {\n this.assert.strictEqual(this.firstChild, null);\n }\n\n assertContent(content) {\n this.assertHTML(content);\n }\n\n assertStableRerender() {\n this.takeSnapshot();\n this.runTask(() => this.rerender());\n super.assertInvariants();\n }\n\n assertInvariants() {\n // If it's not stable, we will wipe out all the content and replace them,\n // so there are no invariants\n }\n }\n\n (0, _testCase.moduleFor)('Dynamic content tests (trusted)', class extends TrustedContentTest {\n renderPath(path, context = {}) {\n this.render(`{{{${path}}}}`, context);\n }\n\n ['@test updating trusted curlies']() {\n this.render('{{{htmlContent}}}{{{nested.htmlContent}}}', {\n htmlContent: 'Max',\n nested: { htmlContent: 'James' }\n });\n\n this.assertContent('MaxJames');\n\n this.runTask(() => this.rerender());\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'htmlContent', 'Max'));\n\n this.assertContent('MaxJames');\n\n this.runTask(() => (0, _metal.set)(this.context, 'nested.htmlContent', 'Jammie'));\n\n this.assertContent('MaxJammie');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'htmlContent', 'Max');\n (0, _metal.set)(this.context, 'nested', { htmlContent: 'James' });\n });\n\n this.assertContent('MaxJames');\n }\n\n ['@test empty content in trusted curlies [GH#14978]']() {\n this.render('before {{{value}}} after', {\n value: 'hello'\n });\n\n this.assertContent('before hello after');\n\n this.runTask(() => this.rerender());\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', undefined));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', null));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', ''));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('')));\n\n this.assertContent('before after');\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertContent('before hello after');\n }\n });\n\n (0, _testCase.moduleFor)('Dynamic content tests (integration)', class extends _testCase.RenderingTest {\n ['@test it can render a dynamic template']() {\n let template = `\n
\n

Welcome to {{framework}}

\n
\n
\n

Why you should use {{framework}}?

\n
    \n
  1. It's great
  2. \n
  3. It's awesome
  4. \n
  5. It's {{framework}}
  6. \n
\n
\n
\n {{framework}} is free, open source and always will be.\n
\n `;\n\n let ember = `\n
\n

Welcome to Ember.js

\n
\n
\n

Why you should use Ember.js?

\n
    \n
  1. It's great
  2. \n
  3. It's awesome
  4. \n
  5. It's Ember.js
  6. \n
\n
\n
\n Ember.js is free, open source and always will be.\n
\n `;\n\n let react = `\n
\n

Welcome to React

\n
\n
\n

Why you should use React?

\n
    \n
  1. It's great
  2. \n
  3. It's awesome
  4. \n
  5. It's React
  6. \n
\n
\n
\n React is free, open source and always will be.\n
\n `;\n\n this.render(template, {\n framework: 'Ember.js'\n });\n this.assertHTML(ember);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(ember);\n\n this.runTask(() => (0, _metal.set)(this.context, 'framework', 'React'));\n\n this.assertHTML(react);\n\n this.runTask(() => (0, _metal.set)(this.context, 'framework', 'Ember.js'));\n\n this.assertHTML(ember);\n }\n\n ['@test it should evaluate to nothing if part of the path is `undefined`']() {\n this.render('{{foo.bar.baz.bizz}}', {\n foo: {}\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hey!' } }\n }));\n\n this.assertText('Hey!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hello!' } }\n }));\n\n this.assertText('Hello!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n\n ['@test it should evaluate to nothing if part of the path is a primative']() {\n this.render('{{foo.bar.baz.bizz}}', {\n foo: { bar: true }\n });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: false\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: 'Haha'\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: null\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: undefined\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: 1\n }));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: { baz: { bizz: 'Hello!' } }\n }));\n\n this.assertText('Hello!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {\n bar: true\n }));\n\n this.assertText('');\n }\n\n ['@test can set dynamic href']() {\n this.render('Example', {\n model: {\n url: 'http://example.com'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.url', 'http://linkedin.com'));\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://linkedin.com' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { url: 'http://example.com' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: { href: 'http://example.com' }\n });\n }\n\n ['@test quoteless class attributes update correctly']() {\n this.render('
hello
', {\n fooBar: true\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n this.assertElement(this.firstChild, { tagName: 'div', content: 'hello' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n }\n\n ['@test quoted class attributes update correctly'](assert) {\n this.render('
hello
', {\n fooBar: true\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', false));\n\n assert.equal(this.firstChild.className, '');\n\n this.runTask(() => (0, _metal.set)(this.context, 'fooBar', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo-bar') }\n });\n }\n\n ['@test unquoted class attribute can contain multiple classes']() {\n this.render('
hello
', {\n model: {\n classes: 'foo bar baz'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { classes: 'foo bar baz' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n }\n\n ['@test unquoted class attribute']() {\n this.render('
hello
', {\n model: {\n foo: 'foo'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'foo' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n }\n\n ['@test quoted class attribute']() {\n this.render('
hello
', {\n model: {\n foo: 'foo'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'foo' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo') }\n });\n }\n\n ['@test quoted class attribute can contain multiple classes']() {\n this.render('
hello
', {\n model: {\n classes: 'foo bar baz'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { classes: 'foo bar baz' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar baz') }\n });\n }\n\n ['@test class attribute concats bound values']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar',\n bizz: 'bizz'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar bizz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bar bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', null));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('fizz bizz') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar',\n bizz: 'bizz'\n }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar bizz') }\n });\n }\n\n ['@test class attribute accepts nested helpers, and updates']() {\n this.render(`
hello
`, {\n model: {\n size: 'large',\n hasSize: true,\n hasShape: false,\n shape: 'round'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.hasShape', true));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large round') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.hasSize', false));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('round') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n size: 'large',\n hasSize: true,\n hasShape: false,\n shape: 'round'\n }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('large') }\n });\n }\n\n ['@test Multiple dynamic classes']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar',\n fizz: 'fizz',\n baz: 'baz'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.foo', null);\n (0, _metal.set)(this.context, 'model.fizz', null);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('bar baz') }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar',\n fizz: 'fizz',\n baz: 'baz'\n });\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: (0, _testHelpers.classes)('foo bar fizz baz') }\n });\n }\n\n ['@test classes are ordered: See issue #9912']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar'\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.bar', null);\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static ' }\n });\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar'\n });\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: { class: 'foo static bar' }\n });\n }\n });\n\n let warnings, originalWarn;\n class StyleTest extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n warnings = [];\n originalWarn = (0, _debug.getDebugFunction)('warn');\n (0, _debug.setDebugFunction)('warn', function (message, test) {\n if (!test) {\n warnings.push(message);\n }\n });\n }\n\n teardown() {\n super.teardown(...arguments);\n (0, _debug.setDebugFunction)('warn', originalWarn);\n }\n\n assertStyleWarning(style) {\n this.assert.deepEqual(warnings, [(0, _views.constructStyleDeprecationMessage)(style)]);\n }\n\n assertNoWarning() {\n this.assert.deepEqual(warnings, []);\n }\n }\n\n (0, _testCase.moduleFor)('Inline style tests', class extends StyleTest {\n ['@test can set dynamic style']() {\n this.render('
', {\n model: {\n style: (0, _helpers.htmlSafe)('width: 60px;')\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', 'height: 60px;'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'height: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', null));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {}\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { style: 'width: 60px;' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n }\n\n ['@test can set dynamic style with -html-safe']() {\n this.render('
', {\n model: {\n style: (0, _helpers.htmlSafe)('width: 60px;')\n }\n });\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.style', 'height: 60px;'));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'height: 60px;' }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { style: 'width: 60px;' }));\n\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: { style: 'width: 60px;' }\n });\n }\n });\n\n if (!EmberDev.runningProdBuild) {\n (0, _testCase.moduleFor)('Inline style tests - warnings', class extends StyleTest {\n ['@test specifying
generates a warning']() {\n let userValue = 'width: 42px';\n this.render('
', {\n userValue\n });\n\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `attributeBindings: [\"style\"]` generates a warning']() {\n let FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['style']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n let userValue = 'width: 42px';\n this.render('{{foo-bar style=userValue}}', {\n userValue\n });\n\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `
` works properly without a warning']() {\n this.render('
', {\n userValue: 'width: 42px'\n });\n\n this.assertNoWarning();\n }\n\n ['@test specifying `
` works properly with a SafeString']() {\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n\n this.assertNoWarning();\n }\n\n ['@test null value do not generate htmlsafe warning']() {\n this.render('
', {\n userValue: null\n });\n\n this.assertNoWarning();\n }\n\n ['@test undefined value do not generate htmlsafe warning']() {\n this.render('
');\n\n this.assertNoWarning();\n }\n\n ['@test no warnings are triggered when using `-html-safe`']() {\n this.render('
', {\n userValue: 'width: 42px'\n });\n\n this.assertNoWarning();\n }\n\n ['@test no warnings are triggered when a safe string is quoted']() {\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n\n this.assertNoWarning();\n }\n\n ['@test binding warning is triggered when an unsafe string is quoted']() {\n let userValue = 'width: 42px';\n this.render('
', {\n userValue\n });\n\n this.assertStyleWarning(userValue);\n }\n\n ['@test binding warning is triggered when a safe string for a complete property is concatenated in place']() {\n let userValue = 'width: 42px';\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n\n this.assertStyleWarning(`color: green; ${userValue}`);\n }\n\n ['@test binding warning is triggered when a safe string for a value is concatenated in place']() {\n let userValue = '42px';\n this.render('
', {\n userValue: new _helpers.SafeString(userValue)\n });\n\n this.assertStyleWarning(`color: green; width: ${userValue}`);\n }\n\n ['@test binding warning is triggered when a safe string for a property name is concatenated in place']() {\n let userValue = 'width';\n this.render('
', {\n userProperty: new _helpers.SafeString(userValue)\n });\n\n this.assertStyleWarning(`color: green; ${userValue}: 42px`);\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/custom-component-manager-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/metal', '@ember/-internals/glimmer'], function (_testCase, _runtime, _metal, _glimmer) {\n 'use strict';\n\n if (true /* GLIMMER_CUSTOM_COMPONENT_MANAGER */) {\n class ComponentManagerTest extends _testCase.RenderingTest {\n constructor(assert) {\n super(...arguments);\n\n this.registerComponentManager('basic', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent(factory, args) {\n return factory.create({ args });\n },\n\n updateComponent(component, args) {\n (0, _metal.set)(component, 'args', args);\n },\n\n getContext(component) {\n return component;\n }\n }));\n\n this.registerComponentManager('instrumented-full', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4', {\n destructor: true,\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({ args });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent(component) {\n assert.step('didCreateComponent');\n component.didRender();\n },\n\n didUpdateComponent(component) {\n assert.step('didUpdateComponent');\n component.didUpdate();\n }\n }));\n }\n }\n\n (0, _testCase.moduleFor)('Component Manager - Curly Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{greeting}} world

`,\n ComponentClass\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`

hello world

`);\n }\n\n ['@test it can have no template context']() {\n this.registerComponentManager('pseudo-template-only', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent() {\n return null;\n },\n\n updateComponent() {},\n\n getContext() {\n return null;\n }\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('pseudo-template-only', {});\n\n this.registerComponent('foo-bar', {\n template: `

{{@greeting}} world

`,\n ComponentClass\n });\n\n this.render('{{foo-bar greeting=\"hello\"}}');\n\n this.assertHTML(`

hello world

`);\n }\n\n ['@test it can discover component manager through inheritance - ES Classes']() {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent(Factory, args) {\n return new Factory(args);\n },\n\n updateComponent() {},\n\n getContext(component) {\n return component;\n }\n }));\n\n class Base {}\n (0, _glimmer.setComponentManager)('test', Base);\n class Child extends Base {}\n class Grandchild extends Child {\n constructor() {\n super();\n this.name = 'grandchild';\n }\n }\n\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can discover component manager through inheritance - Ember Object']() {\n let Parent = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend());\n let Child = Parent.extend();\n let Grandchild = Child.extend({\n init() {\n this._super(...arguments);\n this.name = 'grandchild';\n }\n });\n\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can customize the template context']() {\n let customContext = {\n greeting: 'goodbye'\n };\n\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4'),\n\n createComponent(factory) {\n return factory.create();\n },\n\n getContext() {\n return customContext;\n },\n\n updateComponent() {}\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello',\n count: 1234\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{greeting}} world {{count}}

`,\n ComponentClass\n });\n\n this.render('{{foo-bar}}');\n\n this.assertHTML(`

goodbye world

`);\n\n this.runTask(() => (0, _metal.set)(customContext, 'greeting', 'sayonara'));\n\n this.assertHTML(`

sayonara world

`);\n }\n\n ['@test it can set arguments on the component instance']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{salutation}}

`,\n ComponentClass\n });\n\n this.render('{{foo-bar firstName=\"Yehuda\" lastName=\"Katz\"}}');\n\n this.assertHTML(`

Yehuda Katz

`);\n }\n\n ['@test arguments are updated if they change']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{salutation}}

`,\n ComponentClass\n });\n\n this.render('{{foo-bar firstName=firstName lastName=lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n\n this.assertHTML(`

Yehuda Katz

`);\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n\n this.assertHTML(`

Chad Hietala

`);\n }\n\n ['@test it can opt-in to running destructor'](assert) {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4', {\n destructor: true\n }),\n\n createComponent(factory) {\n assert.step('createComponent');\n return factory.create();\n },\n\n getContext(component) {\n return component;\n },\n\n updateComponent() {},\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n }\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello',\n destroy() {\n assert.step('component.destroy()');\n this._super(...arguments);\n }\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{greeting}} world

`,\n ComponentClass\n });\n\n this.render('{{#if show}}{{foo-bar}}{{/if}}', { show: true });\n\n this.assertHTML(`

hello world

`);\n\n this.runTask(() => this.context.set('show', false));\n\n this.assertText('');\n\n assert.verifySteps(['createComponent', 'destroyComponent', 'component.destroy()']);\n }\n\n ['@test it can opt-in to running async lifecycle hooks'](assert) {\n this.registerComponentManager('test', _runtime.Object.extend({\n capabilities: (0, _glimmer.capabilities)('3.4', {\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({ args });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent() {\n assert.step('didCreateComponent');\n },\n\n didUpdateComponent() {\n assert.step('didUpdateComponent');\n }\n }));\n\n let ComponentClass = (0, _glimmer.setComponentManager)('test', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{greeting}} {{@name}}

`,\n ComponentClass\n });\n\n this.render('{{foo-bar name=name}}', { name: 'world' });\n\n this.assertHTML(`

hello world

`);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n\n this.runTask(() => this.context.set('name', 'max'));\n this.assertHTML(`

hello max

`);\n assert.verifySteps(['updateComponent', 'didUpdateComponent']);\n }\n });\n\n if (true /* EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION */) {\n (0, _testCase.moduleFor)('Component Manager - Angle Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n greeting: 'hello'\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{greeting}} world

`,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

hello world

`);\n }\n\n ['@test it can set arguments on the component instance']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{salutation}}

`,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

Yehuda Katz

`);\n }\n\n ['@test it can pass attributes']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend());\n\n this.registerComponent('foo-bar', {\n template: `

Hello world!

`,\n ComponentClass\n });\n\n this.render('');\n\n this.assertHTML(`

Hello world!

`);\n }\n\n ['@test arguments are updated if they change']() {\n let ComponentClass = (0, _glimmer.setComponentManager)('basic', _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n\n this.registerComponent('foo-bar', {\n template: `

{{salutation}}

`,\n ComponentClass\n });\n\n this.render('', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n\n this.assertHTML(`

Yehuda Katz

`);\n\n this.runTask(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n\n this.assertHTML(`

Chad Hietala

`);\n }\n\n ['@test updating attributes triggers didUpdateComponent'](assert) {\n let ComponentClass = (0, _glimmer.setComponentManager)('instrumented-full', _runtime.Object.extend({\n didRender() {},\n didUpdate() {}\n }));\n\n this.registerComponent('foo-bar', {\n template: `

Hello world!

`,\n ComponentClass\n });\n\n this.render('', { value: 'foo' });\n\n this.assertHTML(`

Hello world!

`);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n\n this.runTask(() => this.context.set('value', 'bar'));\n assert.verifySteps(['didUpdateComponent']);\n }\n });\n }\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/event-dispatcher-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/runloop', '@ember/instrumentation', '@ember/-internals/views', '@ember/-internals/utils'], function (_testCase, _helpers, _runloop, _instrumentation, _views, _utils) {\n 'use strict';\n\n let canDataTransfer = !!document.createEvent('HTMLEvents').dataTransfer;\n\n function fireNativeWithDataTransfer(node, type, dataTransfer) {\n let event = document.createEvent('HTMLEvents');\n event.initEvent(type, true, true);\n event.dataTransfer = dataTransfer;\n node.dispatchEvent(event);\n }\n\n (0, _testCase.moduleFor)('EventDispatcher', class extends _testCase.RenderingTest {\n ['@test events bubble view hierarchy for form elements'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#is-done').trigger('change'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test case insensitive events'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-bar}}`);\n\n this.runTask(() => this.$('#is-done').trigger('click'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test case sensitive events'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-bar}}`);\n\n this.runTask(() => this.$('#is-done').trigger('click'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test events bubble to parent view'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {}\n }),\n template: ``\n });\n\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n\n this.runTask(() => this.$('#is-done').trigger('change'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test events bubbling up can be prevented'](assert) {\n let hasReceivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n hasReceivedEvent = true;\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {\n return false;\n }\n }),\n template: ``\n });\n\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n\n this.runTask(() => this.$('#is-done').trigger('change'));\n assert.notOk(hasReceivedEvent, 'change event has not been received');\n }\n\n ['@test event handlers are wrapped in a run loop'](assert) {\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n assert.ok((0, _runloop.getCurrentRunLoop)(), 'a run loop should have started');\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('#is-done').trigger('click');\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `
`\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // mouse moves over #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: outer });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, outer);\n\n // mouse moves over #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseover', { relatedTarget: outer });\n this.$(outer).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was not triggered again');\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseout', { relatedTarget: outer });\n this.$(outer).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 0, 'mouseleave event was not triggered');\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: outer });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, outer);\n }\n\n ['@test delegated event listeners work for mouseEnter on SVG elements'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'svg',\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // mouse moves over #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: outer });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, outer);\n\n // mouse moves over #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseover', { relatedTarget: outer });\n this.$(outer).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was not triggered again');\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(inner).trigger('mouseout', { relatedTarget: outer });\n this.$(outer).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 0, 'mouseleave event was not triggered');\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(outer).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: outer });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, outer);\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave with skipped events'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `
`\n });\n\n this.render(`{{x-foo id=\"outer\"}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // we replicate fast mouse movement, where mouseover is fired directly in #inner, skipping #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, inner);\n\n // mouse moves out of #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: inner });\n });\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, inner);\n }\n\n ['@test delegated event listeners work for mouseEnter/Leave with skipped events and subcomponent'](assert) {\n let receivedEnterEvents = [];\n let receivedLeaveEvents = [];\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n mouseEnter(event) {\n receivedEnterEvents.push(event);\n },\n mouseLeave(event) {\n receivedLeaveEvents.push(event);\n }\n }),\n template: `{{yield}}`\n });\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend(),\n template: ``\n });\n\n this.render(`{{#x-outer id=\"outer\"}}{{x-inner id=\"inner\"}}{{/x-outer}}`);\n\n let parent = this.element;\n let outer = this.$('#outer')[0];\n let inner = this.$('#inner')[0];\n\n // we replicate fast mouse movement, where mouseover is fired directly in #inner, skipping #outer\n this.runTask(() => {\n this.$(outer).trigger('mouseenter', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseover', { relatedTarget: parent });\n this.$(parent).trigger('mouseout', { relatedTarget: inner });\n });\n assert.equal(receivedEnterEvents.length, 1, 'mouseenter event was triggered');\n assert.strictEqual(receivedEnterEvents[0].target, inner);\n\n // mouse moves out of #inner\n this.runTask(() => {\n this.$(outer).trigger('mouseleave', { canBubble: false, relatedTarget: parent });\n this.$(inner).trigger('mouseout', { relatedTarget: parent });\n this.$(parent).trigger('mouseover', { relatedTarget: inner });\n });\n\n assert.equal(receivedLeaveEvents.length, 1, 'mouseleave event was triggered');\n assert.strictEqual(receivedLeaveEvents[0].target, inner);\n }\n });\n\n (0, _testCase.moduleFor)('EventDispatcher#setup', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n let dispatcher = this.owner.lookup('event_dispatcher:main');\n (0, _runloop.run)(dispatcher, 'destroy');\n this.owner.__container__.reset('event_dispatcher:main');\n this.dispatcher = this.owner.lookup('event_dispatcher:main');\n }\n\n ['@test additional events can be specified'](assert) {\n this.dispatcher.setup({ myevent: 'myEvent' });\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n myEvent() {\n assert.ok(true, 'custom event was triggered');\n }\n }),\n template: `

Hello!

`\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('div').trigger('myevent');\n }\n\n ['@test a rootElement can be specified'](assert) {\n this.element.innerHTML = '
';\n // this.$().append('
');\n this.dispatcher.setup({ myevent: 'myEvent' }, '#app');\n\n assert.ok(this.$('#app').hasClass('ember-application'), 'custom rootElement was used');\n assert.equal(this.dispatcher.rootElement, '#app', 'the dispatchers rootElement was updated');\n }\n\n ['@test default events can be disabled via `customEvents`'](assert) {\n this.dispatcher.setup({ click: null });\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click() {\n assert.ok(false, 'click method was called');\n },\n\n null() {\n assert.ok(false, 'null method was called');\n },\n\n doubleClick() {\n assert.ok(true, 'a non-disabled event is still handled properly');\n }\n }),\n\n template: `

Hello!

`\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('div').trigger('click');\n this.$('div').trigger('dblclick');\n }\n\n ['@test throws if specified rootElement does not exist'](assert) {\n assert.throws(() => {\n this.dispatcher.setup({ myevent: 'myEvent' }, '#app');\n });\n }\n });\n\n if (false /* EMBER_IMPROVED_INSTRUMENTATION */) {\n (0, _testCase.moduleFor)('EventDispatcher - Instrumentation', class extends _testCase.RenderingTest {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test instruments triggered events'](assert) {\n let clicked = 0;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click() {\n clicked++;\n }\n }),\n template: `

hello

`\n });\n\n this.render(`{{x-foo}}`);\n\n this.$('div').trigger('click');\n\n assert.equal(clicked, 1, 'precond - the click handler was invoked');\n\n let clickInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.click', {\n before() {\n clickInstrumented++;\n assert.equal(clicked, 1, 'invoked before event is handled');\n },\n after() {\n clickInstrumented++;\n assert.equal(clicked, 2, 'invoked after event is handled');\n }\n });\n\n let keypressInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.keypress', {\n before() {\n keypressInstrumented++;\n },\n after() {\n keypressInstrumented++;\n }\n });\n\n this.$('div').trigger('click');\n this.$('div').trigger('change');\n assert.equal(clicked, 2, 'precond - The click handler was invoked');\n assert.equal(clickInstrumented, 2, 'The click was instrumented');\n assert.strictEqual(keypressInstrumented, 0, 'The keypress was not instrumented');\n }\n });\n }\n\n if (canDataTransfer) {\n (0, _testCase.moduleFor)('EventDispatcher - Event Properties', class extends _testCase.RenderingTest {\n ['@test dataTransfer property is added to drop event'](assert) {\n let receivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n drop(event) {\n receivedEvent = event;\n }\n })\n });\n\n this.render(`{{x-foo}}`);\n\n fireNativeWithDataTransfer(this.$('div')[0], 'drop', 'success');\n assert.equal(receivedEvent.dataTransfer, 'success');\n }\n });\n }\n\n if (_views.jQueryDisabled) {\n (0, _testCase.moduleFor)('EventDispatcher#native-events', class extends _testCase.RenderingTest {\n ['@test native events are passed when jQuery is not present'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n assert.ok(receivedEvent, 'click event was triggered');\n assert.notOk(receivedEvent.originalEvent, 'event is not a jQuery.Event');\n }\n });\n } else {\n (0, _testCase.moduleFor)('EventDispatcher#jquery-events', class extends _testCase.RenderingTest {\n beforeEach() {\n this.jqueryIntegration = window.ENV._JQUERY_INTEGRATION;\n }\n\n afterEach() {\n window.ENV._JQUERY_INTEGRATION = this.jqueryIntegration;\n }\n\n ['@test jQuery events are passed when jQuery is present'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n assert.ok(receivedEvent, 'click event was triggered');\n assert.ok(receivedEvent instanceof _views.jQuery.Event, 'event is a jQuery.Event');\n }\n\n [`@${_utils.HAS_NATIVE_PROXY ? 'test' : 'skip'} accessing jQuery.Event#originalEvent is deprecated`](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectDeprecation(() => {\n let { originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of originalEvent are available');\n }, 'Accessing jQuery.Event specific properties is deprecated. Either use the ember-jquery-legacy addon to normalize events to native events, or explicitly opt into jQuery integration using @ember/optional-features.');\n }\n\n ['@test other jQuery.Event properties do not trigger deprecation'](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n receivedEvent.stopPropagation();\n receivedEvent.stopImmediatePropagation();\n receivedEvent.preventDefault();\n assert.ok(receivedEvent.bubbles, 'properties of jQuery event are available');\n assert.equal(receivedEvent.type, 'click', 'properties of jQuery event are available');\n });\n }\n\n ['@test accessing jQuery.Event#originalEvent does not trigger deprecations when jquery integration is explicitly enabled'](assert) {\n let receivedEvent;\n window.ENV._JQUERY_INTEGRATION = true;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n let { originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of originalEvent are available');\n });\n }\n\n [`@${_utils.HAS_NATIVE_PROXY && true /* DEBUG */ ? 'test' : 'skip'} accessing jQuery.Event#__originalEvent does not trigger deprecations to support ember-jquery-legacy`](assert) {\n let receivedEvent;\n\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click(event) {\n receivedEvent = event;\n }\n }),\n template: ``\n });\n\n this.render(`{{x-foo}}`);\n\n this.runTask(() => this.$('#foo').click());\n expectNoDeprecation(() => {\n let { __originalEvent: originalEvent } = receivedEvent;\n assert.ok(originalEvent, 'jQuery event has __originalEvent property');\n assert.equal(originalEvent.type, 'click', 'properties of __originalEvent are available');\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/-class-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/metal'], function (_testCase, _testHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{-class}}', class extends _testCase.RenderingTest {\n ['@test casts binding to dasherized class']() {\n this.registerComponent('foo-bar', { template: '' });\n this.render(`{{foo-bar class=(-class someTruth \"someTruth\")}}`, {\n someTruth: true\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'someTruth', true));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n }\n\n ['@tests casts leaf path of binding to dasherized class']() {\n this.registerComponent('foo-bar', { template: '' });\n this.render(`{{foo-bar class=(-class model.someTruth \"someTruth\")}}`, {\n model: {\n someTruth: true\n }\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => this.rerender());\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.someTruth', false));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('ember-view') }\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { someTruth: true }));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: (0, _testHelpers.classes)('some-truth ember-view') }\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/closure-action-test', ['@ember/instrumentation', '@ember/runloop', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_instrumentation, _runloop, _metal, _testCase, _abstractTestCase, _helpers) {\n 'use strict';\n\n if (false /* EMBER_IMPROVED_INSTRUMENTATION */) {\n (0, _testCase.moduleFor)('Helpers test: closure {{action}} improved instrumentation', class extends _testCase.RenderingTest {\n subscribe(eventName, options) {\n this.subscriber = (0, _instrumentation.subscribe)(eventName, options);\n }\n\n teardown() {\n if (this.subscriber) {\n (0, _instrumentation.unsubscribe)(this.subscriber);\n }\n\n super.teardown();\n }\n\n ['@test interaction event subscriber should be passed parameters']() {\n let actionParam = 'So krispy';\n let beforeParameters = [];\n let afterParameters = [];\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n this.attrs.submit(actionParam);\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {}\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.args);\n },\n after(name, timestamp, payload) {\n afterParameters.push(payload.args);\n }\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\n\n this.assert.deepEqual(beforeParameters, [[], [actionParam]], 'instrumentation subscriber before function was passed closure action parameters');\n this.assert.deepEqual(afterParameters, [[actionParam], []], 'instrumentation subscriber after function was passed closure action parameters');\n }\n\n ['@test interaction event subscriber should be passed target']() {\n let beforeParameters = [];\n let afterParameters = [];\n\n let InnerComponent = _helpers.Component.extend({\n myProperty: 'inner-thing',\n actions: {\n fireAction() {\n this.attrs.submit();\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n myProperty: 'outer-thing',\n outerSubmit() {}\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.target.get('myProperty'));\n },\n after(name, timestamp, payload) {\n afterParameters.push(payload.target.get('myProperty'));\n }\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\n\n this.assert.deepEqual(beforeParameters, ['inner-thing', 'outer-thing'], 'instrumentation subscriber before function was passed target');\n this.assert.deepEqual(afterParameters, ['outer-thing', 'inner-thing'], 'instrumentation subscriber after function was passed target');\n }\n\n ['@test instrumented action should return value']() {\n let returnedValue = 'Chris P is so krispy';\n let actualReturnedValue;\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n actualReturnedValue = this.attrs.submit();\n }\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return returnedValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: ''\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.subscribe('interaction.ember-action', {\n before() {},\n after() {}\n });\n\n this.render(`{{outer-component}}`);\n\n this.runTask(() => {\n this.$('#instrument-button').trigger('click');\n });\n\n this.assert.equal(actualReturnedValue, returnedValue, 'action can return to caller');\n }\n });\n }\n\n (0, _testCase.moduleFor)('Helpers test: closure {{action}}', class extends _testCase.RenderingTest {\n ['@test action should be called']() {\n let outerActionCalled = false;\n let component;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n outerActionCalled = true;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n component.fireAction();\n });\n\n this.assert.ok(outerActionCalled, 'the action was called');\n }\n\n ['@test an error is triggered when bound action function is undefined']() {\n this.registerComponent('inner-component', {\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n template: '{{inner-component submit=(action somethingThatIsUndefined)}}'\n });\n\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /Action passed is null or undefined in \\(action[^)]*\\) from .*\\./);\n }\n\n ['@test an error is triggered when bound action being passed in is a non-function']() {\n this.registerComponent('inner-component', {\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n nonFunctionThing: {}\n }),\n template: '{{inner-component submit=(action nonFunctionThing)}}'\n });\n\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action could not be made for `.*` in .*\\. Please confirm that you are using either a quoted action name \\(i\\.e\\. `\\(action '.*'\\)`\\) or a function available in .*\\./);\n }\n\n ['@test [#12718] a nice error is shown when a bound action function is undefined and it is passed as attrs.foo']() {\n this.registerComponent('inner-component', {\n template: ''\n });\n\n this.registerComponent('outer-component', {\n template: '{{inner-component}}'\n });\n\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /Action passed is null or undefined in \\(action[^)]*\\) from .*\\./);\n }\n\n ['@test action value is returned']() {\n let expectedValue = 'terrible tom';\n let returnedValue;\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n returnedValue = this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return expectedValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(returnedValue, expectedValue, 'action can return to caller');\n }\n\n ['@test action should be called on the correct scope']() {\n let innerComponent;\n let outerComponent;\n let actualComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n isOuterComponent: true,\n outerSubmit() {\n actualComponent = this;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action outerSubmit)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualComponent, outerComponent, 'action has the correct context');\n this.assert.ok(actualComponent.isOuterComponent, 'action has the correct context');\n }\n\n ['@test arguments to action are passed, curry']() {\n let first = 'mitch';\n let second = 'martin';\n let third = 'matt';\n let fourth = 'wacky wycats';\n\n let innerComponent;\n let actualArgs;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(fourth);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n third,\n outerSubmit() {\n // eslint-disable-line no-unused-vars\n actualArgs = [...arguments];\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (action outerSubmit \"${first}\") \"${second}\" third)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.deepEqual(actualArgs, [first, second, third, fourth], 'action has the correct args');\n }\n\n ['@test `this` can be passed as an argument']() {\n let value = {};\n let component;\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n outerAction(incomingValue) {\n value = incomingValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action \"outerAction\" this)}}'\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.strictEqual(value, component, 'the component is passed at `this`');\n }\n\n ['@test arguments to action are bound']() {\n let value = 'lazy leah';\n\n let innerComponent;\n let outerComponent;\n let actualArg;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n value: '',\n outerSubmit(incomingValue) {\n actualArg = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerSubmit value)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.strictEqual(actualArg, '', 'action has the correct first arg');\n\n this.runTask(() => {\n outerComponent.set('value', value);\n });\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.strictEqual(actualArg, value, 'action has the correct first arg');\n }\n\n ['@test array arguments are passed correctly to action']() {\n let first = 'foo';\n let second = [3, 5];\n let third = [4, 9];\n\n let actualFirst;\n let actualSecond;\n let actualThird;\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(second, third);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerSubmit(incomingFirst, incomingSecond, incomingThird) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n actualThird = incomingThird;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerSubmit first)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n outerComponent.set('first', first);\n outerComponent.set('second', second);\n });\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualFirst, first, 'action has the correct first arg');\n this.assert.equal(actualSecond, second, 'action has the correct second arg');\n this.assert.equal(actualThird, third, 'action has the correct third arg');\n }\n\n ['@test mut values can be wrapped in actions, are settable']() {\n let newValue = 'trollin trek';\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit(newValue);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut outerMut))}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(outerComponent.get('outerMut'), newValue, 'mut value is set');\n }\n\n ['@test mut values can be wrapped in actions, are settable with a curry']() {\n let newValue = 'trollin trek';\n\n let innerComponent;\n let outerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outerComponent = this;\n },\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut outerMut) '${newValue}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(outerComponent.get('outerMut'), newValue, 'mut value is set');\n }\n\n ['@test action can create closures over actions']() {\n let first = 'raging robert';\n let second = 'mild machty';\n let returnValue = 'butch brian';\n\n let actualFirst;\n let actualSecond;\n let actualReturnedValue;\n\n let innerComponent;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n actualReturnedValue = this.attrs.submit(second);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' '${first}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualReturnedValue, returnValue, 'return value is present');\n this.assert.equal(actualFirst, first, 'first argument is correct');\n this.assert.equal(actualSecond, second, 'second argument is correct');\n }\n\n ['@test provides a helpful error if an action is not present']() {\n let InnerComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n something() {\n // this is present to ensure `actions` hash is present\n // a different error is triggered if `actions` is missing\n // completely\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\n\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action named 'doesNotExist' was not found in /);\n }\n\n ['@test provides a helpful error if actions hash is not present']() {\n let InnerComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({});\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\n\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action named 'doesNotExist' was not found in /);\n }\n\n ['@test action can create closures over actions with target']() {\n let innerComponent;\n let actionCalled = false;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n otherComponent: (0, _metal.computed)(function () {\n return {\n actions: {\n outerAction() {\n actionCalled = true;\n }\n }\n };\n })\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' target=otherComponent)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.ok(actionCalled, 'action called on otherComponent');\n }\n\n ['@test value can be used with action over actions']() {\n let newValue = 'yelping yehuda';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerContent: {\n readProp: newValue\n },\n actions: {\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualValue, newValue, 'value is read');\n }\n\n ['@test action will read the value of a first property']() {\n let newValue = 'irate igor';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerAction value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualValue, newValue, 'property is read');\n }\n\n ['@test action will read the value of a curried first argument property']() {\n let newValue = 'kissing kris';\n\n let innerComponent;\n let actualValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n objectArgument: {\n readProp: newValue\n },\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action outerAction objectArgument value=\"readProp\")}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actualValue, newValue, 'property is read');\n }\n\n ['@test action closure does not get auto-mut wrapped'](assert) {\n let first = 'raging robert';\n let second = 'mild machty';\n let returnValue = 'butch brian';\n\n let innerComponent;\n let actualFirst;\n let actualSecond;\n let actualReturnedValue;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.get('submit')(second);\n this.get('attrs-submit')(second);\n let attrsSubmitReturnValue = this.attrs['attrs-submit'](second);\n let submitReturnValue = this.attrs.submit(second);\n\n assert.equal(attrsSubmitReturnValue, submitReturnValue, 'both attrs.foo and foo should behave the same');\n\n return submitReturnValue;\n }\n });\n\n let MiddleComponent = _helpers.Component.extend({});\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: `{{inner-component attrs-submit=attrs.submit submit=submit}}`\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{middle-component submit=(action 'outerAction' '${first}')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n actualReturnedValue = innerComponent.fireAction();\n });\n\n this.assert.equal(actualFirst, first, 'first argument is correct');\n this.assert.equal(actualSecond, second, 'second argument is correct');\n this.assert.equal(actualReturnedValue, returnValue, 'return value is present');\n }\n\n ['@test action should be called within a run loop']() {\n let innerComponent;\n let capturedRunLoop;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n this.attrs.submit();\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n submit() {\n capturedRunLoop = (0, _runloop.getCurrentRunLoop)();\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'submit')}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.ok(capturedRunLoop, 'action is called within a run loop');\n }\n\n ['@test objects that define INVOKE can be casted to actions']() {\n let innerComponent;\n let actionArgs;\n let invokableArgs;\n\n let InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n innerComponent = this;\n },\n fireAction() {\n actionArgs = this.attrs.submit(4, 5, 6);\n }\n });\n\n let OuterComponent = _helpers.Component.extend({\n foo: 123,\n submitTask: (0, _metal.computed)(function () {\n return {\n [_helpers.INVOKE]: (...args) => {\n invokableArgs = args;\n return this.foo;\n }\n };\n })\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action submitTask 1 2 3)}}`\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n innerComponent.fireAction();\n });\n\n this.assert.equal(actionArgs, 123);\n this.assert.deepEqual(invokableArgs, [1, 2, 3, 4, 5, 6]);\n }\n\n ['@test closure action with `(mut undefinedThing)` works properly [GH#13959]']() {\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n label: undefined,\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assertText('Click me');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', 'Dun clicked');\n });\n\n this.assertText('Dun clicked');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', undefined);\n });\n\n this.assertText('Click me');\n }\n\n ['@test closure actions does not cause component hooks to fire unnecessarily [GH#14305] [GH#14654]'](assert) {\n let clicked = 0;\n let didReceiveAttrsFired = 0;\n\n let ClickMeComponent = _helpers.Component.extend({\n tagName: 'button',\n\n click() {\n this.get('onClick').call(undefined, ++clicked);\n },\n\n didReceiveAttrs() {\n didReceiveAttrsFired++;\n }\n });\n\n this.registerComponent('click-me', {\n ComponentClass: ClickMeComponent\n });\n\n let outer;\n\n let OuterComponent = _helpers.Component.extend({\n clicked: 0,\n\n actions: {\n 'on-click': function () {\n this.incrementProperty('clicked');\n }\n },\n\n init() {\n this._super();\n outer = this;\n this.set('onClick', () => this.incrementProperty('clicked'));\n }\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: _abstractTestCase.strip`\n
clicked: {{clicked}}; foo: {{foo}}
\n\n {{click-me id=\"string-action\" onClick=(action \"on-click\")}}\n {{click-me id=\"function-action\" onClick=(action onClick)}}\n {{click-me id=\"mut-action\" onClick=(action (mut clicked))}}\n `\n });\n\n this.render('{{outer-component foo=foo}}', { foo: 1 });\n\n this.assertText('clicked: 0; foo: 1');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.rerender());\n\n this.assertText('clicked: 0; foo: 1');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 2));\n\n this.assertText('clicked: 0; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#string-action').click());\n\n this.assertText('clicked: 1; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#function-action').click());\n\n this.assertText('clicked: 2; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => (0, _metal.set)(outer, 'onClick', function () {\n outer.incrementProperty('clicked');\n }));\n\n this.assertText('clicked: 2; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#function-action').click());\n\n this.assertText('clicked: 3; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n\n this.runTask(() => this.$('#mut-action').click());\n\n this.assertText('clicked: 4; foo: 2');\n\n assert.equal(didReceiveAttrsFired, 3);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/concat-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{concat}}', class extends _testCase.RenderingTest {\n ['@test it concats static arguments']() {\n this.render(`{{concat \"foo\" \" \" \"bar\" \" \" \"baz\"}}`);\n this.assertText('foo bar baz');\n }\n\n ['@test it updates for bound arguments']() {\n this.render(`{{concat model.first model.second}}`, {\n model: { first: 'one', second: 'two' }\n });\n\n this.assertText('onetwo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('onetwo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n\n this.assertText('threetwo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.second', 'four'));\n\n this.assertText('threefour');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { first: 'one', second: 'two' }));\n\n this.assertText('onetwo');\n }\n\n ['@test it can be used as a sub-expression']() {\n this.render(`{{concat (concat model.first model.second) (concat model.third model.fourth)}}`, {\n model: {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n }\n });\n\n this.assertText('onetwothreefour');\n\n this.runTask(() => this.rerender());\n\n this.assertText('onetwothreefour');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'five'));\n\n this.assertText('fivetwothreefour');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model.second', 'six');\n (0, _metal.set)(this.context, 'model.third', 'seven');\n });\n\n this.assertText('fivesixsevenfour');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n });\n });\n\n this.assertText('onetwothreefour');\n }\n\n ['@test it can be used as input for other helpers']() {\n this.registerHelper('x-eq', ([actual, expected]) => actual === expected);\n\n this.render(`{{#if (x-eq (concat model.first model.second) \"onetwo\")}}Truthy!{{else}}False{{/if}}`, {\n model: {\n first: 'one',\n second: 'two'\n }\n });\n\n this.assertText('Truthy!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Truthy!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n\n this.assertText('False');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { first: 'one', second: 'two' }));\n\n this.assertText('Truthy!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/metal'], function (_testCase, _internalTestHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: custom helpers', class extends _testCase.RenderingTest {\n ['@test it cannot override built-in syntax']() {\n this.registerHelper('if', () => 'Nope');\n expectAssertion(() => {\n this.render(`{{if foo 'LOL'}}`, { foo: true });\n }, /You attempted to overwrite the built-in helper \\\"if\\\" which is not allowed. Please rename the helper./);\n }\n\n ['@test it can resolve custom simple helpers with or without dashes']() {\n this.registerHelper('hello', () => 'hello');\n this.registerHelper('hello-world', () => 'hello world');\n\n this.render('{{hello}} | {{hello-world}}');\n\n this.assertText('hello | hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello | hello world');\n }\n\n ['@test it does not resolve helpers with a `.` (period)']() {\n this.registerHelper('hello.world', () => 'hello world');\n\n this.render('{{hello.world}}', {\n hello: {\n world: ''\n }\n });\n\n this.assertText('');\n\n this.assertStableRerender();\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'hello', { world: 'hello world!' }));\n\n this.assertText('hello world!');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'hello', {\n world: ''\n });\n });\n\n this.assertText('');\n }\n\n ['@test it can resolve custom class-based helpers with or without dashes']() {\n this.registerHelper('hello', {\n compute() {\n return 'hello';\n }\n });\n\n this.registerHelper('hello-world', {\n compute() {\n return 'hello world';\n }\n });\n\n this.render('{{hello}} | {{hello-world}}');\n\n this.assertText('hello | hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello | hello world');\n }\n\n ['@test throws if `this._super` is not called from `init`']() {\n this.registerHelper('hello-world', {\n init() {}\n });\n\n expectAssertion(() => {\n this.render('{{hello-world}}');\n }, /You must call `this._super\\(...arguments\\);` when overriding `init` on a framework object. Please update .* to call `this._super\\(...arguments\\);` from `init`./);\n }\n\n ['@test class-based helper can recompute a new value'](assert) {\n let destroyCount = 0;\n let computeCount = 0;\n let helper;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return ++computeCount;\n },\n destroy() {\n destroyCount++;\n this._super();\n }\n });\n\n this.render('{{hello-world}}');\n\n this.assertText('1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('1');\n\n this.runTask(() => helper.recompute());\n\n this.assertText('2');\n\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n }\n\n ['@test class-based helper with static arguments can recompute a new value'](assert) {\n let destroyCount = 0;\n let computeCount = 0;\n let helper;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return ++computeCount;\n },\n destroy() {\n destroyCount++;\n this._super();\n }\n });\n\n this.render('{{hello-world \"whut\"}}');\n\n this.assertText('1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('1');\n\n this.runTask(() => helper.recompute());\n\n this.assertText('2');\n\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n }\n\n ['@test helper params can be returned']() {\n this.registerHelper('hello-world', values => {\n return values;\n });\n\n this.render('{{#each (hello-world model) as |item|}}({{item}}){{/each}}', {\n model: ['bob']\n });\n\n this.assertText('(bob)');\n }\n\n ['@test helper hash can be returned']() {\n this.registerHelper('hello-world', (_, hash) => {\n return hash.model;\n });\n\n this.render(`{{get (hello-world model=model) 'name'}}`, {\n model: { name: 'bob' }\n });\n\n this.assertText('bob');\n }\n\n ['@test simple helper is called for param changes'](assert) {\n let computeCount = 0;\n\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return `${value}-value`;\n });\n\n this.render('{{hello-world model.name}}', {\n model: { name: 'bob' }\n });\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('sal-value');\n\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob' }));\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 3, 'compute is called exactly 3 times');\n }\n\n ['@test class-based helper compute is called for param changes'](assert) {\n let createCount = 0;\n let computeCount = 0;\n\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n createCount++;\n },\n compute([value]) {\n computeCount++;\n return `${value}-value`;\n }\n });\n\n this.render('{{hello-world model.name}}', {\n model: { name: 'bob' }\n });\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('sal-value');\n\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob' }));\n\n this.assertText('bob-value');\n\n assert.strictEqual(computeCount, 3, 'compute is called exactly 3 times');\n assert.strictEqual(createCount, 1, 'helper is only created once');\n }\n\n ['@test simple helper receives params, hash']() {\n this.registerHelper('hello-world', (_params, _hash) => {\n return `params: ${JSON.stringify(_params)}, hash: ${JSON.stringify(_hash)}`;\n });\n\n this.render('{{hello-world model.name \"rich\" first=model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => this.rerender());\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.age', 28));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob', age: 42 }));\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n }\n\n ['@test class-based helper receives params, hash']() {\n this.registerHelper('hello-world', {\n compute(_params, _hash) {\n return `params: ${JSON.stringify(_params)}, hash: ${JSON.stringify(_hash)}`;\n }\n });\n\n this.render('{{hello-world model.name \"rich\" first=model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => this.rerender());\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.age', 28));\n\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'bob', age: 42 }));\n\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n }\n\n ['@test class-based helper usable in subexpressions']() {\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n });\n\n this.render(`{{join-words \"Who\"\n (join-words \"overcomes\" \"by\")\n model.reason\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`, { model: { reason: 'force' } });\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.reason', 'Nickleback'));\n\n this.assertText('Who overcomes by Nickleback hath overcome but half his foe');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { reason: 'force' }));\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test parameterless helper is usable in subexpressions']() {\n this.registerHelper('should-show', () => {\n return true;\n });\n\n this.render(`{{#if (should-show)}}true{{/if}}`);\n\n this.assertText('true');\n\n this.runTask(() => this.rerender());\n\n this.assertText('true');\n }\n\n ['@test parameterless helper is usable in attributes']() {\n this.registerHelper('foo-bar', () => {\n return 'baz';\n });\n\n this.render(`
`);\n\n this.assertHTML('
');\n\n this.runTask(() => this.rerender());\n\n this.assertHTML('
');\n }\n\n ['@test simple helper not usable with a block']() {\n this.registerHelper('some-helper', () => {});\n\n expectAssertion(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Helpers may not be used in the block form/);\n }\n\n ['@test class-based helper not usable with a block']() {\n this.registerHelper('some-helper', {\n compute() {}\n });\n\n expectAssertion(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Helpers may not be used in the block form/);\n }\n\n ['@test simple helper not usable within element']() {\n this.registerHelper('some-helper', () => {});\n\n this.assert.throws(() => {\n this.render(`
`);\n }, /Compile Error some-helper is not a modifier: Helpers may not be used in the element form/);\n }\n\n ['@test class-based helper not usable within element']() {\n this.registerHelper('some-helper', {\n compute() {}\n });\n\n this.assert.throws(() => {\n this.render(`
`);\n }, /Compile Error some-helper is not a modifier: Helpers may not be used in the element form/);\n }\n\n ['@test class-based helper is torn down'](assert) {\n let destroyCalled = 0;\n\n this.registerHelper('some-helper', {\n destroy() {\n destroyCalled++;\n this._super(...arguments);\n },\n compute() {\n return 'must define a compute';\n }\n });\n\n this.render(`{{some-helper}}`);\n\n (0, _internalTestHelpers.runDestroy)(this.component);\n\n assert.strictEqual(destroyCalled, 1, 'destroy called once');\n }\n\n ['@test class-based helper used in subexpression can recompute']() {\n let helper;\n let phrase = 'overcomes by';\n\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return phrase;\n }\n });\n\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n });\n\n this.render(`{{join-words \"Who\"\n (dynamic-segment)\n \"force\"\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`);\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n phrase = 'believes his';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who believes his force hath overcome but half his foe');\n\n phrase = 'overcomes by';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test class-based helper used in subexpression can recompute component']() {\n let helper;\n let phrase = 'overcomes by';\n\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n helper = this;\n },\n compute() {\n return phrase;\n }\n });\n\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n });\n\n this.registerComponent('some-component', {\n template: '{{first}} {{second}} {{third}} {{fourth}} {{fifth}}'\n });\n\n this.render(`{{some-component first=\"Who\"\n second=(dynamic-segment)\n third=\"force\"\n fourth=(join-words (join-words \"hath overcome but\" \"half\"))\n fifth=(join-words \"his\" (join-words \"foe\"))}}`);\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n\n phrase = 'believes his';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who believes his force hath overcome but half his foe');\n\n phrase = 'overcomes by';\n\n this.runTask(() => helper.recompute());\n\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test class-based helper used in subexpression is destroyed'](assert) {\n let destroyCount = 0;\n\n this.registerHelper('dynamic-segment', {\n phrase: 'overcomes by',\n init() {\n this._super(...arguments);\n },\n compute() {\n return this.phrase;\n },\n destroy() {\n destroyCount++;\n this._super(...arguments);\n }\n });\n\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n });\n\n this.render(`{{join-words \"Who\"\n (dynamic-segment)\n \"force\"\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`);\n\n (0, _internalTestHelpers.runDestroy)(this.component);\n\n assert.equal(destroyCount, 1, 'destroy is called after a view is destroyed');\n }\n\n ['@test simple helper can be invoked manually via `owner.factoryFor(...).create().compute()'](assert) {\n this.registerHelper('some-helper', () => {\n assert.ok(true, 'some-helper helper invoked');\n return 'lolol';\n });\n\n let instance = this.owner.factoryFor('helper:some-helper').create();\n\n assert.equal(typeof instance.compute, 'function', 'expected instance.compute to be present');\n assert.equal(instance.compute(), 'lolol', 'can invoke `.compute`');\n }\n\n ['@test class-based helper can be invoked manually via `owner.factoryFor(...).create().compute()'](assert) {\n this.registerHelper('some-helper', {\n compute() {\n assert.ok(true, 'some-helper helper invoked');\n return 'lolol';\n }\n });\n\n let instance = this.owner.factoryFor('helper:some-helper').create();\n\n assert.equal(typeof instance.compute, 'function', 'expected instance.compute to be present');\n assert.equal(instance.compute(), 'lolol', 'can invoke `.compute`');\n }\n }); /* globals EmberDev */\n\n\n if (!EmberDev.runningProdBuild) {\n class HelperMutatingArgsTests extends _testCase.RenderingTest {\n buildCompute() {\n return (params, hash) => {\n this.assert.throws(() => {\n params.push('foo');\n\n // cannot assert error message as it varies by platform\n });\n\n this.assert.throws(() => {\n hash.foo = 'bar';\n\n // cannot assert error message as it varies by platform\n });\n\n this.assert.throws(() => {\n hash.someUnusedHashProperty = 'bar';\n\n // cannot assert error message as it varies by platform\n });\n };\n }\n\n ['@test cannot mutate params - no positional specified / named specified']() {\n this.render('{{test-helper foo=bar}}', { bar: 'derp' });\n }\n\n ['@test cannot mutate params - positional specified / no named specified']() {\n this.render('{{test-helper bar}}', { bar: 'derp' });\n }\n\n ['@test cannot mutate params - positional specified / named specified']() {\n this.render('{{test-helper bar foo=qux}}', { bar: 'derp', qux: 'baz' });\n }\n\n ['@test cannot mutate params - no positional specified / no named specified']() {\n this.render('{{test-helper}}', { bar: 'derp', qux: 'baz' });\n }\n }\n\n (0, _testCase.moduleFor)('Helpers test: mutation triggers errors - class based helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n\n let compute = this.buildCompute();\n\n this.registerHelper('test-helper', {\n compute\n });\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: mutation triggers errors - simple helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n\n let compute = this.buildCompute();\n\n this.registerHelper('test-helper', compute);\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/element-action-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/instrumentation', '@ember/-internals/runtime', '@ember/-internals/views'], function (_testCase, _abstractTestCase, _helpers, _metal, _instrumentation, _runtime, _views) {\n 'use strict';\n\n function getActionAttributes(element) {\n let attributes = element.attributes;\n let actionAttrs = [];\n\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes.item(i);\n\n if (attr.name.indexOf('data-ember-action-') === 0) {\n actionAttrs.push(attr.name);\n }\n }\n\n return actionAttrs;\n }\n\n function getActionIds(element) {\n return getActionAttributes(element).map(attribute => attribute.slice('data-ember-action-'.length));\n }\n\n const isIE11 = !window.ActiveXObject && 'ActiveXObject' in window;\n\n if (false /* EMBER_IMPROVED_INSTRUMENTATION */) {\n (0, _testCase.moduleFor)('Helpers test: element action instrumentation', class extends _testCase.RenderingTest {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test action should fire interaction event with proper params']() {\n let subscriberCallCount = 0;\n let subscriberPayload = null;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n (0, _instrumentation.subscribe)('interaction.ember-action', {\n before() {\n subscriberCallCount++;\n },\n after(name, time, payload) {\n subscriberPayload = payload;\n }\n });\n\n this.render('{{example-component}}');\n\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(subscriberCallCount, 1, 'subscriber has been called 1 time');\n this.assert.equal(subscriberPayload.name, 'foo', 'subscriber called with correct name');\n this.assert.equal(subscriberPayload.args[0], 'bar', 'subscriber called with correct args');\n }\n });\n }\n\n (0, _testCase.moduleFor)('Helpers test: element action', class extends _testCase.RenderingTest {\n ['@test it can call an action on its enclosing component']() {\n let fooCallCount = 0;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {\n fooCallCount++;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(fooCallCount, 1, 'foo has been called 1 time');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(fooCallCount, 2, 'foo has been called 2 times');\n }\n\n ['@test it can call an action with parameters']() {\n let fooArgs = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n member: 'a',\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n foo(thing) {\n fooArgs.push(thing);\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n\n this.runTask(() => this.rerender());\n\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.deepEqual(fooArgs, ['a'], 'foo has not been called');\n\n this.runTask(() => {\n component.set('member', 'b');\n });\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.deepEqual(fooArgs, ['a', 'b'], 'foo has been called with an updated value');\n }\n\n ['@test it should output a marker attribute with a guid']() {\n this.render('');\n\n let button = this.$('button');\n\n let attributes = getActionAttributes(button[0]);\n\n this.assert.ok(button.attr('data-ember-action').match(''), 'An empty data-ember-action attribute was added');\n this.assert.ok(attributes[0].match(/data-ember-action-\\d+/), 'A data-ember-action-xyz attribute with a guid was added');\n }\n\n ['@test it should allow alternative events to be handled']() {\n let showCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#show').trigger('mouseup');\n });\n\n this.assert.ok(showCalled, 'show action was called on mouseUp');\n }\n\n ['@test inside a yield, the target points at the original target']() {\n let targetWatted = false;\n let innerWatted = false;\n\n let TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n }\n });\n\n let InnerComponent = _helpers.Component.extend({\n actions: {\n wat() {\n innerWatted = true;\n }\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '{{yield}}'\n });\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: _abstractTestCase.strip`\n {{#inner-component}}\n \n {{/inner-component}}\n `\n });\n\n this.render('{{target-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.ok(targetWatted, 'the correct target was watted');\n this.assert.notOk(innerWatted, 'the inner target was not watted');\n }\n\n ['@test it should allow a target to be specified']() {\n let targetWatted = false;\n\n let TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n }\n });\n\n let OtherComponent = _helpers.Component.extend({});\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n\n this.registerComponent('other-component', {\n ComponentClass: OtherComponent,\n template: 'Wat?'\n });\n\n this.render(_abstractTestCase.strip`\n {{#target-component as |parent|}}\n {{other-component anotherTarget=parent}}\n {{/target-component}}\n `);\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(targetWatted, true, 'the specified target was watted');\n }\n\n ['@test it should lazily evaluate the target']() {\n let firstEdit = 0;\n let secondEdit = 0;\n let component;\n\n let first = {\n edit() {\n firstEdit++;\n }\n };\n\n let second = {\n edit() {\n secondEdit++;\n }\n };\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n theTarget: first\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Edit'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(firstEdit, 1);\n\n this.runTask(() => {\n (0, _metal.set)(component, 'theTarget', second);\n });\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(firstEdit, 1);\n this.assert.equal(secondEdit, 1);\n }\n\n ['@test it should register an event handler']() {\n let editHandlerWasCalled = false;\n let shortcutHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me
click me too
'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n this.runTask(() => {\n this.$('div[data-ember-action]').trigger('click', { ctrlKey: true });\n });\n\n this.assert.equal(shortcutHandlerWasCalled, true, 'the \"any\" shortcut\\'s event handler was called');\n }\n\n ['@test it handles whitelisted bound modifier keys']() {\n let editHandlerWasCalled = false;\n let shortcutHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n altKey: 'alt',\n anyKey: 'any',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me
click me too
'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n this.runTask(() => {\n this.$('div[data-ember-action]').trigger('click', { ctrlKey: true });\n });\n\n this.assert.equal(shortcutHandlerWasCalled, true, 'the \"any\" shortcut\\'s event handler was called');\n }\n\n ['@test it handles whitelisted bound modifier keys with current value']() {\n let editHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n acceptedKeys: 'alt',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a[data-ember-action]').trigger('click', { altKey: true });\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n\n editHandlerWasCalled = false;\n\n this.runTask(() => {\n component.set('acceptedKeys', '');\n });\n\n this.runTask(() => {\n this.$('div[data-ember-action]').click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the event handler was not called');\n }\n\n ['@test should be able to use action more than once for the same event within a view']() {\n let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called (due to bubbling)');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called (due to bubbling)');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the event should not bubble if `bubbles=false` is passed']() {\n let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the event should not bubble if `bubbles=false` is passed bound']() {\n let editHandlerWasCalled = false;\n let deleteHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n isFalse: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n delete() {\n deleteHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'editdelete'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('#delete').click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n this.wrap(component.element).click();\n });\n\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the bubbling depends on the bound parameter']() {\n let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n shouldBubble: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n\n editHandlerWasCalled = originalHandlerWasCalled = false;\n\n this.runTask(() => {\n component.set('shouldBubble', true);\n });\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test it should work properly in an #each block']() {\n let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n items: (0, _runtime.A)([1, 2, 3, 4]),\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each items as |item|}}click me{{/each}}'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n }\n\n ['@test it should work properly in a {{#with foo as |bar|}} block']() {\n let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n something: { ohai: 'there' },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#with something as |somethingElse|}}click me{{/with}}'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n }\n\n ['@test it should unregister event handlers when an element action is removed'](assert) {\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#if isActive}}click me{{/if}}'\n });\n\n this.render('{{example-component isActive=isActive}}', {\n isActive: true\n });\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n\n let actionId;\n\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n\n assert.ok(_views.ActionManager.registeredActions[actionId], 'An action is registered');\n\n this.runTask(() => this.rerender());\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is still present');\n\n assert.ok(_views.ActionManager.registeredActions[actionId], 'The action is still registered');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isActive', false));\n\n assert.strictEqual(this.$('a[data-ember-action]').length, 0, 'The element is removed');\n\n assert.ok(!_views.ActionManager.registeredActions[actionId], 'The action is unregistered');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isActive', true));\n\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n\n assert.ok(_views.ActionManager.registeredActions[actionId], 'A new action is registered');\n }\n\n ['@test it should capture events from child elements and allow them to trigger the action']() {\n let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.ok(editHandlerWasCalled, 'event on a child target triggered the action of its parent');\n }\n\n ['@test it should allow bubbling of events from action helper to original parent event']() {\n let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(editHandlerWasCalled && originalHandlerWasCalled, 'both event handlers were called');\n }\n\n ['@test it should not bubble an event from action helper to original parent event if `bubbles=false` is passed']() {\n let editHandlerWasCalled = false;\n let originalHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n },\n click() {\n originalHandlerWasCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(editHandlerWasCalled, 'the child event handler was called');\n this.assert.notOk(originalHandlerWasCalled, 'the parent handler was not called');\n }\n\n ['@test it should allow \"send\" as the action name (#594)']() {\n let sendHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n send() {\n sendHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(sendHandlerWasCalled, 'the event handler was called');\n }\n\n ['@test it should send the view, event, and current context to the action']() {\n let passedTarget;\n let passedContext;\n let targetThis;\n\n let TargetComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n targetThis = this;\n },\n actions: {\n edit(context) {\n passedTarget = this === targetThis;\n passedContext = context;\n }\n }\n });\n\n let aContext;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n aContext = this;\n }\n });\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: _abstractTestCase.strip`\n {{#target-component as |aTarget|}}\n click me\n {{/target-component}}\n `\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('#edit').click();\n });\n\n this.assert.ok(passedTarget, 'the action is called with the target as this');\n this.assert.strictEqual(passedContext, aContext, 'the parameter is passed along');\n }\n\n ['@test it should only trigger actions for the event they were registered on']() {\n let editHandlerWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me'\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(editHandlerWasCalled, 'the event handler was called on click');\n\n editHandlerWasCalled = false;\n\n this.runTask(() => {\n this.$('a').trigger('mouseover');\n });\n\n this.assert.notOk(editHandlerWasCalled, 'the event handler was not called on mouseover');\n }\n\n ['@test it should allow multiple contexts to be specified']() {\n let passedContexts;\n let models = [_runtime.Object.create(), _runtime.Object.create()];\n\n let ExampleComponent = _helpers.Component.extend({\n modelA: models[0],\n modelB: models[1],\n actions: {\n edit(...args) {\n passedContexts = args;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.deepEqual(passedContexts, models, 'the action was called with the passed contexts');\n }\n\n ['@test it should allow multiple contexts to be specified mixed with string args']() {\n let passedContexts;\n let model = _runtime.Object.create();\n\n let ExampleComponent = _helpers.Component.extend({\n model: model,\n actions: {\n edit(...args) {\n passedContexts = args;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.deepEqual(passedContexts, ['herp', model], 'the action was called with the passed contexts');\n }\n\n ['@test it should not trigger action with special clicks']() {\n let showCalled = false;\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n let assert = this.assert;\n\n let checkClick = (prop, value, expected) => {\n showCalled = false;\n let event = this.wrap(component.element).findAll('button').trigger('click', { [prop]: value })[0];\n if (expected) {\n assert.ok(showCalled, `should call action with ${prop}:${value}`);\n\n // IE11 does not allow simulated events to have a valid `defaultPrevented`\n if (!isIE11) {\n assert.ok(event.defaultPrevented, 'should prevent default');\n }\n } else {\n assert.notOk(showCalled, `should not call action with ${prop}:${value}`);\n assert.notOk(event.defaultPrevented, 'should not prevent default');\n }\n };\n\n checkClick('ctrlKey', true, false);\n checkClick('altKey', true, false);\n checkClick('metaKey', true, false);\n checkClick('shiftKey', true, false);\n\n checkClick('button', 0, true);\n checkClick('button', 1, false);\n checkClick('button', 2, false);\n checkClick('button', 3, false);\n checkClick('button', 4, false);\n }\n\n ['@test it can trigger actions for keyboard events']() {\n let showCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('input').trigger('keyup', { char: 'a', which: 65 });\n });\n\n this.assert.ok(showCalled, 'the action was called with keyup');\n }\n\n ['@test a quoteless parameter should allow dynamic lookup of the actionName']() {\n let lastAction;\n let actionOrder = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n hookMeUp: 'rock',\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Whistle tips go woop woooop'\n });\n\n this.render('{{example-component}}');\n\n let test = this;\n\n let testBoundAction = propertyValue => {\n test.runTask(() => {\n component.set('hookMeUp', propertyValue);\n });\n\n test.runTask(() => {\n this.wrap(component.element).findAll('#bound-param').click();\n });\n\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n\n this.assert.deepEqual(actionOrder, ['rock', 'paper', 'scissors'], 'action name was looked up properly');\n }\n\n ['@test a quoteless string parameter should resolve actionName, including path']() {\n let lastAction;\n let actionOrder = [];\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n },\n allactions: (0, _runtime.A)([{ title: 'Rock', name: 'rock' }, { title: 'Paper', name: 'paper' }, { title: 'Scissors', name: 'scissors' }]),\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each allactions as |allaction|}}{{allaction.title}}{{/each}}'\n });\n\n this.render('{{example-component}}');\n\n let test = this;\n\n let testBoundAction = propertyValue => {\n test.runTask(() => {\n this.wrap(component.element).findAll(`#${propertyValue}`).click();\n });\n\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n\n this.assert.deepEqual(actionOrder, ['rock', 'paper', 'scissors'], 'action name was looked up properly');\n }\n\n ['@test a quoteless function parameter should be called, including arguments']() {\n let submitCalled = false;\n let incomingArg;\n\n let arg = 'rough ray';\n\n let ExampleComponent = _helpers.Component.extend({\n submit(actualArg) {\n incomingArg = actualArg;\n submitCalled = true;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: `Hi`\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').click();\n });\n\n this.assert.ok(submitCalled, 'submit function called');\n this.assert.equal(incomingArg, arg, 'argument passed');\n }\n\n ['@test a quoteless parameter that does not resolve to a value asserts']() {\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n ohNoeNotValid() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n expectAssertion(() => {\n this.render('{{example-component}}');\n }, 'You specified a quoteless path, `ohNoeNotValid`, to the {{action}} helper ' + 'which did not resolve to an action name (a string). ' + 'Perhaps you meant to use a quoted actionName? (e.g. {{action \"ohNoeNotValid\"}}).');\n }\n\n ['@test allows multiple actions on a single element']() {\n let clickActionWasCalled = false;\n let doubleClickActionWasCalled = false;\n\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n clicked() {\n clickActionWasCalled = true;\n },\n doubleClicked() {\n doubleClickActionWasCalled = true;\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: _abstractTestCase.strip`\n click me`\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('a').trigger('click');\n });\n\n this.assert.ok(clickActionWasCalled, 'the clicked action was called');\n\n this.runTask(() => {\n this.$('a').trigger('dblclick');\n });\n\n this.assert.ok(doubleClickActionWasCalled, 'the doubleClicked action was called');\n }\n\n ['@test it should respect preventDefault option if provided']() {\n let ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n this.render('{{example-component}}');\n\n let event;\n\n this.runTask(() => {\n event = this.$('a').click()[0];\n });\n\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n }\n\n ['@test it should respect preventDefault option if provided bound']() {\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n shouldPreventDefault: false,\n init() {\n this._super(...arguments);\n component = this;\n },\n actions: {\n show() {}\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi'\n });\n\n this.render('{{example-component}}');\n\n let event;\n\n this.runTask(() => {\n event = this.$('a').trigger(event)[0];\n });\n\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n\n this.runTask(() => {\n component.set('shouldPreventDefault', true);\n event = this.$('a').trigger('click')[0];\n });\n\n // IE11 does not allow simulated events to have a valid `defaultPrevented`\n if (!isIE11) {\n this.assert.equal(event.defaultPrevented, true, 'should preventDefault');\n }\n }\n\n ['@test it should target the proper component when `action` is in yielded block [GH #12409]']() {\n let outerActionCalled = false;\n let innerClickCalled = false;\n\n let OuterComponent = _helpers.Component.extend({\n actions: {\n hey() {\n outerActionCalled = true;\n }\n }\n });\n\n let MiddleComponent = _helpers.Component.extend({});\n\n let InnerComponent = _helpers.Component.extend({\n click() {\n innerClickCalled = true;\n expectDeprecation(() => {\n this.sendAction();\n }, /You called (.*).sendAction\\((.*)\\) but Component#sendAction is deprecated. Please use closure actions instead./);\n }\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: _abstractTestCase.strip`\n {{#middle-component}}\n {{inner-component action=\"hey\"}}\n {{/middle-component}}\n `\n });\n\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: '{{yield}}'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: _abstractTestCase.strip`\n \n {{yield}}\n `\n });\n\n this.render('{{outer-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.ok(outerActionCalled, 'the action fired on the proper target');\n this.assert.ok(innerClickCalled, 'the click was triggered');\n }\n\n ['@test element action with (mut undefinedThing) works properly']() {\n let component;\n\n let ExampleComponent = _helpers.Component.extend({\n label: undefined,\n init() {\n this._super(...arguments);\n component = this;\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.assertText('Click me');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', 'Dun clicked');\n });\n\n this.assertText('Dun clicked');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assertText('Clicked!');\n\n this.runTask(() => {\n component.set('label', undefined);\n });\n\n this.assertText('Click me');\n }\n\n ['@test it supports non-registered actions [GH#14888]']() {\n this.render(`\n {{#if show}}\n \n {{/if}}\n `, { show: true });\n\n this.assert.equal(this.$('button').text().trim(), 'Show (true)');\n // We need to focus in to simulate an actual click.\n this.runTask(() => {\n document.getElementById('ddButton').focus();\n document.getElementById('ddButton').click();\n });\n }\n\n [\"@test action handler that shifts element attributes doesn't trigger multiple invocations\"]() {\n let actionCount = 0;\n let ExampleComponent = _helpers.Component.extend({\n selected: false,\n actions: {\n toggleSelected() {\n actionCount++;\n this.toggleProperty('selected');\n }\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ''\n });\n\n this.render('{{example-component}}');\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(actionCount, 1, 'Click action only fired once.');\n this.assert.ok(this.$('button').hasClass('selected'), \"Element with action handler has properly updated it's conditional class\");\n\n this.runTask(() => {\n this.$('button').click();\n });\n\n this.assert.equal(actionCount, 2, 'Second click action only fired once.');\n this.assert.ok(!this.$('button').hasClass('selected'), \"Element with action handler has properly updated it's conditional class\");\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/get-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{get}}', class extends _testCase.RenderingTest {\n ['@test should be able to get an object value with a static key']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors 'apple')}}]`, {\n colors: { apple: 'red' }\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple', 'green'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'red'\n }));\n\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with nested static key']() {\n this.render(`[{{get colors \"apple.gala\"}}] [{{if true (get colors \"apple.gala\")}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow'\n }\n }\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n\n this.assertText('[yellow and red striped] [yellow and red striped]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: { gala: 'red and yellow' } }));\n\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with a number']() {\n this.render(`[{{get items 1}}][{{get items 2}}][{{get items 3}}]`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n\n this.assertText('[Qux][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', { 1: 'First', 2: 'Second', 3: 'Third' }));\n\n this.assertText('[First][Second][Third]');\n }\n\n ['@test should be able to get an array value with a number']() {\n this.render(`[{{get numbers 0}}][{{get numbers 1}}][{{get numbers 2}}]`, {\n numbers: [1, 2, 3]\n });\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n\n this.assertText('[3][2][1]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [1, 2, 3]));\n\n this.assertText('[1][2][3]');\n }\n\n ['@test should be able to get an object value with a path evaluating to a number']() {\n this.render(`{{#each indexes as |index|}}[{{get items index}}]{{/each}}`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[First][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n\n this.assertText('[Qux][Second][Third]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', { 1: 'First', 2: 'Second', 3: 'Third' }));\n\n this.assertText('[First][Second][Third]');\n }\n\n ['@test should be able to get an array value with a path evaluating to a number']() {\n this.render(`{{#each numbers as |num index|}}[{{get numbers index}}]{{/each}}`, {\n numbers: [1, 2, 3]\n });\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[1][2][3]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n\n this.assertText('[3][2][1]');\n }\n\n ['@test should be able to get an object value with a bound/dynamic key']() {\n this.render(`[{{get colors key}}] [{{if true (get colors key)}}]`, {\n colors: { apple: 'red', banana: 'yellow' },\n key: 'apple'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: 'red' }));\n\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with nested dynamic key']() {\n this.render(`[{{get colors key}}] [{{if true (get colors key)}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n },\n banana: 'yellow'\n },\n key: 'apple.gala'\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.mcintosh'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with subexpression returning nested key']() {\n this.render(`[{{get colors (concat 'apple' '.' 'gala')}}] [{{if true (get colors (concat 'apple' '.' 'gala'))}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\n },\n key: 'apple.gala'\n });\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red and yellow] [red and yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n\n this.assertText('[yellow and red striped] [yellow and red striped]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow-redish'));\n\n this.assertText('[yellow-redish] [yellow-redish]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\n }));\n\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with a get helper as the key']() {\n this.render(`[{{get colors (get possibleKeys key)}}] [{{if true (get colors (get possibleKeys key))}}]`, {\n colors: { apple: 'red', banana: 'yellow' },\n key: 'key1',\n possibleKeys: { key1: 'apple', key2: 'banana' }\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key2'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key1'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: 'red', banana: 'yellow' }));\n\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with a get helper value as a bound/dynamic key']() {\n this.render(`[{{get (get possibleValues objectKey) key}}] [{{if true (get (get possibleValues objectKey) key)}}]`, {\n possibleValues: {\n colors1: { apple: 'red', banana: 'yellow' },\n colors2: { apple: 'green', banana: 'purple' }\n },\n objectKey: 'colors1',\n key: 'apple'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple'));\n }\n\n ['@test should be able to get an object value with a get helper as the value and a get helper as the key']() {\n this.render(`[{{get (get possibleValues objectKey) (get possibleKeys key)}}] [{{if true (get (get possibleValues objectKey) (get possibleKeys key))}}]`, {\n possibleValues: {\n colors1: { apple: 'red', banana: 'yellow' },\n colors2: { apple: 'green', banana: 'purple' }\n },\n objectKey: 'colors1',\n possibleKeys: {\n key1: 'apple',\n key2: 'banana'\n },\n key: 'key1'\n });\n\n this.assertText('[red] [red]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n\n this.assertText('[red] [red]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'key2'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n\n this.assertText('[purple] [purple]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'objectKey', 'colors1');\n (0, _metal.set)(this.context, 'key', 'key1');\n });\n\n this.assertText('[red] [red]');\n }\n\n ['@test the result of a get helper can be yielded']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.mcintosh = 'red';\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (get colors mcintosh)}}`\n });\n\n this.render(`{{#foo-bar colors=colors as |value|}}{{value}}{{/foo-bar}}`, {\n colors: {\n red: 'banana'\n }\n });\n\n this.assertText('banana');\n\n this.runTask(() => this.rerender());\n\n this.assertText('banana');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'yellow');\n (0, _metal.set)(this.context, 'colors', { yellow: 'bus' });\n });\n\n this.assertText('bus');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'red');\n (0, _metal.set)(this.context, 'colors', { red: 'banana' });\n });\n\n this.assertText('banana');\n }\n\n ['@test should handle object values as nulls']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors 'apple')}}]`, {\n colors: null\n });\n\n this.assertText('[] []');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[] []');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', { apple: 'green', banana: 'purple' }));\n\n this.assertText('[green] [green]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'colors', null));\n\n this.assertText('[] []');\n }\n\n ['@test should handle object keys as nulls']() {\n this.render(`[{{get colors key}}] [{{if true (get colors key)}}]`, {\n colors: {\n apple: 'red',\n banana: 'yellow'\n },\n key: null\n });\n\n this.assertText('[] []');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[] []');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n this.assertText('[yellow] [yellow]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', null));\n\n this.assertText('[] []');\n }\n\n ['@test should handle object values and keys as nulls']() {\n this.render(`[{{get colors 'apple'}}] [{{if true (get colors key)}}]`, {\n colors: null,\n key: null\n });\n\n this.assertText('[] []');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - static key'](assert) {\n this.render(`{{input type='text' value=(mut (get source 'banana')) id='get-input'}}`, {\n source: {\n banana: 'banana'\n }\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source', { banana: 'banana' }));\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - dynamic key'](assert) {\n this.render(`{{input type='text' value=(mut (get source key)) id='get-input'}}`, {\n source: {\n apple: 'apple',\n banana: 'banana'\n },\n key: 'banana'\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple'));\n\n assert.strictEqual(this.$('#get-input').val(), 'apple');\n\n this.runTask(() => this.$('#get-input').val('some other value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some other value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple'), 'some other value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'key', 'banana');\n (0, _metal.set)(this.context, 'source', { banana: 'banana' });\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using {{input}} and (mut) - dynamic nested key'](assert) {\n this.render(`{{input type='text' value=(mut (get source key)) id='get-input'}}`, {\n source: {\n apple: {\n gala: 'gala',\n mcintosh: 'mcintosh'\n },\n banana: 'banana'\n },\n key: 'apple.mcintosh'\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n\n this.runTask(() => this.rerender());\n\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n\n this.runTask(() => (0, _metal.set)(this.context, 'source.apple.mcintosh', 'red'));\n\n assert.strictEqual(this.$('#get-input').val(), 'red');\n\n this.runTask(() => this.$('#get-input').val('some value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple.mcintosh'), 'some value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n\n assert.strictEqual(this.$('#get-input').val(), 'gala');\n\n this.runTask(() => this.$('#get-input').val('some other value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'some other value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple.gala'), 'some other value');\n\n this.runTask(() => (0, _metal.set)(this.context, 'key', 'banana'));\n\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n\n this.runTask(() => this.$('#get-input').val('yet another value').trigger('change'));\n\n assert.strictEqual(this.$('#get-input').val(), 'yet another value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'yet another value');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'key', 'apple.mcintosh');\n (0, _metal.set)(this.context, 'source', {\n apple: {\n gala: 'gala',\n mcintosh: 'mcintosh'\n },\n banana: 'banana'\n });\n });\n\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/hash-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{hash}}', class extends _testCase.RenderingTest {\n ['@test returns a hash with the right key-value']() {\n this.render(`{{#with (hash name=\\\"Sergio\\\") as |person|}}{{person.name}}{{/with}}`);\n\n this.assertText('Sergio');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio');\n }\n\n ['@test can have more than one key-value']() {\n this.render(`{{#with (hash name=\"Sergio\" lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/with}}`);\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Sergio Arbeo');\n }\n\n ['@test binds values when variables are used']() {\n this.render(`{{#with (hash name=model.firstName lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/with}}`, {\n model: {\n firstName: 'Marisa'\n }\n });\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Marisa' }));\n\n this.assertText('Marisa Arbeo');\n }\n\n ['@test binds multiple values when variables are used']() {\n this.render(`{{#with (hash name=model.firstName lastName=model.lastName) as |person|}}{{person.name}} {{person.lastName}}{{/with}}`, {\n model: {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }\n });\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Marisa Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n\n this.assertText('Sergio Arbeo');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.lastName', 'Smith'));\n\n this.assertText('Sergio Smith');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }));\n\n this.assertText('Marisa Arbeo');\n }\n\n ['@test hash helpers can be nested']() {\n this.render(`{{#with (hash person=(hash name=model.firstName)) as |ctx|}}{{ctx.person.name}}{{/with}}`, {\n model: { firstName: 'Balint' }\n });\n\n this.assertText('Balint');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Balint');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Chad'));\n\n this.assertText('Chad');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Balint' }));\n\n this.assertText('Balint');\n }\n\n ['@test should yield hash of internal properties']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.model = { firstName: 'Chad' };\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=model.firstName)}}`\n });\n\n this.render(`{{#foo-bar as |values|}}{{values.firstName}}{{/foo-bar}}`);\n\n this.assertText('Chad');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Chad');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey'));\n\n this.assertText('Godfrey');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { firstName: 'Chad' }));\n\n this.assertText('Chad');\n }\n\n ['@test should yield hash of internal and external properties']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n fooBarInstance = this;\n this.model = { firstName: 'Chad' };\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=model.firstName lastName=lastName)}}`\n });\n\n this.render(`{{#foo-bar lastName=model.lastName as |values|}}{{values.firstName}} {{values.lastName}}{{/foo-bar}}`, {\n model: { lastName: 'Hietala' }\n });\n\n this.assertText('Chad Hietala');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Chad Hietala');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey');\n (0, _metal.set)(this.context, 'model.lastName', 'Chan');\n });\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => {\n (0, _metal.set)(fooBarInstance, 'model', { firstName: 'Chad' });\n (0, _metal.set)(this.context, 'model', { lastName: 'Hietala' });\n });\n\n this.assertText('Chad Hietala');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/if-unless-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_testCase, _sharedConditionalTests) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: inline {{if}}', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy} ${falsy}}}`;\n }\n\n ['@test it raises when there are more than three arguments']() {\n expectAssertion(() => {\n this.render(`{{if condition 'a' 'b' 'c'}}`, { condition: true });\n }, `The inline form of the 'if' helper expects two or three arguments. ('-top-level' @ L1:C0) `);\n }\n\n ['@test it raises when there are less than two arguments']() {\n expectAssertion(() => {\n this.render(`{{if condition}}`, { condition: true });\n }, `The inline form of the 'if' helper expects two or three arguments. ('-top-level' @ L1:C0) `);\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{if}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if (if ${cond} ${cond} false) ${truthy} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{if}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if (if ${cond} true ${cond}) ${truthy} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{if}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `(if ${cond} ${truthy} ${falsy})`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{if}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy} ${falsy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: inline {{if}} and {{unless}} without the inverse argument', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{if ${cond} ${truthy}}}{{unless ${cond} ${falsy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: inline {{unless}}', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless ${cond} ${falsy} ${truthy}}}`;\n }\n\n ['@test it raises when there are more than three arguments']() {\n expectAssertion(() => {\n this.render(`{{unless condition 'a' 'b' 'c'}}`, { condition: true });\n }, /The inline form of the `unless` helper expects two or three arguments/);\n }\n\n ['@test it raises when there are less than two arguments']() {\n expectAssertion(() => {\n this.render(`{{unless condition}}`, { condition: true });\n }, /The inline form of the `unless` helper expects two or three arguments/);\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{unless}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless (unless ${cond} false ${cond}) ${falsy} ${truthy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: nested {{unless}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{unless (unless ${cond} ${cond} true) ${falsy} ${truthy}}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{unless}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `(unless ${cond} ${falsy} ${truthy})`;\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{unless}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
`;\n }\n\n templateFor({ cond, truthy, falsy }) {\n return `{{unless ${cond} ${falsy} ${truthy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/input-test', ['@ember/polyfills', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/views'], function (_polyfills, _metal, _helpers, _testCase, _internalTestHelpers, _views) {\n 'use strict';\n\n class InputRenderingTest extends _testCase.RenderingTest {\n $input() {\n return this.$('input');\n }\n\n inputID() {\n return this.$input().prop('id');\n }\n\n assertDisabled() {\n this.assert.ok(this.$('input').prop('disabled'), 'The input is disabled');\n }\n\n assertNotDisabled() {\n this.assert.ok(this.$('input').is(':not(:disabled)'), 'The input is not disabled');\n }\n\n assertInputId(expectedId) {\n this.assert.equal(this.inputID(), expectedId, 'the input id should be `expectedId`');\n }\n\n assertSingleInput() {\n this.assert.equal(this.$('input').length, 1, 'A single text field was inserted');\n }\n\n assertSingleCheckbox() {\n this.assert.equal(this.$('input[type=checkbox]').length, 1, 'A single checkbox is added');\n }\n\n assertCheckboxIsChecked() {\n this.assert.equal(this.$input().prop('checked'), true, 'the checkbox is checked');\n }\n\n assertCheckboxIsNotChecked() {\n this.assert.equal(this.$input().prop('checked'), false, 'the checkbox is not checked');\n }\n\n assertValue(expected) {\n this.assert.equal(this.$input().val(), expected, `the input value should be ${expected}`);\n }\n\n assertAttr(name, expected) {\n this.assert.equal(this.$input().attr(name), expected, `the input ${name} attribute has the value '${expected}'`);\n }\n\n assertAllAttrs(names, expected) {\n names.forEach(name => this.assertAttr(name, expected));\n }\n\n assertSelectionRange(start, end) {\n let input = this.$input()[0];\n this.assert.equal(input.selectionStart, start, `the cursor start position should be ${start}`);\n this.assert.equal(input.selectionEnd, end, `the cursor end position should be ${end}`);\n }\n\n triggerEvent(type, options) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n\n let element = this.$input()[0];\n this.runTask(() => {\n element.dispatchEvent(event);\n });\n }\n }\n\n (0, _testCase.moduleFor)('Helpers test: {{input}}', class extends InputRenderingTest {\n ['@test a single text field is inserted into the DOM']() {\n this.render(`{{input type=\"text\" value=value}}`, { value: 'hello' });\n\n let id = this.inputID();\n\n this.assertValue('hello');\n this.assertSingleInput();\n\n this.runTask(() => this.rerender());\n\n this.assertValue('hello');\n this.assertSingleInput();\n this.assertInputId(id);\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'goodbye'));\n\n this.assertValue('goodbye');\n this.assertSingleInput();\n this.assertInputId(id);\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', 'hello'));\n\n this.assertValue('hello');\n this.assertSingleInput();\n this.assertInputId(id);\n }\n\n ['@test default type']() {\n this.render(`{{input}}`);\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'text');\n }\n\n ['@test dynamic attributes']() {\n this.render(`\n {{input type=\"text\"\n disabled=disabled\n value=value\n placeholder=placeholder\n name=name\n maxlength=maxlength\n minlength=minlength\n size=size\n tabindex=tabindex\n }}`, {\n disabled: false,\n value: 'Original value',\n placeholder: 'Original placeholder',\n name: 'original-name',\n maxlength: 10,\n minlength: 5,\n size: 20,\n tabindex: 30\n });\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'value', 'Updated value');\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'placeholder', 'Updated placeholder');\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'maxlength', 11);\n (0, _metal.set)(this.context, 'minlength', 6);\n // set(this.context, 'size', 21); //NOTE: failing in IE (TEST_SUITE=sauce)\n // set(this.context, 'tabindex', 31); //NOTE: failing in IE (TEST_SUITE=sauce)\n });\n\n this.assertDisabled();\n this.assertValue('Updated value');\n this.assertAttr('placeholder', 'Updated placeholder');\n this.assertAttr('name', 'updated-name');\n this.assertAttr('maxlength', '11');\n this.assertAttr('minlength', '6');\n // this.assertAttr('size', '21'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '31'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'value', 'Original value');\n (0, _metal.set)(this.context, 'disabled', false);\n (0, _metal.set)(this.context, 'placeholder', 'Original placeholder');\n (0, _metal.set)(this.context, 'name', 'original-name');\n (0, _metal.set)(this.context, 'maxlength', 10);\n (0, _metal.set)(this.context, 'minlength', 5);\n // set(this.context, 'size', 20); //NOTE: failing in IE (TEST_SUITE=sauce)\n // set(this.context, 'tabindex', 30); //NOTE: failing in IE (TEST_SUITE=sauce)\n });\n\n this.assertNotDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n }\n\n ['@test static attributes']() {\n this.render(`\n {{input type=\"text\"\n disabled=true\n value=\"Original value\"\n placeholder=\"Original placeholder\"\n name=\"original-name\"\n maxlength=10\n minlength=5\n size=20\n tabindex=30\n }}`);\n\n this.assertDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n this.assertDisabled();\n this.assertValue('Original value');\n this.assertAttr('placeholder', 'Original placeholder');\n this.assertAttr('name', 'original-name');\n this.assertAttr('maxlength', '10');\n this.assertAttr('minlength', '5');\n // this.assertAttr('size', '20'); //NOTE: failing in IE (TEST_SUITE=sauce)\n // this.assertAttr('tabindex', '30'); //NOTE: failing in IE (TEST_SUITE=sauce)\n }\n\n ['@test cursor selection range']() {\n // Modifying input.selectionStart, which is utilized in the cursor tests,\n // causes an event in Safari.\n (0, _internalTestHelpers.runDestroy)(this.owner.lookup('event_dispatcher:main'));\n\n this.render(`{{input type=\"text\" value=value}}`, { value: 'original' });\n\n let input = this.$input()[0];\n\n // See https://ember-twiddle.com/33e506329f8176ae874422644d4cc08c?openFiles=components.input-component.js%2Ctemplates.components.input-component.hbs\n // this.assertSelectionRange(8, 8); //NOTE: this is (0, 0) on Firefox (TEST_SUITE=sauce)\n\n this.runTask(() => this.rerender());\n\n // this.assertSelectionRange(8, 8); //NOTE: this is (0, 0) on Firefox (TEST_SUITE=sauce)\n\n this.runTask(() => {\n input.selectionStart = 2;\n input.selectionEnd = 4;\n });\n\n this.assertSelectionRange(2, 4);\n\n this.runTask(() => this.rerender());\n\n this.assertSelectionRange(2, 4);\n\n // this.runTask(() => set(this.context, 'value', 'updated'));\n //\n // this.assertSelectionRange(7, 7); //NOTE: this fails in IE, the range is 0 -> 0 (TEST_SUITE=sauce)\n //\n // this.runTask(() => set(this.context, 'value', 'original'));\n //\n // this.assertSelectionRange(8, 8); //NOTE: this fails in IE, the range is 0 -> 0 (TEST_SUITE=sauce)\n }\n\n ['@test [DEPRECATED] sends an action with `{{input enter=\"foo\"}}` when is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input enter='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed.');\n }\n }\n });\n }, 'Please refactor `{{input enter=\"foo\"}}` to `{{input enter=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 13 });\n }, 'Passing actions to components as strings (like {{input enter=\"foo\"}}) is deprecated. Please use closure actions instead ({{input enter=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input enter=(action \"foo\")}}` when is pressed'](assert) {\n assert.expect(2);\n this.render(`{{input enter=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', {\n keyCode: 13\n });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-press=\"foo\"}}` is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input value=value key-press='foo'}}`, {\n value: 'initial',\n\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-press=\"foo\"}}` to `{{input key-press=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keypress', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-press=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-press=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input key-press=(action \"foo\")}}` is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input value=value key-press=(action 'foo')}}`, {\n value: 'initial',\n\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keypress', { keyCode: 65 });\n }\n\n ['@test sends an action to the parent level when `bubbles=true` is provided'](assert) {\n assert.expect(1);\n\n let ParentComponent = _helpers.Component.extend({\n change() {\n assert.ok(true, 'bubbled upwards');\n }\n });\n\n this.registerComponent('x-parent', {\n ComponentClass: ParentComponent,\n template: `{{input bubbles=true}}`\n });\n this.render(`{{x-parent}}`);\n\n this.triggerEvent('change');\n }\n\n ['@test triggers `focus-in` when focused'](assert) {\n let wasFocused = false;\n\n this.render(`{{input focus-in=(action 'foo')}}`, {\n actions: {\n foo() {\n wasFocused = true;\n }\n }\n });\n\n this.runTask(() => {\n this.$input().focus();\n });\n\n assert.ok(wasFocused, 'action was triggered');\n }\n\n ['@test sends `insert-newline` when is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input insert-newline=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', {\n keyCode: 13\n });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input escape-press=\"foo\"}}` when is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input escape-press='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input escape-press=\"foo\"}}` to `{{input escape-press=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 27 });\n }, 'Passing actions to components as strings (like {{input escape-press=\"foo\"}}) is deprecated. Please use closure actions instead ({{input escape-press=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input escape-press=(action \"foo\")}}` when is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input escape-press=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keyup', { keyCode: 27 });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-down=\"foo\"}}` when a key is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input key-down='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-down=\"foo\"}}` to `{{input key-down=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keydown', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-down=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-down=(action \"foo\")}})');\n }\n\n ['@test sends an action with `{{input key-down=(action \"foo\")}}` when a key is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input key-down=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n\n this.triggerEvent('keydown', { keyCode: 65 });\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-up=\"foo\"}}` when a key is pressed'](assert) {\n assert.expect(4);\n\n expectDeprecation(() => {\n this.render(`{{input key-up='foo'}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n }, 'Please refactor `{{input key-up=\"foo\"}}` to `{{input key-up=(action \"foo\")}}. (\\'-top-level\\' @ L1:C0) ');\n\n expectDeprecation(() => {\n this.triggerEvent('keyup', { keyCode: 65 });\n }, 'Passing actions to components as strings (like {{input key-up=\"foo\"}}) is deprecated. Please use closure actions instead ({{input key-up=(action \"foo\")}})');\n }\n\n ['@test [DEPRECATED] sends an action with `{{input key-up=(action \"foo\")}}` when a key is pressed'](assert) {\n assert.expect(2);\n\n this.render(`{{input key-up=(action 'foo')}}`, {\n actions: {\n foo(value, event) {\n assert.ok(true, 'action was triggered');\n assert.ok(event instanceof _views.jQuery.Event, 'jQuery event was passed');\n }\n }\n });\n this.triggerEvent('keyup', { keyCode: 65 });\n }\n\n ['@test GH#14727 can render a file input after having had render an input of other type']() {\n this.render(`{{input type=\"text\"}}{{input type=\"file\"}}`);\n\n this.assert.equal(this.$input()[0].type, 'text');\n this.assert.equal(this.$input()[1].type, 'file');\n }\n });\n\n (0, _testCase.moduleFor)('Helpers test: {{input}} with dynamic type', class extends InputRenderingTest {\n ['@test a bound property can be used to determine type']() {\n this.render(`{{input type=type}}`, { type: 'password' });\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => (0, _metal.set)(this.context, 'type', 'text'));\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => (0, _metal.set)(this.context, 'type', 'password'));\n\n this.assertAttr('type', 'password');\n }\n\n ['@test a subexpression can be used to determine type']() {\n this.render(`{{input type=(if isTruthy trueType falseType)}}`, {\n isTruthy: true,\n trueType: 'text',\n falseType: 'password'\n });\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => this.rerender());\n\n this.assertAttr('type', 'text');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isTruthy', false));\n\n this.assertAttr('type', 'password');\n\n this.runTask(() => (0, _metal.set)(this.context, 'isTruthy', true));\n\n this.assertAttr('type', 'text');\n }\n\n ['@test GH16256 input macro does not modify params in place']() {\n this.registerComponent('my-input', {\n template: `{{input type=inputType}}`\n });\n\n this.render(`{{my-input inputType=firstType}}{{my-input inputType=secondType}}`, {\n firstType: 'password',\n secondType: 'email'\n });\n\n let inputs = this.element.querySelectorAll('input');\n this.assert.equal(inputs.length, 2, 'there are two inputs');\n this.assert.equal(inputs[0].getAttribute('type'), 'password');\n this.assert.equal(inputs[1].getAttribute('type'), 'email');\n }\n });\n\n (0, _testCase.moduleFor)(`Helpers test: {{input type='checkbox'}}`, class extends InputRenderingTest {\n ['@test dynamic attributes']() {\n this.render(`{{input\n type='checkbox'\n disabled=disabled\n name=name\n checked=checked\n tabindex=tabindex\n }}`, {\n disabled: false,\n name: 'original-name',\n checked: false,\n tabindex: 10\n });\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n\n this.runTask(() => this.rerender());\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'tabindex', 11);\n });\n\n this.assertSingleCheckbox();\n this.assertDisabled();\n this.assertAttr('name', 'updated-name');\n this.assertAttr('tabindex', '11');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', false);\n (0, _metal.set)(this.context, 'name', 'original-name');\n (0, _metal.set)(this.context, 'tabindex', 10);\n });\n\n this.assertSingleCheckbox();\n this.assertNotDisabled();\n this.assertAttr('name', 'original-name');\n this.assertAttr('tabindex', '10');\n }\n\n ['@test `value` property assertion']() {\n expectAssertion(() => {\n this.render(`{{input type=\"checkbox\" value=value}}`, {\n value: 'value'\n });\n }, /you must use `checked=/);\n }\n\n ['@test with a bound type']() {\n this.render(`{{input type=inputType checked=isChecked}}`, {\n inputType: 'checkbox',\n isChecked: true\n });\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsChecked();\n\n this.runTask(() => this.rerender());\n\n this.assertCheckboxIsChecked();\n\n this.runTask(() => (0, _metal.set)(this.context, 'isChecked', false));\n\n this.assertCheckboxIsNotChecked();\n\n this.runTask(() => (0, _metal.set)(this.context, 'isChecked', true));\n\n this.assertCheckboxIsChecked();\n }\n\n ['@test native click changes check property']() {\n this.render(`{{input type=\"checkbox\"}}`);\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.$input()[0].click();\n this.assertCheckboxIsChecked();\n this.$input()[0].click();\n this.assertCheckboxIsNotChecked();\n }\n\n ['@test with static values']() {\n this.render(`{{input type=\"checkbox\" disabled=false tabindex=10 name=\"original-name\" checked=false}}`);\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.assertNotDisabled();\n this.assertAttr('tabindex', '10');\n this.assertAttr('name', 'original-name');\n\n this.runTask(() => this.rerender());\n\n this.assertSingleCheckbox();\n this.assertCheckboxIsNotChecked();\n this.assertNotDisabled();\n this.assertAttr('tabindex', '10');\n this.assertAttr('name', 'original-name');\n }\n });\n\n (0, _testCase.moduleFor)(`Helpers test: {{input type='text'}}`, class extends InputRenderingTest {\n ['@test null values']() {\n let attributes = ['disabled', 'placeholder', 'name', 'maxlength', 'size', 'tabindex'];\n\n this.render(`\n {{input type=\"text\"\n disabled=disabled\n value=value\n placeholder=placeholder\n name=name\n maxlength=maxlength\n size=size\n tabindex=tabindex\n }}`, {\n disabled: null,\n value: null,\n placeholder: null,\n name: null,\n maxlength: null,\n size: null,\n tabindex: null\n });\n\n this.assertValue('');\n this.assertAllAttrs(attributes, undefined);\n\n this.runTask(() => this.rerender());\n\n this.assertValue('');\n this.assertAllAttrs(attributes, undefined);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', true);\n (0, _metal.set)(this.context, 'value', 'Updated value');\n (0, _metal.set)(this.context, 'placeholder', 'Updated placeholder');\n (0, _metal.set)(this.context, 'name', 'updated-name');\n (0, _metal.set)(this.context, 'maxlength', 11);\n (0, _metal.set)(this.context, 'size', 21);\n (0, _metal.set)(this.context, 'tabindex', 31);\n });\n\n this.assertDisabled();\n this.assertValue('Updated value');\n this.assertAttr('placeholder', 'Updated placeholder');\n this.assertAttr('name', 'updated-name');\n this.assertAttr('maxlength', '11');\n this.assertAttr('size', '21');\n this.assertAttr('tabindex', '31');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'disabled', null);\n (0, _metal.set)(this.context, 'value', null);\n (0, _metal.set)(this.context, 'placeholder', null);\n (0, _metal.set)(this.context, 'name', null);\n (0, _metal.set)(this.context, 'maxlength', null);\n // set(this.context, 'size', null); //NOTE: this fails with `Error: Failed to set the 'size' property on 'HTMLInputElement': The value provided is 0, which is an invalid size.` (TEST_SUITE=sauce)\n (0, _metal.set)(this.context, 'tabindex', null);\n });\n\n this.assertAttr('disabled', undefined);\n this.assertValue('');\n // this.assertAttr('placeholder', undefined); //NOTE: this fails with a value of \"null\" (TEST_SUITE=sauce)\n // this.assertAttr('name', undefined); //NOTE: this fails with a value of \"null\" (TEST_SUITE=sauce)\n this.assertAttr('maxlength', undefined);\n // this.assertAttr('size', undefined); //NOTE: re-enable once `size` bug above has been addressed\n this.assertAttr('tabindex', undefined);\n }\n });\n\n // These are the permutations of the set:\n // ['type=\"range\"', 'min=\"-5\" max=\"50\"', 'value=\"%x\"']\n ['type=\"range\" min=\"-5\" max=\"50\" value=\"%x\"', 'type=\"range\" value=\"%x\" min=\"-5\" max=\"50\"', 'min=\"-5\" max=\"50\" type=\"range\" value=\"%x\"', 'min=\"-5\" max=\"50\" value=\"%x\" type=\"range\"', 'value=\"%x\" min=\"-5\" max=\"50\" type=\"range\"', 'value=\"%x\" type=\"range\" min=\"-5\" max=\"50\"'].forEach(attrs => {\n (0, _testCase.moduleFor)(`[GH#15675] Helpers test: {{input ${attrs}}}`, class extends InputRenderingTest {\n renderInput(value = 25) {\n this.render(`{{input ${attrs.replace('%x', value)}}}`);\n }\n\n ['@test value over default max but below set max is kept']() {\n this.renderInput('25');\n this.assertValue('25');\n }\n\n ['@test value below default min but above set min is kept']() {\n this.renderInput('-2');\n this.assertValue('-2');\n }\n\n ['@test in the valid default range is kept']() {\n this.renderInput('5');\n this.assertValue('5');\n }\n\n ['@test value above max is reset to max']() {\n this.renderInput('55');\n this.assertValue('50');\n }\n\n ['@test value below min is reset to min']() {\n this.renderInput('-10');\n this.assertValue('-5');\n }\n });\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/loc-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/string'], function (_testCase, _metal, _string) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{loc}}', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n (0, _string._setStrings)({\n 'Hello Friend': 'Hallo Freund',\n Hello: 'Hallo, %@'\n });\n }\n\n teardown() {\n super.teardown();\n (0, _string._setStrings)({});\n }\n\n ['@test it lets the original value through by default']() {\n this.render(`{{loc \"Hiya buddy!\"}}`);\n this.assertText('Hiya buddy!', 'the unlocalized string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hiya buddy!', 'the unlocalized string is correct after rerender');\n }\n\n ['@test it localizes a simple string']() {\n this.render(`{{loc \"Hello Friend\"}}`);\n this.assertText('Hallo Freund', 'the localized string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund', 'the localized string is correct after rerender');\n }\n\n ['@test it takes passed formats into an account']() {\n this.render(`{{loc \"%@, %@\" \"Hello\" \"Mr. Pitkin\"}}`);\n this.assertText('Hello, Mr. Pitkin', 'the formatted string is correct');\n this.runTask(() => this.rerender());\n this.assertText('Hello, Mr. Pitkin', 'the formatted string is correct after rerender');\n }\n\n ['@test it updates when bound params change']() {\n this.render(`{{loc simple}} - {{loc personal 'Mr. Pitkin'}}`, {\n simple: 'Hello Friend',\n personal: 'Hello'\n });\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct');\n\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'simple', \"G'day mate\"));\n this.assertText(\"G'day mate - Hallo, Mr. Pitkin\", 'the bound value is correct after update');\n\n this.runTask(() => (0, _metal.set)(this.context, 'simple', 'Hello Friend'));\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after reset');\n }\n\n ['@test it updates when nested bound params change']() {\n this.render(`{{loc greetings.simple}} - {{loc greetings.personal 'Mr. Pitkin'}}`, {\n greetings: {\n simple: 'Hello Friend',\n personal: 'Hello'\n }\n });\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct');\n\n this.runTask(() => this.rerender());\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after rerender');\n\n this.runTask(() => (0, _metal.set)(this.context, 'greetings.simple', \"G'day mate\"));\n this.assertText(\"G'day mate - Hallo, Mr. Pitkin\", 'the bound value is correct after interior mutation');\n\n this.runTask(() => (0, _metal.set)(this.context, 'greetings', {\n simple: 'Hello Friend',\n personal: 'Hello'\n }));\n this.assertText('Hallo Freund - Hallo, Mr. Pitkin', 'the bound value is correct after replacement');\n }\n\n ['@test it can be overriden']() {\n this.registerHelper('loc', () => 'Yup');\n this.render(`{{loc greeting}}`, {\n greeting: 'Hello Friend'\n });\n this.assertText('Yup', 'the localized string is correct');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/log-test', ['@ember/-internals/glimmer/tests/utils/test-case'], function (_testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{log}}', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n /* eslint-disable no-console */\n this.originalLog = console.log;\n this.logCalls = [];\n console.log = (...args) => {\n this.logCalls.push(...args);\n /* eslint-enable no-console */\n };\n }\n\n teardown() {\n super.teardown();\n /* eslint-disable no-console */\n console.log = this.originalLog;\n /* eslint-enable no-console */\n }\n\n assertLog(values) {\n this.assertText('');\n this.assert.strictEqual(this.logCalls.length, values.length);\n\n for (let i = 0, len = values.length; i < len; i++) {\n this.assert.strictEqual(this.logCalls[i], values[i]);\n }\n }\n\n ['@test correctly logs primitives']() {\n this.render(`{{log \"one\" 1 true}}`);\n\n this.assertLog(['one', 1, true]);\n }\n\n ['@test correctly logs a property']() {\n this.render(`{{log value}}`, {\n value: 'one'\n });\n\n this.assertLog(['one']);\n }\n\n ['@test correctly logs multiple arguments']() {\n this.render(`{{log \"my variable:\" value}}`, {\n value: 'one'\n });\n\n this.assertLog(['my variable:', 'one']);\n }\n\n ['@test correctly logs `this`']() {\n this.render(`{{log this}}`);\n\n this.assertLog([this.context]);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/mut-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-helpers'], function (_testCase, _helpers, _metal, _testHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{mut}}', class extends _testCase.RenderingTest {\n ['@test a simple mutable binding using `mut` propagates properly']() {\n let bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=value}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12', 'the data propagated downwards');\n\n this.assertStableRerender();\n\n this.runTask(() => bottom.attrs.setMe.update(13));\n\n this.assertText('13', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\n this.assertText('14', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test a simple mutable binding using `mut` inserts into the DOM']() {\n let bottom, middle;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut setMe=(mut value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12', 'the data propagated downwards');\n\n this.assertStableRerender();\n\n this.runTask(() => bottom.attrs.setMe.update(13));\n\n this.assertText('13', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 13, \"the set propagated to middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 13, \"the set propagated to middle's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\n this.assertText('14', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 14, \"the set propagated to middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 14, \"the set propagated to middle's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test passing a literal results in a assertion']() {\n this.registerComponent('bottom-mut', { template: '{{setMe}}' });\n\n expectAssertion(() => {\n this.render('{{bottom-mut setMe=(mut \"foo bar\")}}');\n }, 'You can only pass a path to mut');\n }\n\n ['@test passing the result of a helper invocation results in an assertion']() {\n this.registerComponent('bottom-mut', { template: '{{setMe}}' });\n\n expectAssertion(() => {\n this.render('{{bottom-mut setMe=(mut (concat \"foo\" \" \" \"bar\"))}}');\n }, 'You can only pass a path to mut');\n }\n\n // See https://github.com/emberjs/ember.js/commit/807a0cd for an explanation of this test\n ['@test using a string value through middle tier does not trigger assertion (due to the auto-mut transform)']() {\n let bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{stuff}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut stuff=value}}'\n });\n\n this.render('{{middle-mut value=\"foo\"}}');\n\n this.assert.equal((0, _metal.get)(bottom, 'stuff'), 'foo', 'the data propagated');\n this.assertText('foo');\n\n this.assertStableRerender();\n\n // No U-R for this test\n }\n\n ['@test {{readonly}} of a {{mut}} is converted into an immutable binding']() {\n let middle, bottom;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut setMe=(readonly value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => middle.attrs.value.update(13));\n\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 13, \"the set took effect on middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 13, \"the set took effect on middle's attr\");\n\n this.runTask(() => (0, _metal.set)(middle, 'value', 14));\n\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 14, \"the set took effect on middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 14, \"the set took effect on middle's attr\");\n this.assert.strictEqual(bottom.attrs.setMe, 14, 'the mutable binding has been converted to an immutable cell');\n this.assertText('14');\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test mutable bindings work inside of yielded content']() {\n this.registerComponent('bottom-mut', {\n template: '{{yield}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{#bottom-mut}}{{model.name}}{{/bottom-mut}}'\n });\n\n this.render('{{middle-mut model=(mut model)}}', {\n model: { name: 'Matthew Beale' }\n });\n\n this.assertText('Matthew Beale');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'Joel Kang'));\n\n this.assertText('Joel Kang');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { name: 'Matthew Beale' }));\n\n this.assertText('Matthew Beale');\n }\n\n ['@test a simple mutable binding using {{mut}} is available in hooks']() {\n let bottom;\n let willRender = [];\n let didInsert = [];\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n willRender() {\n willRender.push((0, _metal.get)(this, 'setMe'));\n },\n didInsertElement() {\n didInsert.push((0, _metal.get)(this, 'setMe'));\n bottom = this;\n }\n }),\n template: '{{setMe}}'\n });\n\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=(mut value)}}'\n });\n\n this.render('{{middle-mut value=(mut val)}}', {\n val: 12\n });\n\n this.assert.deepEqual(willRender, [12], 'willReceive is [12]');\n this.assert.deepEqual(didInsert, [12], 'didInsert is [12]');\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.assert.deepEqual(willRender, [12], 'willReceive is [12]');\n this.assert.deepEqual(didInsert, [12], 'didInsert is [12]');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 12, 'the data propagated');\n\n this.runTask(() => bottom.attrs.setMe.update(13));\n\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(bottom, 'setMe', 14));\n\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n\n this.assertText('12');\n }\n\n ['@test a mutable binding with a backing computed property and attribute present in the root of the component is updated when the upstream property invalidates #11023']() {\n let bottom, middle;\n\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n thingy: null,\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{thingy}}'\n });\n\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n baseValue: 12,\n val: (0, _metal.computed)('baseValue', function () {\n return this.get('baseValue');\n }),\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{bottom-mut thingy=(mut val)}}'\n });\n\n this.render('{{middle-mut}}');\n\n this.assert.strictEqual((0, _metal.get)(bottom, 'thingy'), 12, 'data propagated');\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(middle, 'baseValue', 13));\n\n this.assert.strictEqual((0, _metal.get)(middle, 'val'), 13, 'the set took effect');\n this.assert.strictEqual(bottom.attrs.thingy.value, 13, \"the set propagated down to bottom's attrs\");\n this.assert.strictEqual((0, _metal.get)(bottom, 'thingy'), 13, \"the set propagated down to bottom's prop\");\n this.assertText('13');\n\n this.runTask(() => (0, _metal.set)(middle, 'baseValue', 12));\n\n this.assertText('12');\n }\n\n ['@test automatic mutable bindings exposes a mut cell in attrs']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: '{{foo}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner foo=bar}}'\n });\n\n this.render('{{x-outer bar=baz}}', { baz: 'foo' });\n\n this.assertText('foo');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.foo.update('bar'));\n\n this.assert.equal(inner.attrs.foo.value, 'bar');\n this.assert.equal((0, _metal.get)(inner, 'foo'), 'bar');\n this.assertText('bar');\n\n this.runTask(() => inner.attrs.foo.update('foo'));\n\n this.assertText('foo');\n }\n\n ['@test automatic mutable bindings tolerate undefined non-stream inputs and attempts to set them']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: '{{model}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner model=nonexistent}}'\n });\n\n this.render('{{x-outer}}');\n\n this.assertText('');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.model.update(42));\n\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('42');\n\n this.runTask(() => inner.attrs.model.update(undefined));\n\n this.assertText('');\n }\n\n ['@test automatic mutable bindings tolerate constant non-stream inputs and attempts to set them']() {\n let inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n }),\n template: 'hello{{model}}'\n });\n\n this.registerComponent('x-outer', {\n template: '{{x-inner model=x}}'\n });\n\n this.render('{{x-outer x=\"foo\"}}');\n\n this.assertText('hellofoo');\n\n this.assertStableRerender();\n\n this.runTask(() => inner.attrs.model.update(42));\n\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('hello42');\n\n this.runTask(() => inner.attrs.model.update('foo'));\n\n this.assertText('hellofoo');\n }\n });\n\n (0, _testCase.moduleFor)('Mutable Bindings used in Computed Properties that are bound as attributeBindings', class extends _testCase.RenderingTest {\n ['@test an attribute binding of a computed property of a 2-way bound attr recomputes when the attr changes']() {\n let input, output;\n\n this.registerComponent('x-input', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n input = this;\n }\n })\n });\n\n this.registerComponent('x-output', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n didInsertElement() {\n output = this;\n },\n style: (0, _metal.computed)('height', function () {\n let height = this.get('height');\n return (0, _helpers.htmlSafe)(`height: ${height}px;`);\n }),\n height: 20\n }),\n template: '{{height}}'\n });\n\n this.render('{{x-output height=height}}{{x-input height=(mut height)}}', {\n height: 60\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 60px;') },\n content: '60'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => input.attrs.height.update(35));\n\n this.assert.strictEqual((0, _metal.get)(output, 'height'), 35, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'height'), 35, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 35px;') },\n content: '35'\n });\n\n this.runTask(() => (0, _metal.set)(input, 'height', 36));\n\n this.assert.strictEqual((0, _metal.get)(output, 'height'), 36, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'height'), 36, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 36px;') },\n content: '36'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'height', 60));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 60px;') },\n content: '60'\n });\n this.assert.strictEqual((0, _metal.get)(input, 'height'), 60);\n }\n\n ['@test an attribute binding of a computed property with a setter of a 2-way bound attr recomputes when the attr changes']() {\n let input, output;\n\n this.registerComponent('x-input', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n input = this;\n }\n })\n });\n\n this.registerComponent('x-output', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n didInsertElement() {\n output = this;\n },\n style: (0, _metal.computed)('height', 'width', function () {\n let height = this.get('height');\n let width = this.get('width');\n return (0, _helpers.htmlSafe)(`height: ${height}px; width: ${width}px;`);\n }),\n height: 20,\n width: (0, _metal.computed)('height', {\n get() {\n return this.get('height') * 2;\n },\n set(keyName, width) {\n this.set('height', width / 2);\n return width;\n }\n })\n }),\n template: '{{width}}x{{height}}'\n });\n\n this.render('{{x-output width=width}}{{x-input width=(mut width)}}', {\n width: 70\n });\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 35px; width: 70px;') },\n content: '70x35'\n });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(input, 'width', 80));\n\n this.assert.strictEqual((0, _metal.get)(output, 'width'), 80, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'width'), 80, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 40px; width: 80px;') },\n content: '80x40'\n });\n\n this.runTask(() => input.attrs.width.update(90));\n\n this.assert.strictEqual((0, _metal.get)(output, 'width'), 90, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'width'), 90, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 45px; width: 90px;') },\n content: '90x45'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'width', 70));\n\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: { style: (0, _testHelpers.styles)('height: 35px; width: 70px;') },\n content: '70x35'\n });\n this.assert.strictEqual((0, _metal.get)(input, 'width'), 70);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/partial-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _metal, _runtime, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{partial}}', class extends _testCase.RenderingTest {\n ['@test should render other templates registered with the container']() {\n this.registerPartial('_subTemplateFromContainer', 'sub-template');\n\n this.render(`This {{partial \"subTemplateFromContainer\"}} is pretty great.`);\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test should render other slash-separated templates registered with the container']() {\n this.registerPartial('child/_subTemplateFromContainer', 'sub-template');\n\n this.render(`This {{partial \"child/subTemplateFromContainer\"}} is pretty great.`);\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test should use the current context']() {\n this.registerPartial('_person_name', '{{model.firstName}} {{model.lastName}}');\n\n this.render('Who is {{partial \"person_name\"}}?', {\n model: {\n firstName: 'Kris',\n lastName: 'Selden'\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('Who is Kris Selden?');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.firstName', 'Kelly'));\n\n this.assertText('Who is Kelly Selden?');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { firstName: 'Kris', lastName: 'Selden' }));\n\n this.assertText('Who is Kris Selden?');\n }\n\n ['@test Quoteless parameters passed to {{partial}} perform a bound property lookup of the partial name']() {\n this.registerPartial('_subTemplate', 'sub-template');\n this.registerPartial('_otherTemplate', 'other-template');\n\n this.render('This {{partial templates.partialName}} is pretty {{partial nonexistent}}great.', {\n templates: { partialName: 'subTemplate' }\n });\n\n this.assertStableRerender();\n\n this.assertText('This sub-template is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates.partialName', 'otherTemplate'));\n\n this.assertText('This other-template is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates.partialName', null));\n\n this.assertText('This is pretty great.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'templates', { partialName: 'subTemplate' }));\n\n this.assertText('This sub-template is pretty great.');\n }\n\n ['@test partial using data from {{#each}}']() {\n this.registerPartial('show-item', '{{item}}');\n\n this.render(_abstractTestCase.strip`\n {{#each model.items as |item|}}\n {{item}}: {{partial 'show-item'}} |\n {{/each}}`, {\n model: {\n items: (0, _runtime.A)(['apple', 'orange', 'banana'])\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('apple: apple |orange: orange |banana: banana |');\n\n this.runTask(() => this.context.model.items.pushObject('strawberry'));\n\n this.assertText('apple: apple |orange: orange |banana: banana |strawberry: strawberry |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n items: (0, _runtime.A)(['apple', 'orange', 'banana'])\n }));\n\n this.assertText('apple: apple |orange: orange |banana: banana |');\n }\n\n ['@test partial using `{{get` on data from {{#with}}']() {\n this.registerPartial('show-id', '{{get item \"id\"}}');\n\n this.render(_abstractTestCase.strip`\n {{#with model as |item|}}\n {{item.name}}: {{partial 'show-id'}}\n {{/with}}`, {\n model: { id: 1, name: 'foo' }\n });\n\n this.assertStableRerender();\n\n this.assertText('foo: 1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.id', 2));\n\n this.assertText('foo: 2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.name', 'bar'));\n\n this.assertText('bar: 2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { id: 1, name: 'foo' }));\n\n this.assertText('foo: 1');\n }\n\n ['@test partial using `{{get` on data from {{#each}}']() {\n this.registerPartial('show-item', '{{get item \"id\"}}');\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{item.id}}: {{partial 'show-item'}} |\n {{/each}}`, {\n items: (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }])\n });\n\n this.assertStableRerender();\n\n this.assertText('1: 1 |2: 2 |3: 3 |');\n\n this.runTask(() => this.context.items.pushObject({ id: 4 }));\n\n this.assertText('1: 1 |2: 2 |3: 3 |4: 4 |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)([{ id: 1 }, { id: 2 }, { id: 3 }])));\n\n this.assertText('1: 1 |2: 2 |3: 3 |');\n }\n\n ['@test partial using conditional on data from {{#each}}']() {\n this.registerPartial('show-item', '{{#if item}}{{item}}{{/if}}');\n\n this.render(_abstractTestCase.strip`\n {{#each items as |item|}}\n {{item}}: {{partial 'show-item'}} |\n {{/each}}`, {\n items: (0, _runtime.A)(['apple', null, 'orange', 'banana'])\n });\n\n this.assertStableRerender();\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |');\n\n this.runTask(() => this.context.items.pushObject('strawberry'));\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |strawberry: strawberry |');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)(['apple', null, 'orange', 'banana'])));\n\n this.assertText('apple: apple |: |orange: orange |banana: banana |');\n }\n\n ['@test nested partials using data from {{#each}}']() {\n this.registerPartial('_outer-partial', _abstractTestCase.strip`\n [outer: {{name}}] {{partial 'inner-partial'}}\n `);\n\n this.registerPartial('inner-partial', '[inner: {{name}}]');\n\n this.render(_abstractTestCase.strip`\n {{#each names as |name i|}}\n {{i}}: {{partial 'outer-partial'}}\n {{/each}}`, {\n names: (0, _runtime.A)(['Alex', 'Ben'])\n });\n\n this.assertStableRerender();\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]');\n\n this.runTask(() => this.context.names.pushObject('Sophie'));\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]2: [outer: Sophie] [inner: Sophie]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'names', (0, _runtime.A)(['Alex', 'Ben'])));\n\n this.assertText('0: [outer: Alex] [inner: Alex]1: [outer: Ben] [inner: Ben]');\n }\n\n ['@test nested partials within nested `{{#with}}` blocks']() {\n this.registerPartial('_person2-partial', _abstractTestCase.strip`\n {{#with 'Ben' as |person2|}}\n Hi {{person1}} (aged {{age}}) and {{person2}}. {{partial 'person3-partial'}}\n {{/with}}\n `);\n\n this.registerPartial('_person3-partial', _abstractTestCase.strip`\n {{#with 'Alex' as |person3|}}\n Hi {{person1}} (aged {{age}}), {{person2}} and {{person3}}. {{partial 'person4-partial'}}\n {{/with}}\n `);\n\n this.registerPartial('_person4-partial', _abstractTestCase.strip`\n {{#with 'Sarah' as |person4|}}\n Hi {{person1}} (aged {{age}}), {{person2}}, {{person3}} and {{person4}}.\n {{/with}}\n `);\n\n this.render(_abstractTestCase.strip`\n {{#with 'Sophie' as |person1|}}\n Hi {{person1}} (aged {{age}}). {{partial 'person2-partial'}}\n {{/with}}`, { age: 0 });\n\n this.assertStableRerender();\n\n this.assertText('Hi Sophie (aged 0). Hi Sophie (aged 0) and Ben. Hi Sophie (aged 0), Ben and Alex. Hi Sophie (aged 0), Ben, Alex and Sarah.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 1));\n\n this.assertText('Hi Sophie (aged 1). Hi Sophie (aged 1) and Ben. Hi Sophie (aged 1), Ben and Alex. Hi Sophie (aged 1), Ben, Alex and Sarah.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'age', 0));\n\n this.assertText('Hi Sophie (aged 0). Hi Sophie (aged 0) and Ben. Hi Sophie (aged 0), Ben and Alex. Hi Sophie (aged 0), Ben, Alex and Sarah.');\n }\n\n ['@test dynamic partials in {{#each}}']() {\n this.registerPartial('_odd', 'ODD{{i}}');\n this.registerPartial('_even', 'EVEN{{i}}');\n\n this.render(_abstractTestCase.strip`\n {{#each model.items as |template i|}}\n {{model.type}}: {{partial template}}\n {{/each}}`, {\n model: {\n items: ['even', 'odd', 'even', 'odd'],\n type: 'number'\n }\n });\n\n this.assertStableRerender();\n\n this.assertText('number: EVEN0number: ODD1number: EVEN2number: ODD3');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.type', 'integer'));\n\n this.assertText('integer: EVEN0integer: ODD1integer: EVEN2integer: ODD3');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n items: ['even', 'odd', 'even', 'odd'],\n type: 'number'\n }));\n\n this.assertText('number: EVEN0number: ODD1number: EVEN2number: ODD3');\n }\n\n ['@test dynamic partials in {{#with}}']() {\n this.registerPartial('_thing', '{{t}}');\n\n this.render(_abstractTestCase.strip`\n {{#with item.thing as |t|}}\n {{partial t}}\n {{else}}\n Nothing!\n {{/with}}`, {\n item: { thing: false }\n });\n\n this.assertStableRerender();\n\n this.assertText('Nothing!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'item.thing', 'thing'));\n\n this.assertText('thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'item', { thing: false }));\n\n this.assertText('Nothing!');\n }\n\n ['@test partials which contain contextual components']() {\n this.registerComponent('outer-component', {\n template: '{{yield (hash inner=(component \"inner-component\" name=name))}}'\n });\n\n this.registerComponent('inner-component', {\n template: '{{yield (hash name=name)}}'\n });\n\n this.registerPartial('_some-partial', _abstractTestCase.strip`\n {{#outer.inner as |inner|}}\n inner.name: {{inner.name}}\n {{/outer.inner}}\n `);\n\n this.render(_abstractTestCase.strip`\n {{#outer-component name=name as |outer|}}\n {{partial 'some-partial'}}\n {{/outer-component}}`, { name: 'Sophie' });\n\n this.assertStableRerender();\n\n this.assertText('inner.name: Sophie');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Ben'));\n\n this.assertText('inner.name: Ben');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Sophie'));\n\n this.assertText('inner.name: Sophie');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/readonly-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal'], function (_testCase, _helpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{readonly}}', class extends _testCase.RenderingTest {\n ['@test {{readonly}} of a path should work']() {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly val)}}', {\n val: 12\n });\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(component, 'value', 13));\n this.assert.notOk(component.attrs.value.update);\n\n this.assertText('13', 'local property is updated');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'upstream attribute is not updated');\n\n // No U-R\n }\n\n '@test passing an action to {{readonly}} avoids mutable cell wrapping'(assert) {\n assert.expect(4);\n let outer, inner;\n\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n inner = this;\n }\n })\n });\n\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n outer = this;\n }\n }),\n template: '{{x-inner onClick=(readonly onClick)}}'\n });\n\n this.render('{{x-outer onClick=(action doIt)}}', {\n doIt() {\n assert.ok(true, 'action was called');\n }\n });\n\n assert.equal(typeof outer.attrs.onClick, 'function', 'function itself is present in outer component attrs');\n outer.attrs.onClick();\n\n assert.equal(typeof inner.attrs.onClick, 'function', 'function itself is present in inner component attrs');\n inner.attrs.onClick();\n }\n\n '@test updating a {{readonly}} property from above works'(assert) {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly thing)}}', {\n thing: 'initial'\n });\n\n this.assertText('initial');\n\n this.assertStableRerender();\n\n assert.strictEqual(component.attrs.value, 'initial', 'no mutable cell');\n assert.strictEqual((0, _metal.get)(component, 'value'), 'initial', 'no mutable cell');\n assert.strictEqual(this.context.thing, 'initial');\n\n this.runTask(() => (0, _metal.set)(this.context, 'thing', 'updated!'));\n\n this.assertText('updated!');\n assert.strictEqual(component.attrs.value, 'updated!', 'passed down value was set in attrs');\n assert.strictEqual((0, _metal.get)(component, 'value'), 'updated!', 'passed down value was set');\n\n this.runTask(() => (0, _metal.set)(this.context, 'thing', 'initial'));\n\n this.assertText('initial');\n }\n\n '@test updating a nested path of a {{readonly}}'(assert) {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value.prop}}'\n });\n\n this.render('{{foo-bar value=(readonly thing)}}', {\n thing: {\n prop: 'initial'\n }\n });\n\n this.assertText('initial');\n\n this.assertStableRerender();\n\n assert.notOk(component.attrs.value.update, 'no update available');\n assert.deepEqual((0, _metal.get)(component, 'value'), { prop: 'initial' });\n assert.deepEqual(this.context.thing, { prop: 'initial' });\n\n this.runTask(() => (0, _metal.set)(component, 'value.prop', 'updated!'));\n\n this.assertText('updated!', 'nested path is updated');\n assert.deepEqual((0, _metal.get)(component, 'value'), { prop: 'updated!' });\n assert.deepEqual(this.context.thing, { prop: 'updated!' });\n\n this.runTask(() => (0, _metal.set)(component, 'value.prop', 'initial'));\n\n this.assertText('initial');\n }\n\n ['@test {{readonly}} of a string renders correctly']() {\n let component;\n\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n }),\n template: '{{value}}'\n });\n\n this.render('{{foo-bar value=(readonly \"12\")}}');\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.assert.notOk(component.attrs.value.update);\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '12');\n\n this.runTask(() => (0, _metal.set)(component, 'value', '13'));\n\n this.assertText('13', 'local property is updated');\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '13');\n\n this.runTask(() => (0, _metal.set)(component, 'value', '12'));\n\n this.assertText('12');\n }\n\n ['@test {{mut}} of a {{readonly}} mutates only the middle and bottom tiers']() {\n let middle, bottom;\n\n this.registerComponent('x-bottom', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n }),\n template: '{{bar}}'\n });\n\n this.registerComponent('x-middle', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n }),\n template: '{{foo}} {{x-bottom bar=(mut foo)}}'\n });\n\n this.render('{{x-middle foo=(readonly val)}}', {\n val: 12\n });\n\n this.assertText('12 12');\n\n this.assertStableRerender();\n\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 12, \"bottom's local bar received the value\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 12, \"middle's local foo received the value\");\n\n // updating the mut-cell directly\n this.runTask(() => bottom.attrs.bar.update(13));\n\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 13, \"bottom's local bar was updated after set of bottom's bar\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 13, \"middle's local foo was updated after set of bottom's bar\");\n this.assertText('13 13');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'But context val is not updated');\n\n this.runTask(() => (0, _metal.set)(bottom, 'bar', 14));\n\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 14, \"bottom's local bar was updated after set of bottom's bar\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 14, \"middle's local foo was updated after set of bottom's bar\");\n this.assertText('14 14');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'But context val is not updated');\n\n this.assert.notOk(middle.attrs.foo.update, \"middle's foo attr is not a mutable cell\");\n this.runTask(() => (0, _metal.set)(middle, 'foo', 15));\n\n this.assertText('15 15');\n this.assert.equal((0, _metal.get)(middle, 'foo'), 15, \"set of middle's foo took effect\");\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 15, \"bottom's local bar was updated after set of middle's foo\");\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'Context val remains unchanged');\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 10));\n\n this.assertText('10 10');\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 10, \"bottom's local bar was updated after set of context's val\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 10, \"middle's local foo was updated after set of context's val\");\n\n // setting as a normal property\n this.runTask(() => (0, _metal.set)(bottom, 'bar', undefined));\n\n this.assertText(' ');\n this.assert.equal((0, _metal.get)(bottom, 'bar'), undefined, \"bottom's local bar was updated to a falsy value\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), undefined, \"middle's local foo was updated to a falsy value\");\n\n this.runTask(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12 12', 'bottom and middle were both reset');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/text-area-test', ['@ember/polyfills', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_polyfills, _metal, _testCase, _testHelpers, _abstractTestCase) {\n 'use strict';\n\n class TextAreaRenderingTest extends _testCase.RenderingTest {\n assertTextArea({ attrs, value } = {}) {\n let mergedAttrs = (0, _polyfills.assign)({ class: (0, _testHelpers.classes)('ember-view ember-text-area') }, attrs);\n this.assertComponentElement(this.firstChild, {\n tagName: 'textarea',\n attrs: mergedAttrs\n });\n\n if (value) {\n this.assert.strictEqual(value, this.firstChild.value);\n }\n }\n\n triggerEvent(type, options = {}) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n\n this.firstChild.dispatchEvent(event);\n }\n }\n\n class BoundTextAreaAttributes {\n constructor(cases) {\n this.cases = cases;\n }\n\n generate({ attribute, first, second }) {\n return {\n [`@test ${attribute}`]() {\n this.render(`{{textarea ${attribute}=value}}`, {\n value: first\n });\n this.assertTextArea({ attrs: { [attribute]: first } });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', second));\n this.assertTextArea({ attrs: { [attribute]: second } });\n\n this.runTask(() => (0, _metal.set)(this.context, 'value', first));\n this.assertTextArea({ attrs: { [attribute]: first } });\n }\n };\n }\n }\n\n (0, _abstractTestCase.applyMixins)(TextAreaRenderingTest, new BoundTextAreaAttributes([{ attribute: 'placeholder', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'name', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'title', first: 'Stuff here', second: 'Other stuff' }, { attribute: 'maxlength', first: '1', second: '2' }, { attribute: 'rows', first: '1', second: '2' }, { attribute: 'cols', first: '1', second: '2' }, { attribute: 'tabindex', first: '1', second: '2' }]));\n\n (0, _testCase.moduleFor)('Helpers test: {{textarea}}', class extends TextAreaRenderingTest {\n ['@test Should insert a textarea'](assert) {\n this.render('{{textarea}}');\n\n assert.equal(this.$('textarea').length, 1);\n\n this.assertStableRerender();\n }\n\n ['@test Should respect disabled'](assert) {\n this.render('{{textarea disabled=disabled}}', {\n disabled: true\n });\n assert.ok(this.$('textarea').is(':disabled'));\n }\n\n ['@test Should respect disabled when false'](assert) {\n this.render('{{textarea disabled=disabled}}', {\n disabled: false\n });\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n }\n\n ['@test Should become disabled when the context changes'](assert) {\n this.render('{{textarea disabled=disabled}}');\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'disabled', true));\n assert.ok(this.$('textarea').is(':disabled'));\n\n this.runTask(() => (0, _metal.set)(this.context, 'disabled', false));\n assert.ok(this.$('textarea').is(':not(:disabled)'));\n }\n\n ['@test Should bind its contents to the specified value']() {\n this.render('{{textarea value=model.val}}', {\n model: { val: 'A beautiful day in Seattle' }\n });\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.val', 'Auckland'));\n this.assertTextArea({ value: 'Auckland' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { val: 'A beautiful day in Seattle' }));\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n }\n\n ['@test GH#14001 Should correctly handle an empty string bound value']() {\n this.render('{{textarea value=message}}', { message: '' });\n\n this.assert.strictEqual(this.firstChild.value, '');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', 'hello'));\n\n this.assert.strictEqual(this.firstChild.value, 'hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'message', ''));\n\n this.assert.strictEqual(this.firstChild.value, '');\n }\n\n ['@test should update the value for `cut` / `input` / `change` events']() {\n this.render('{{textarea value=model.val}}', {\n model: { val: 'A beautiful day in Seattle' }\n });\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n\n this.assertStableRerender();\n\n this.runTask(() => {\n this.firstChild.value = 'Auckland';\n this.triggerEvent('cut');\n });\n this.assertTextArea({ value: 'Auckland' });\n\n this.runTask(() => {\n this.firstChild.value = 'Hope';\n this.triggerEvent('paste');\n });\n this.assertTextArea({ value: 'Hope' });\n\n this.runTask(() => {\n this.firstChild.value = 'Boston';\n this.triggerEvent('input');\n });\n this.assertTextArea({ value: 'Boston' });\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { val: 'A beautiful day in Seattle' }));\n this.assertTextArea({ value: 'A beautiful day in Seattle' });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/unbound-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/runtime'], function (_testCase, _abstractTestCase, _metal, _helpers, _runtime) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{unbound}}', class extends _testCase.RenderingTest {\n ['@test should be able to output a property without binding']() {\n this.render(`
{{unbound content.anUnboundString}}
`, {\n content: {\n anUnboundString: 'No spans here, son.'\n }\n });\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'content.anUnboundString', 'HEY'));\n\n this.assertText('No spans here, son.');\n\n this.runTask(() => (0, _metal.set)(this.context, 'content', {\n anUnboundString: 'No spans here, son.'\n }));\n\n this.assertText('No spans here, son.');\n }\n\n ['@test should be able to use unbound helper in #each helper']() {\n this.render(`
    {{#each items as |item|}}
  • {{unbound item}}
  • {{/each}}
`, {\n items: (0, _runtime.A)(['a', 'b', 'c', 1, 2, 3])\n });\n\n this.assertText('abc123');\n\n this.runTask(() => this.rerender());\n\n this.assertText('abc123');\n }\n\n ['@test should be able to use unbound helper in #each helper (with objects)']() {\n this.render(`
    {{#each items as |item|}}
  • {{unbound item.wham}}
  • {{/each}}
`, {\n items: (0, _runtime.A)([{ wham: 'bam' }, { wham: 1 }])\n });\n\n this.assertText('bam1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bam1');\n\n this.runTask(() => this.context.items.setEach('wham', 'HEY'));\n\n this.assertText('bam1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)([{ wham: 'bam' }, { wham: 1 }])));\n\n this.assertText('bam1');\n }\n\n ['@test it should assert unbound cannot be called with multiple arguments']() {\n let willThrow = () => {\n this.render(`{{unbound foo bar}}`, {\n foo: 'BORK',\n bar: 'BLOOP'\n });\n };\n\n expectAssertion(willThrow, /unbound helper cannot be called with multiple params or hash params/);\n }\n\n ['@test should render on attributes']() {\n this.render(``, {\n model: { foo: 'BORK' }\n });\n\n this.assertHTML('');\n\n this.runTask(() => this.rerender());\n\n this.assertHTML('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.foo', 'OOF'));\n\n this.assertHTML('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { foo: 'BORK' }));\n\n this.assertHTML('');\n }\n\n ['@test should property escape unsafe hrefs']() {\n let unsafeUrls = (0, _runtime.A)([{\n name: 'Bob',\n url: 'javascript:bob-is-cool' // jshint ignore:line\n }, {\n name: 'James',\n url: 'vbscript:james-is-cool' // jshint ignore:line\n }, {\n name: 'Richard',\n url: 'javascript:richard-is-cool' // jshint ignore:line\n }]);\n\n this.render(``, {\n people: unsafeUrls\n });\n\n let escapedHtml = _abstractTestCase.strip`\n \n `;\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => this.rerender());\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => this.context.people.setEach('url', 'http://google.com'));\n\n this.assertHTML(escapedHtml);\n\n this.runTask(() => (0, _metal.set)(this.context, 'people', unsafeUrls));\n\n this.assertHTML(escapedHtml);\n }\n\n ['@skip helper form updates on parent re-render']() {\n this.render(`{{unbound foo}}`, {\n foo: 'BORK'\n });\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'OOF'));\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('OOF');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', ''));\n\n this.assertText('OOF');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'BORK'));\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n }\n\n // semantics here is not guaranteed\n ['@test sexpr form does not update no matter what']() {\n this.registerHelper('capitalize', args => args[0].toUpperCase());\n\n this.render(`{{capitalize (unbound foo)}}`, {\n foo: 'bork'\n });\n\n this.assertText('BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n\n this.assertText('BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n\n this.assertText('BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\n\n this.assertText('BORK');\n }\n\n ['@test sexpr in helper form does not update on parent re-render']() {\n this.registerHelper('capitalize', params => params[0].toUpperCase());\n\n this.registerHelper('doublize', params => `${params[0]} ${params[0]}`);\n\n this.render(`{{capitalize (unbound (doublize foo))}}`, {\n foo: 'bork'\n });\n\n this.assertText('BORK BORK');\n\n this.runTask(() => this.rerender());\n\n this.assertText('BORK BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n\n this.assertText('BORK BORK');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n\n this.assertText('BORK BORK');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\n\n this.assertText('BORK BORK');\n }\n\n ['@test should be able to render an unbound helper invocation']() {\n this.registerHelper('repeat', ([value], { count }) => {\n let a = [];\n while (a.length < count) {\n a.push(value);\n }\n return a.join('');\n });\n\n this.render(`{{unbound (repeat foo count=bar)}} {{repeat foo count=bar}} {{unbound (repeat foo count=2)}} {{repeat foo count=4}}`, {\n foo: 'X',\n bar: 5\n });\n\n this.assertText('XXXXX XXXXX XX XXXX');\n\n this.runTask(() => this.rerender());\n\n this.assertText('XXXXX XXXXX XX XXXX');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 1));\n\n this.assertText('XXXXX X XX XXXX');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 5));\n\n this.assertText('XXXXX XXXXX XX XXXX');\n }\n\n ['@test should be able to render an bound helper invocation mixed with static values']() {\n this.registerHelper('surround', ([prefix, value, suffix]) => `${prefix}-${value}-${suffix}`);\n\n this.render(_abstractTestCase.strip`\n {{unbound (surround model.prefix model.value \"bar\")}} {{surround model.prefix model.value \"bar\"}} {{unbound (surround \"bar\" model.value model.suffix)}} {{surround \"bar\" model.value model.suffix}}`, {\n model: {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n }\n });\n\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n\n this.runTask(() => this.rerender());\n\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n\n this.runTask(() => {\n (0, _metal.setProperties)(this.context.model, {\n prefix: 'beforeChanged',\n value: 'coreChanged',\n suffix: 'afterChanged'\n });\n });\n\n this.assertText('before-core-bar beforeChanged-coreChanged-bar bar-core-after bar-coreChanged-afterChanged');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'model', {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n });\n });\n\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n }\n\n ['@test should be able to render unbound forms of multi-arg helpers']() {\n this.registerHelper('fauxconcat', params => params.join(''));\n\n this.render(`{{fauxconcat model.foo model.bar model.bing}} {{unbound (fauxconcat model.foo model.bar model.bing)}}`, {\n model: {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }\n });\n\n this.assertText('abc abc');\n\n this.runTask(() => this.rerender());\n\n this.assertText('abc abc');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', 'X'));\n\n this.assertText('aXc abc');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }));\n\n this.assertText('abc abc');\n }\n\n ['@test should be able to render an unbound helper invocation for helpers with dependent keys']() {\n this.registerHelper('capitalizeName', {\n destroy() {\n this.removeObserver('value.firstName', this, this.recompute);\n this._super(...arguments);\n },\n\n compute([value]) {\n if (this.get('value')) {\n this.removeObserver('value.firstName', this, this.recompute);\n }\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n return value ? (0, _metal.get)(value, 'firstName').toUpperCase() : '';\n }\n });\n\n this.registerHelper('concatNames', {\n destroy() {\n this.teardown();\n this._super(...arguments);\n },\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n compute([value]) {\n if (this.get('value')) {\n this.teardown();\n }\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n this.addObserver('value.lastName', this, this.recompute);\n return (value ? (0, _metal.get)(value, 'firstName') : '') + (value ? (0, _metal.get)(value, 'lastName') : '');\n }\n });\n\n this.render(`{{capitalizeName person}} {{unbound (capitalizeName person)}} {{concatNames person}} {{unbound (concatNames person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n }\n\n ['@test should be able to render an unbound helper invocation in #each helper']() {\n this.registerHelper('capitalize', params => params[0].toUpperCase());\n\n this.render(`{{#each people as |person|}}{{capitalize person.firstName}} {{unbound (capitalize person.firstName)}}{{/each}}`, {\n people: (0, _runtime.A)([{\n firstName: 'shooby',\n lastName: 'taylor'\n }, {\n firstName: 'cindy',\n lastName: 'taylor'\n }])\n });\n\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n\n this.runTask(() => this.context.people.setEach('firstName', 'chad'));\n\n this.assertText('CHAD SHOOBYCHAD CINDY');\n\n this.runTask(() => (0, _metal.set)(this.context, 'people', (0, _runtime.A)([{\n firstName: 'shooby',\n lastName: 'taylor'\n }, {\n firstName: 'cindy',\n lastName: 'taylor'\n }])));\n\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n }\n\n ['@test should be able to render an unbound helper invocation with bound hash options']() {\n this.registerHelper('capitalizeName', {\n destroy() {\n this.removeObserver('value.firstName', this, this.recompute);\n this._super(...arguments);\n },\n\n compute([value]) {\n if (this.get('value')) {\n this.removeObserver('value.firstName', this, this.recompute);\n }\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n return value ? (0, _metal.get)(value, 'firstName').toUpperCase() : '';\n }\n });\n\n this.registerHelper('concatNames', {\n destroy() {\n this.teardown();\n this._super(...arguments);\n },\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n compute([value]) {\n if (this.get('value')) {\n this.teardown();\n }\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n this.addObserver('value.lastName', this, this.recompute);\n return (value ? (0, _metal.get)(value, 'firstName') : '') + (value ? (0, _metal.get)(value, 'lastName') : '');\n }\n });\n\n this.render(`{{capitalizeName person}} {{unbound (capitalizeName person)}} {{concatNames person}} {{unbound (concatNames person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => this.rerender());\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n\n this.runTask(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\n\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n }\n\n ['@test should be able to render bound form of a helper inside unbound form of same helper']() {\n this.render(_abstractTestCase.strip`\n {{#if (unbound model.foo)}}\n {{#if model.bar}}true{{/if}}\n {{#unless model.bar}}false{{/unless}}\n {{/if}}\n {{#unless (unbound model.notfoo)}}\n {{#if model.bar}}true{{/if}}\n {{#unless model.bar}}false{{/unless}}\n {{/unless}}`, {\n model: {\n foo: true,\n notfoo: false,\n bar: true\n }\n });\n\n this.assertText('truetrue');\n\n this.runTask(() => this.rerender());\n\n this.assertText('truetrue');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.bar', false));\n\n this.assertText('falsefalse');\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', {\n foo: true,\n notfoo: false,\n bar: true\n }));\n\n this.assertText('truetrue');\n }\n\n ['@test yielding unbound does not update']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n fooBarInstance = this;\n },\n model: { foo: 'bork' }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound model.foo)}}`\n });\n\n this.render(`{{#foo-bar as |value|}}{{value}}{{/foo-bar}}`);\n\n this.assertText('bork');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { foo: 'bork' }));\n\n this.assertText('bork');\n }\n\n ['@test yielding unbound hash does not update']() {\n let fooBarInstance;\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n fooBarInstance = this;\n },\n model: { foo: 'bork' }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound (hash foo=model.foo))}}`\n });\n\n this.render(`{{#foo-bar as |value|}}{{value.foo}}{{/foo-bar}}`);\n\n this.assertText('bork');\n\n this.runTask(() => this.rerender());\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n\n this.assertText('bork');\n\n this.runTask(() => (0, _metal.set)(fooBarInstance, 'model', { foo: 'bork' }));\n\n this.assertText('bork');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/helpers/yield-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/helpers'], function (_testCase, _metal, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Helpers test: {{yield}} helper', class extends _testCase.RenderingTest {\n ['@test can yield to block']() {\n this.registerComponent('yield-comp', {\n template: '[In layout:] {{yield}}'\n });\n\n this.render('{{#yield-comp}}[In Block:] {{object.title}}{{/yield-comp}}', {\n object: { title: 'Seattle' }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n\n this.runTask(() => (0, _metal.set)(this.context, 'object', { title: 'Seattle' }));\n this.assertText('[In layout:] [In Block:] Seattle');\n }\n\n ['@test templates should yield to block inside a nested component']() {\n this.registerComponent('outer-comp', {\n template: '
[In layout:] {{yield}}
'\n });\n this.registerComponent('inner-comp', {\n template: '{{#outer-comp}}[In Block:] {{object.title}}{{/outer-comp}}'\n });\n\n this.render('{{inner-comp object=object}}', {\n object: { title: 'Seattle' }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n\n this.runTask(() => (0, _metal.set)(this.context, 'object', { title: 'Seattle' }));\n this.assertText('[In layout:] [In Block:] Seattle');\n }\n\n ['@test templates should yield to block, when the yield is embedded in a each helper']() {\n let list = [1, 2, 3];\n\n this.registerComponent('outer-comp', {\n template: '{{#each list as |item|}}{{yield}}{{/each}}'\n });\n\n this.render('{{#outer-comp list=list}}Hello{{/outer-comp}}', {\n list: list\n });\n this.assertText('HelloHelloHello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'list', [4, 5]));\n this.assertText('HelloHello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'list', list));\n this.assertText('HelloHelloHello');\n }\n\n ['@test templates should yield to block, when the yield is embedded in a if helper']() {\n this.registerComponent('outer-comp', {\n template: '{{#if boolean}}{{yield}}{{/if}}'\n });\n\n this.render('{{#outer-comp boolean=boolean}}Hello{{/outer-comp}}', {\n boolean: true\n });\n this.assertText('Hello');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boolean', false));\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boolean', true));\n this.assertText('Hello');\n }\n\n ['@test simple curlies inside of a yielded clock should work when the yield is nested inside of another view']() {\n this.registerComponent('kiwi-comp', {\n template: '{{#if falsy}}{{else}}{{yield}}{{/if}}'\n });\n\n this.render('{{#kiwi-comp}}{{text}}{{/kiwi-comp}}', { text: 'ohai' });\n this.assertText('ohai');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'ohai'));\n this.assertText('ohai');\n }\n\n ['@test nested simple curlies inside of a yielded block should work when the yield is nested inside of another view']() {\n this.registerComponent('parent-comp', {\n template: '{{#if falsy}}{{else}}{{yield}}{{/if}}'\n });\n this.registerComponent('child-comp', {\n template: '{{#if falsy}}{{else}}{{text}}{{/if}}'\n });\n\n this.render('{{#parent-comp}}{{child-comp text=text}}{{/parent-comp}}', {\n text: 'ohai'\n });\n this.assertText('ohai');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'ohai'));\n this.assertText('ohai');\n }\n\n ['@test yielding to a non-existent block is not an error']() {\n this.registerComponent('yielding-comp', { template: 'Hello:{{yield}}' });\n this.registerComponent('outer-comp', {\n template: '{{yielding-comp}} {{title}}'\n });\n\n this.render('{{outer-comp title=title}}', { title: 'Mr. Selden' });\n\n this.assertText('Hello: Mr. Selden');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'title', 'Mr. Chag'));\n this.assertText('Hello: Mr. Chag');\n\n this.runTask(() => (0, _metal.set)(this.context, 'title', 'Mr. Selden'));\n this.assertText('Hello: Mr. Selden');\n }\n\n ['@test yield uses the original context']() {\n let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '

{{boundText}}

{{yield}}

'\n });\n\n this.render('{{#kiwi-comp}}{{boundText}}{{/kiwi-comp}}', {\n boundText: 'Original'\n });\n this.assertText('InnerOriginal');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Original'));\n this.assertText('InnerOriginal');\n }\n\n [\"@test outer block param doesn't mask inner component property\"]() {\n let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '

{{boundText}}

{{yield}}

'\n });\n\n this.render('{{#with boundText as |item|}}{{#kiwi-comp}}{{item}}{{/kiwi-comp}}{{/with}}', {\n boundText: 'Outer'\n });\n this.assertText('InnerOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Outer'));\n this.assertText('InnerOuter');\n }\n\n [\"@test inner block param doesn't mask yield property\"]() {\n let KiwiCompComponent = _helpers.Component.extend({ boundText: 'Inner' });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '{{#with boundText as |item|}}

{{item}}

{{yield}}

{{/with}}'\n });\n\n this.render('{{#kiwi-comp}}{{item}}{{/kiwi-comp}}', { item: 'Outer' });\n this.assertText('InnerOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'item', 'Otherworld'));\n this.assertText('InnerOtherworld');\n\n this.runTask(() => (0, _metal.set)(this.context, 'item', 'Outer'));\n this.assertText('InnerOuter');\n }\n\n ['@test can bind a block param to a component and use it in yield']() {\n this.registerComponent('kiwi-comp', {\n template: '

{{content}}

{{yield}}

'\n });\n\n this.render('{{#with boundText as |item|}}{{#kiwi-comp content=item}}{{item}}{{/kiwi-comp}}{{/with}}', { boundText: 'Outer' });\n this.assertText('OuterOuter');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Update'));\n this.assertText('UpdateUpdate');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'Outer'));\n this.assertText('OuterOuter');\n }\n\n // INUR not need with no data update\n ['@test yield should not introduce a view'](assert) {\n let ParentCompComponent = _helpers.Component.extend({ isParentComponent: true });\n\n let ChildCompComponent = _helpers.Component.extend({\n didReceiveAttrs() {\n this._super();\n let parentView = this.get('parentView');\n\n assert.ok(parentView.get('isParentComponent'));\n }\n });\n\n this.registerComponent('parent-comp', {\n ComponentClass: ParentCompComponent,\n template: '{{yield}}'\n });\n this.registerComponent('child-comp', {\n ComponentClass: ChildCompComponent\n });\n\n this.render('{{#parent-comp}}{{child-comp}}{{/parent-comp}}');\n }\n\n ['@test yield with nested components (#3220)']() {\n this.registerComponent('inner-component', { template: '{{yield}}' });\n this.registerComponent('outer-component', {\n template: '{{#inner-component}}{{yield}}{{/inner-component}}'\n });\n\n this.render('{{#outer-component}}Hello {{boundText}}{{/outer-component}}', {\n boundText: 'world'\n });\n this.assertText('Hello world');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'update'));\n this.assertText('Hello update');\n\n this.runTask(() => (0, _metal.set)(this.context, 'boundText', 'world'));\n this.assertText('Hello world');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/input-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal'], function (_testCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Input element tests', class extends _testCase.RenderingTest {\n runAttributeTest(attributeName, values) {\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on noop rerender`);\n\n this.setComponentValue(values[1]);\n this.assertAttributeHasValue(attributeName, values[1], `${attributeName} is set on rerender`);\n\n this.setComponentValue(values[0]);\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} can be set back to the initial value`);\n }\n\n runPropertyTest(propertyName, values) {\n let attributeName = propertyName;\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on noop rerender`);\n\n this.setComponentValue(values[1]);\n this.assertPropertyHasValue(propertyName, values[1], `${propertyName} is set on rerender`);\n\n this.setComponentValue(values[0]);\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} can be set back to the initial value`);\n }\n\n runFalsyValueProperty(values) {\n let value = 'value';\n let template = ``;\n this.render(template, { value: values[0] });\n this.assertPropertyHasValue(value, '', `${value} is set on initial render`);\n\n this.runTask(() => this.rerender());\n this.assertPropertyHasValue(value, '', `${value} is set on noop rerender`);\n this.setComponentValue(values[1]);\n\n this.assertPropertyHasValue(value, values[1], `${value} is set on rerender`);\n\n this.setComponentValue(values[0]);\n this.assertPropertyHasValue(value, '', `${value} can be set back to the initial value`);\n }\n\n ['@test input disabled attribute']() {\n let model = { model: { value: false } };\n\n this.render(``, model);\n\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n\n this.runTask(() => this.rerender());\n\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n\n this.runTask(() => this.context.set('model.value', true));\n\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(''); // Note the DOM output is \n\n this.runTask(() => this.context.set('model.value', 'wat'));\n\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(''); // Note the DOM output is \n\n this.runTask(() => this.context.set('model', { value: false }));\n\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n this.assertHTML('');\n }\n\n ['@test input value attribute']() {\n this.runPropertyTest('value', ['foo', 'bar']);\n }\n\n ['@test input placeholder attribute']() {\n this.runAttributeTest('placeholder', ['foo', 'bar']);\n }\n\n ['@test input name attribute']() {\n this.runAttributeTest('name', ['nam', 'name']);\n }\n\n ['@test input maxlength attribute']() {\n this.runAttributeTest('maxlength', [2, 3]);\n }\n\n ['@test input size attribute']() {\n this.runAttributeTest('size', [2, 3]);\n }\n\n ['@test input tabindex attribute']() {\n this.runAttributeTest('tabindex', [2, 3]);\n }\n\n ['@test null input value']() {\n this.runFalsyValueProperty([null, 'hello']);\n }\n\n ['@test undefined input value']() {\n this.runFalsyValueProperty([undefined, 'hello']);\n }\n\n ['@test undefined `toString` method as input value']() {\n this.runFalsyValueProperty([Object.create(null), 'hello']);\n }\n\n ['@test cursor position is not lost when updating content']() {\n let template = ``;\n this.render(template, { value: 'hola' });\n\n this.setDOMValue('hello');\n this.setSelectionRange(1, 3);\n\n this.setComponentValue('hello');\n\n this.assertSelectionRange(1, 3);\n\n // Note: We should eventually get around to testing reseting, however\n // browsers handle `selectionStart` and `selectionEnd` differently\n // when are synthetically testing movement of the cursor.\n }\n\n ['@test input can be updated multiple times']() {\n let template = ``;\n this.render(template, { value: 'hola' });\n\n this.assertValue('hola', 'Value is initialised');\n\n this.setComponentValue('');\n this.assertValue('', 'Value is set in the DOM');\n\n this.setDOMValue('hola');\n this.setComponentValue('hola');\n this.assertValue('hola', 'Value is updated the first time');\n\n this.setComponentValue('');\n this.assertValue('', 'Value is updated the second time');\n }\n\n ['@test DOM is SSOT if value is set']() {\n let template = ``;\n this.render(template, { value: 'hola' });\n\n this.assertValue('hola', 'Value is initialised');\n\n this.setComponentValue('hello');\n\n this.assertValue('hello', 'Value is initialised');\n\n this.setDOMValue('hola');\n\n this.assertValue('hola', 'DOM is used');\n\n this.setComponentValue('bye');\n\n this.assertValue('bye', 'Value is used');\n\n // Simulates setting the input to the same value as it already is which won't cause a rerender\n\n this.setDOMValue('hola');\n\n this.assertValue('hola', 'DOM is used');\n\n this.setComponentValue('hola');\n\n this.assertValue('hola', 'Value is used');\n }\n\n // private helpers and assertions\n setDOMValue(value) {\n this.inputElement().value = value;\n }\n\n setComponentValue(value) {\n this.runTask(() => (0, _metal.set)(this.context, 'value', value));\n }\n\n setSelectionRange(start, end) {\n this.inputElement().selectionStart = start;\n this.inputElement().selectionEnd = end;\n }\n\n inputElement() {\n return this.$inputElement()[0];\n }\n\n $inputElement() {\n return this.$('input');\n }\n\n assertValue(value, message) {\n this.assertPropertyHasValue('value', value, message);\n }\n\n assertAttributeHasValue(attribute, value, message) {\n this.assert.equal(this.$inputElement().attr(attribute), value, `${attribute} ${message}`);\n }\n\n assertPropertyHasValue(property, value, message) {\n this.assert.equal(this.$inputElement().prop(property), value, `${property} ${message}`);\n }\n\n assertSelectionRange(start, end) {\n this.assert.equal(this.inputElement().selectionStart, start);\n this.assert.equal(this.inputElement().selectionEnd, end);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/mount-test', ['@ember/-internals/owner', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/controller', '@ember/-internals/metal', '@ember/engine'], function (_owner, _testCase, _helpers, _controller, _metal, _engine) {\n 'use strict';\n\n if (true /* EMBER_ENGINES_MOUNT_PARAMS */) {\n (0, _testCase.moduleFor)('{{mount}} single param assertion', class extends _testCase.RenderingTest {\n ['@test it asserts that only a single param is passed']() {\n expectAssertion(() => {\n this.render('{{mount \"chat\" \"foo\"}}');\n }, /You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}./i);\n }\n });\n } else {\n (0, _testCase.moduleFor)('{{mount}} single param assertion', class extends _testCase.RenderingTest {\n ['@test it asserts that only a single param is passed']() {\n expectAssertion(() => {\n this.render('{{mount \"chat\" \"foo\"}}');\n }, /You can only pass a single argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}./i);\n }\n });\n }\n\n (0, _testCase.moduleFor)('{{mount}} assertions', class extends _testCase.RenderingTest {\n ['@test it asserts when an invalid engine name is provided']() {\n expectAssertion(() => {\n this.render('{{mount engineName}}', { engineName: {} });\n }, /Invalid engine name '\\[object Object\\]' specified, engine name must be either a string, null or undefined./i);\n }\n\n ['@test it asserts that the specified engine is registered']() {\n expectAssertion(() => {\n this.render('{{mount \"chat\"}}');\n }, /You used `{{mount 'chat'}}`, but the engine 'chat' can not be found./i);\n }\n });\n\n (0, _testCase.moduleFor)('{{mount}} test', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n let engineRegistrations = this.engineRegistrations = {};\n\n this.add('engine:chat', _engine.default.extend({\n router: null,\n\n init() {\n this._super(...arguments);\n\n Object.keys(engineRegistrations).forEach(fullName => {\n this.register(fullName, engineRegistrations[fullName]);\n });\n }\n }));\n\n this.addTemplate('index', '{{mount \"chat\"}}');\n }\n\n ['@test it boots an engine, instantiates its application controller, and renders its application template'](assert) {\n this.engineRegistrations['template:application'] = (0, _helpers.compile)('

Chat here, {{username}}

', { moduleName: 'my-app/templates/application.hbs' });\n\n let controller;\n\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n username: 'dgeb',\n\n init() {\n this._super();\n controller = this;\n }\n });\n\n return this.visit('/').then(() => {\n assert.ok(controller, \"engine's application controller has been instantiated\");\n\n let engineInstance = (0, _owner.getOwner)(controller);\n assert.strictEqual((0, _engine.getEngineParent)(engineInstance), this.applicationInstance, 'engine instance has the application instance as its parent');\n\n this.assertInnerHTML('

Chat here, dgeb

');\n\n this.runTask(() => (0, _metal.set)(controller, 'username', 'chancancode'));\n\n this.assertInnerHTML('

Chat here, chancancode

');\n\n this.runTask(() => (0, _metal.set)(controller, 'username', 'dgeb'));\n\n this.assertInnerHTML('

Chat here, dgeb

');\n });\n }\n\n ['@test it emits a useful backtracking re-render assertion message']() {\n this.router.map(function () {\n this.route('route-with-mount');\n });\n\n this.addTemplate('index', '');\n this.addTemplate('route-with-mount', '{{mount \"chat\"}}');\n\n this.engineRegistrations['template:application'] = (0, _helpers.compile)('hi {{person.name}} [{{component-with-backtracking-set person=person}}]', { moduleName: 'my-app/templates/application.hbs' });\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n person: { name: 'Alex' }\n });\n\n this.engineRegistrations['template:components/component-with-backtracking-set'] = (0, _helpers.compile)('[component {{person.name}}]', {\n moduleName: 'my-app/templates/components/component-with-backtracking-set.hbs'\n });\n this.engineRegistrations['component:component-with-backtracking-set'] = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.set('person.name', 'Ben');\n }\n });\n\n let expectedBacktrackingMessage = /modified \"person\\.name\" twice on \\[object Object\\] in a single render\\. It was rendered in \"template:my-app\\/templates\\/route-with-mount.hbs\" \\(in \"engine:chat\"\\) and modified in \"component:component-with-backtracking-set\" \\(in \"engine:chat\"\\)/;\n\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/route-with-mount');\n }, expectedBacktrackingMessage);\n });\n }\n\n ['@test it renders with a bound engine name']() {\n this.router.map(function () {\n this.route('bound-engine-name');\n });\n let controller;\n this.add('controller:bound-engine-name', _controller.default.extend({\n engineName: null,\n init() {\n this._super();\n controller = this;\n }\n }));\n this.addTemplate('bound-engine-name', '{{mount engineName}}');\n\n this.add('engine:foo', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('

Foo Engine

', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n this.add('engine:bar', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('

Bar Engine

', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n\n return this.visit('/bound-engine-name').then(() => {\n this.assertInnerHTML('');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

Foo Engine

');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', undefined));\n\n this.assertInnerHTML('');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

Foo Engine

');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'bar'));\n\n this.assertInnerHTML('

Bar Engine

');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n\n this.assertInnerHTML('

Foo Engine

');\n\n this.runTask(() => (0, _metal.set)(controller, 'engineName', null));\n\n this.assertInnerHTML('');\n });\n }\n\n ['@test it declares the event dispatcher as a singleton']() {\n this.router.map(function () {\n this.route('engine-event-dispatcher-singleton');\n });\n\n let controller;\n let component;\n\n this.add('controller:engine-event-dispatcher-singleton', _controller.default.extend({\n init() {\n this._super(...arguments);\n controller = this;\n }\n }));\n this.addTemplate('engine-event-dispatcher-singleton', '{{mount \"foo\"}}');\n\n this.add('engine:foo', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('

Foo Engine: {{tagless-component}}

', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n this.register('component:tagless-component', _helpers.Component.extend({\n tagName: '',\n init() {\n this._super(...arguments);\n component = this;\n }\n }));\n this.register('template:components/tagless-component', (0, _helpers.compile)('Tagless Component', {\n moduleName: 'my-app/templates/components/tagless-component.hbs'\n }));\n }\n }));\n\n return this.visit('/engine-event-dispatcher-singleton').then(() => {\n this.assertInnerHTML('

Foo Engine: Tagless Component

');\n\n let controllerOwnerEventDispatcher = (0, _owner.getOwner)(controller).lookup('event_dispatcher:main');\n let taglessComponentOwnerEventDispatcher = (0, _owner.getOwner)(component).lookup('event_dispatcher:main');\n\n this.assert.strictEqual(controllerOwnerEventDispatcher, taglessComponentOwnerEventDispatcher);\n });\n }\n });\n\n if (true /* EMBER_ENGINES_MOUNT_PARAMS */) {\n (0, _testCase.moduleFor)('{{mount}} params tests', class extends _testCase.ApplicationTest {\n constructor() {\n super(...arguments);\n\n this.add('engine:paramEngine', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('

Param Engine: {{model.foo}}

', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n }\n\n ['@test it renders with static parameters']() {\n this.router.map(function () {\n this.route('engine-params-static');\n });\n this.addTemplate('engine-params-static', '{{mount \"paramEngine\" model=(hash foo=\"bar\")}}');\n\n return this.visit('/engine-params-static').then(() => {\n this.assertInnerHTML('

Param Engine: bar

');\n });\n }\n\n ['@test it renders with bound parameters']() {\n this.router.map(function () {\n this.route('engine-params-bound');\n });\n let controller;\n this.add('controller:engine-params-bound', _controller.default.extend({\n boundParamValue: null,\n init() {\n this._super();\n controller = this;\n }\n }));\n this.addTemplate('engine-params-bound', '{{mount \"paramEngine\" model=(hash foo=boundParamValue)}}');\n\n return this.visit('/engine-params-bound').then(() => {\n this.assertInnerHTML('

Param Engine:

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

Param Engine: bar

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', undefined));\n\n this.assertInnerHTML('

Param Engine:

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

Param Engine: bar

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'baz'));\n\n this.assertInnerHTML('

Param Engine: baz

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n\n this.assertInnerHTML('

Param Engine: bar

');\n\n this.runTask(() => (0, _metal.set)(controller, 'boundParamValue', null));\n\n this.assertInnerHTML('

Param Engine:

');\n });\n }\n\n ['@test it renders contextual components passed as parameter values']() {\n this.router.map(function () {\n this.route('engine-params-contextual-component');\n });\n\n this.addComponent('foo-component', {\n template: `foo-component rendered! - {{app-bar-component}}`\n });\n this.addComponent('app-bar-component', {\n ComponentClass: _helpers.Component.extend({ tagName: '' }),\n template: 'rendered app-bar-component from the app'\n });\n this.add('engine:componentParamEngine', _engine.default.extend({\n router: null,\n init() {\n this._super(...arguments);\n this.register('template:application', (0, _helpers.compile)('{{model.foo}}', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n }));\n this.addTemplate('engine-params-contextual-component', '{{mount \"componentParamEngine\" model=(hash foo=(component \"foo-component\"))}}');\n\n return this.visit('/engine-params-contextual-component').then(() => {\n this.assertComponentElement(this.firstChild, {\n content: 'foo-component rendered! - rendered app-bar-component from the app'\n });\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/outlet-test', ['@ember/-internals/glimmer/tests/utils/test-case', 'internal-test-helpers', '@ember/-internals/metal'], function (_testCase, _internalTestHelpers, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('outlet view', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n\n let CoreOutlet = this.owner.factoryFor('view:-outlet');\n\n this.component = CoreOutlet.create();\n }\n\n ['@test should not error when initial rendered template is undefined']() {\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('');\n }\n\n ['@test should render the outlet when set after DOM insertion']() {\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('');\n\n this.registerTemplate('application', 'HI{{outlet}}');\n outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('index', '

BYE

');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: {},\n template: this.owner.lookup('template:index')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test should render the outlet when set before DOM insertion']() {\n this.registerTemplate('application', 'HI{{outlet}}');\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('index', '

BYE

');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: {},\n template: this.owner.lookup('template:index')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test should support an optional name']() {\n this.registerTemplate('application', '

HI

{{outlet \"special\"}}');\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('special', '

BYE

');\n outletState.outlets.special = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'special',\n controller: {},\n template: this.owner.lookup('template:special')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIBYE');\n }\n\n ['@test does not default outlet name when positional argument is present']() {\n this.registerTemplate('application', '

HI

{{outlet someUndefinedThing}}');\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('special', '

BYE

');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'special',\n controller: {},\n template: this.owner.lookup('template:special')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HI');\n }\n\n ['@test should support bound outlet name']() {\n let controller = { outletName: 'foo' };\n this.registerTemplate('application', '

HI

{{outlet outletName}}');\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller,\n template: this.owner.lookup('template:application')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('HI');\n\n this.assertStableRerender();\n\n this.registerTemplate('foo', '

FOO

');\n outletState.outlets.foo = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'foo',\n controller: {},\n template: this.owner.lookup('template:foo')\n },\n outlets: Object.create(null)\n };\n\n this.registerTemplate('bar', '

BAR

');\n outletState.outlets.bar = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'bar',\n controller: {},\n template: this.owner.lookup('template:bar')\n },\n outlets: Object.create(null)\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n this.assertText('HIFOO');\n\n this.runTask(() => (0, _metal.set)(controller, 'outletName', 'bar'));\n\n this.assertText('HIBAR');\n }\n\n ['@test outletState can pass through user code (liquid-fire initimate API) ']() {\n this.registerTemplate('outer', 'A{{#-with-dynamic-vars outletState=(identity (-get-dynamic-var \"outletState\"))}}B{{outlet}}D{{/-with-dynamic-vars}}E');\n this.registerTemplate('inner', 'C');\n\n // This looks like it doesn't do anything, but its presence\n // guarantees that the outletState gets converted from a reference\n // to a value and then back to a reference. That is what we're\n // testing here.\n this.registerHelper('identity', ([a]) => a);\n\n let outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'outer',\n controller: {},\n template: this.owner.lookup('template:outer')\n },\n outlets: {\n main: {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'inner',\n controller: {},\n template: this.owner.lookup('template:inner')\n },\n outlets: Object.create(null)\n }\n }\n };\n\n this.runTask(() => this.component.setOutletState(outletState));\n\n (0, _internalTestHelpers.runAppend)(this.component);\n\n this.assertText('ABCDE');\n\n this.assertStableRerender();\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/refinements-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/metal'], function (_testCase, _abstractTestCase, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('syntax refinements', class extends _testCase.RenderingTest {\n ['@test block params should not be refined']() {\n this.registerHelper('foo', () => 'bar helper');\n\n this.render(_abstractTestCase.strip`\n {{#with var as |foo|}}\n {{foo}}\n {{/with}}\n\n ---\n\n {{#with var as |outlet|}}\n {{outlet}}\n {{/with}}\n\n ---\n\n {{#with var as |mount|}}\n {{mount}}\n {{/with}}\n\n ---\n\n {{#with var as |component|}}\n {{component}}\n {{/with}}\n\n ---\n\n {{#with var as |input|}}\n {{input}}\n {{/with}}\n\n ---\n\n {{#with var as |-with-dynamic-vars|}}\n {{-with-dynamic-vars}}\n {{/with}}\n\n ---\n\n {{#with var as |-in-element|}}\n {{-in-element}}\n {{/with}}`, { var: 'var' });\n\n this.assertText('var---var---var---var---var---var---var');\n\n this.runTask(() => (0, _metal.set)(this.context, 'var', 'RARRR!!!'));\n\n this.assertText('RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'var', 'var'));\n\n this.assertText('var---var---var---var---var---var---var');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/render-settled-test', ['internal-test-helpers', '@ember/-internals/glimmer', 'rsvp', '@ember/runloop'], function (_internalTestHelpers, _glimmer, _rsvp, _runloop) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('renderSettled', class extends _internalTestHelpers.RenderingTestCase {\n ['@test resolves when no rendering is happening'](assert) {\n return (0, _glimmer.renderSettled)().then(() => {\n assert.ok(true, 'resolved even without rendering');\n });\n }\n\n ['@test resolves renderers exist but no runloops are triggered'](assert) {\n this.render(_internalTestHelpers.strip`{{foo}}`, { foo: 'bar' });\n\n return (0, _glimmer.renderSettled)().then(() => {\n assert.ok(true, 'resolved even without runloops');\n });\n }\n\n ['@test does not create extraneous promises'](assert) {\n let first = (0, _glimmer.renderSettled)();\n let second = (0, _glimmer.renderSettled)();\n\n assert.strictEqual(first, second);\n\n return (0, _rsvp.all)([first, second]);\n }\n\n ['@test resolves when rendering has completed (after property update)']() {\n this.render(_internalTestHelpers.strip`{{foo}}`, { foo: 'bar' });\n\n this.assertText('bar');\n this.component.set('foo', 'baz');\n this.assertText('bar');\n\n return (0, _glimmer.renderSettled)().then(() => {\n this.assertText('baz');\n });\n }\n\n ['@test resolves in run loop when renderer has settled'](assert) {\n assert.expect(3);\n\n this.render(_internalTestHelpers.strip`{{foo}}`, { foo: 'bar' });\n\n this.assertText('bar');\n let promise;\n\n return (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', null, () => {\n this.component.set('foo', 'set in actions');\n\n promise = (0, _glimmer.renderSettled)().then(() => {\n this.assertText('set in afterRender');\n });\n\n (0, _runloop.schedule)('afterRender', null, () => {\n this.component.set('foo', 'set in afterRender');\n });\n });\n\n // still not updated here\n this.assertText('bar');\n\n return promise;\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/svg-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _metal, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('SVG element tests', class extends _testCase.RenderingTest {\n ['@test unquoted viewBox property is output'](assert) {\n let viewBoxString = '0 0 100 100';\n\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n\n assert.equal(this.firstChild.getAttribute('svg'), null);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n }\n\n ['@test quoted viewBox property is output'](assert) {\n let viewBoxString = '0 0 100 100';\n\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n\n assert.equal(this.firstChild.getAttribute('svg'), null);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n }\n\n ['@test quoted viewBox property is concat']() {\n let viewBoxString = '100 100';\n\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.viewBoxString', '200 200'));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { viewBoxString }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n }\n\n ['@test class is output']() {\n this.render(\"
\", {\n model: {\n color: 'blue'\n }\n });\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => this.rerender());\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model.color', 'yellow'));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'model', { color: 'blue' }));\n\n this.assertInnerHTML(_abstractTestCase.strip`\n
\n \n
\n `);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/each-in-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/utils', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_metal, _testCase, _runtime, _abstractTestCase, _utils, _sharedConditionalTests) {\n 'use strict';\n\n function EmptyFunction() {}\n function NonEmptyFunction() {}\n NonEmptyFunction.foo = 'bar';\n class EmptyConstructor {}\n class NonEmptyConstructor {}\n NonEmptyConstructor.foo = 'bar';\n\n class TogglingEachInTest extends _sharedConditionalTests.TogglingSyntaxConditionalsTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each-in ${cond} as |key|}}${truthy}{{else}}${falsy}{{/each-in}}`;\n }\n }\n class BasicEachInTest extends TogglingEachInTest {}\n\n class BasicSyntaxTest extends BasicEachInTest {\n get truthyValue() {\n return { 'Not Empty': 1 };\n }\n\n get falsyValue() {\n return {};\n }\n }\n\n class EachInProxyTest extends TogglingEachInTest {}\n\n (0, _abstractTestCase.applyMixins)(BasicEachInTest, new _sharedConditionalTests.TruthyGenerator([{ foo: 1 }, _runtime.Object.create({ 'Not Empty': 1 }), [1], NonEmptyFunction, NonEmptyConstructor]), new _sharedConditionalTests.FalsyGenerator([null, undefined, false, '', 0, [], EmptyFunction, EmptyConstructor, {}, Object.create(null), Object.create({}), Object.create({ 'Not Empty': 1 }), _runtime.Object.create()]));\n\n (0, _abstractTestCase.applyMixins)(EachInProxyTest, new _sharedConditionalTests.TruthyGenerator([_runtime.ObjectProxy.create({ content: { 'Not empty': 1 } })]), new _sharedConditionalTests.FalsyGenerator([_runtime.ObjectProxy.create(), _runtime.ObjectProxy.create({ content: null }), _runtime.ObjectProxy.create({ content: {} }), _runtime.ObjectProxy.create({ content: Object.create(null) }), _runtime.ObjectProxy.create({ content: Object.create({}) }), _runtime.ObjectProxy.create({ content: Object.create({ 'Not Empty': 1 }) }), _runtime.ObjectProxy.create({ content: _runtime.Object.create() })]));\n\n // Truthy/Falsy tests\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with `ObjectProxy`', class extends EachInProxyTest {\n get truthyValue() {\n return _runtime.ObjectProxy.create({ content: { 'Not Empty': 1 } });\n }\n\n get falsyValue() {\n return _runtime.ObjectProxy.create({ content: null });\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}}', BasicSyntaxTest);\n\n // Rendering tests\n class AbstractEachInTest extends _testCase.RenderingTest {\n createHash() /* hash */{\n throw new Error('Not implemented: `createHash`');\n }\n\n makeHash(obj) {\n let { hash, delegate } = this.createHash(obj);\n\n this.hash = hash;\n this.delegate = delegate;\n return hash;\n }\n\n replaceHash(hash) {\n this.runTask(() => (0, _metal.set)(this.context, 'hash', this.createHash(hash).hash));\n }\n\n clear() {\n return this.runTask(() => (0, _metal.set)(this.context, 'hash', this.createHash({}).hash));\n }\n\n setProp(key, value) {\n return this.runTask(() => this.delegate.setProp(this.context, key, value));\n }\n\n updateNestedValue(key, innerKey, value) {\n return this.runTask(() => this.delegate.updateNestedValue(this.context, key, innerKey, value));\n }\n\n render(template, context = {}) {\n if (this.hash !== undefined) {\n context.hash = this.hash;\n }\n if (this.type !== undefined) {\n context.type = this.type;\n }\n context.secretKey = 'asd';\n\n return super.render(template, context);\n }\n }\n\n class EachInTest extends AbstractEachInTest {\n [`@test it repeats the given block for each item in the hash`]() {\n this.makeHash({ Smartphones: 8203, 'JavaScript Frameworks': Infinity });\n\n this.render(`
    {{#each-in hash as |category count|}}
  • {{category}}: {{count}}
  • {{else}}Empty!{{/each-in}}
`);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n // Not al backing data structures allow kvo tracking. Maps and Iterables don't\n this.setProp('Tweets', 100);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n this.clear();\n\n this.assertText('Empty!');\n }\n\n [`@test it can render sub-paths of each item`](assert) {\n this.makeHash({\n Smartphones: { reports: { unitsSold: 8203 } },\n 'JavaScript Frameworks': { reports: { unitsSold: Infinity } }\n });\n\n this.render(`
    {{#each-in hash as |category data|}}
  • {{category}}: {{data.reports.unitsSold}}
  • {{else}}Empty!{{/each-in}}
`);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n this.setProp('Tweets', { reports: { unitsSold: 100 } });\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n this.runTask(() => this.updateNestedValue('Smartphones', 'reports.unitsSold', 8204));\n\n assert.ok(this.textValue().indexOf('Smartphones: 8204') > -1);\n\n this.clear();\n\n this.assertText('Empty!');\n }\n\n [`@test it can render duplicate items`]() {\n this.makeHash({\n Smartphones: 8203,\n Tablets: 8203,\n 'JavaScript Frameworks': Infinity,\n Bugs: Infinity\n });\n\n this.render(`
    {{#each-in hash key='@identity' as |category count|}}
  • {{category}}: {{count}}
  • {{/each-in}}
`);\n\n this.assertText('Smartphones: 8203Tablets: 8203JavaScript Frameworks: InfinityBugs: Infinity');\n\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n this.setProp('Smartphones', 100);\n this.setProp('Tweets', 443115);\n this.assertText('Smartphones: 100Tablets: 8203JavaScript Frameworks: InfinityBugs: InfinityTweets: 443115');\n }\n\n this.clear();\n\n this.assertText('');\n }\n\n [`@test it repeats the given block when the hash is dynamic`]() {\n let { hash: categories } = this.createHash({\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n let { hash: otherCategories } = this.createHash({\n Emberinios: 533462,\n Tweets: 7323\n });\n let context = {\n hashes: {\n categories,\n otherCategories,\n type: 'categories'\n }\n };\n this.render(`
    {{#each-in (get hashes hashes.type) as |category count|}}
  • {{category}}: {{count}}
  • {{else}}Empty!{{/each-in}}
`, context);\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'otherCategories'));\n\n this.assertText('Emberinios: 533462Tweets: 7323');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'nonExistent'));\n\n this.clear();\n\n this.assertText('Empty!');\n\n this.runTask(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n }\n\n ['@test keying off of `undefined` does not render']() {\n this.makeHash({});\n\n this.render(`{{#each-in hash as |key value|}}{{key}}: {{value.baz}}{{else}}Empty!{{/each-in}}`);\n\n this.assertText('Empty!');\n\n this.assertStableRerender();\n\n this.replaceHash({ bar: { baz: 'Here!' } });\n\n this.assertText('bar: Here!');\n\n this.clear();\n\n this.assertText('Empty!');\n }\n\n [`@test it can render items with a key of empty string`]() {\n this.makeHash({ '': 'empty-string', a: 'a' });\n\n this.render(`
    {{#each-in hash as |key value|}}
  • {{key}}: {{value}}
  • {{else}}Empty!{{/each-in}}
`);\n\n this.assertText(': empty-stringa: a');\n\n this.assertStableRerender();\n\n this.clear();\n\n this.assertText('Empty!');\n }\n }\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with POJOs', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n\n createHash(pojo) {\n return {\n hash: pojo,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context.hash, key, value);\n },\n updateNestedValue(context, key, innerKey, value) {\n let target = context.hash[key];\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n [`@test it only iterates over an object's own properties`]() {\n let protoCategories = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n\n let categories = Object.create(protoCategories);\n categories['Televisions'] = 183;\n categories['Alarm Clocks'] = 999;\n\n this.render(`
    {{#each-in categories as |category count|}}
  • {{category}}: {{count}}
  • {{else}}Empty!{{/each-in}}
`, { categories });\n\n this.assertText('Televisions: 183Alarm Clocks: 999');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(protoCategories, 'Robots', 666);\n (0, _metal.set)(categories, 'Tweets', 443115);\n });\n\n this.assertText('Televisions: 183Alarm Clocks: 999Tweets: 443115');\n\n categories = Object.create(protoCategories);\n categories['Televisions'] = 183;\n categories['Alarm Clocks'] = 999;\n }\n\n [`@test it does not observe direct property mutations (not going through set) on the object`]() {\n this.render(_abstractTestCase.strip`\n
    \n {{#each-in categories as |category count|}}\n
  • {{category}}: {{count}}
  • \n {{/each-in}}\n
\n `, {\n categories: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 8203
  • \n
  • JavaScript Frameworks: Infinity
  • \n
\n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let categories = (0, _metal.get)(this.context, 'categories');\n delete categories.Smartphones;\n });\n\n this.assertInvariants();\n\n this.runTask(() => {\n let categories = (0, _metal.get)(this.context, 'categories');\n categories['Emberinios'] = 123456;\n });\n\n this.assertInvariants();\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'categories', {\n Emberinios: 123456\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Emberinios: 123456
  • \n
\n `);\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'categories', {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 8203
  • \n
  • JavaScript Frameworks: Infinity
  • \n
\n `);\n }\n\n ['@test it skips holes in sparse arrays']() {\n let arr = [];\n arr[5] = 'foo';\n arr[6] = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each-in arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, { arr });\n\n this.assertText('[5:foo][6:bar]');\n\n this.assertStableRerender();\n }\n\n ['@test it iterate over array with `in` instead of walking over elements']() {\n let arr = [1, 2, 3];\n arr.foo = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each-in arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, { arr });\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n\n this.runTask(() => {\n (0, _metal.set)(arr, 'zomg', 'lol');\n });\n\n this.assertText('[0:1][1:2][2:3][foo:bar][zomg:lol]');\n\n arr = [1, 2, 3];\n arr.foo = 'bar';\n\n this.runTask(() => (0, _metal.set)(this.context, 'arr', arr));\n\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with EmberObjects', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n createHash(pojo) {\n let hash = _runtime.Object.create(pojo);\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n updateNestedValue(context, key, innerKey, value) {\n let target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with object proxies', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n createHash(pojo) {\n let hash = _runtime.ObjectProxy.create({ content: pojo });\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n updateNestedValue(context, key, innerKey, value) {\n let target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n ['@test it iterates over the content, not the proxy']() {\n let content = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n\n let proxy = _runtime.ObjectProxy.create({\n content,\n foo: 'bar'\n });\n\n this.render(_abstractTestCase.strip`\n
    \n {{#each-in categories as |category count|}}\n
  • {{category}}: {{count}}
  • \n {{/each-in}}\n
\n `, { categories: proxy });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 8203
  • \n
  • JavaScript Frameworks: Infinity
  • \n
\n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n (0, _metal.set)(proxy, 'content.Smartphones', 100);\n (0, _metal.set)(proxy, 'content.Tweets', 443115);\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 100
  • \n
  • JavaScript Frameworks: Infinity
  • \n
  • Tweets: 443115
  • \n
\n `);\n\n this.runTask(() => {\n (0, _metal.set)(proxy, 'content', {\n Smartphones: 100,\n Tablets: 20\n });\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 100
  • \n
  • Tablets: 20
  • \n
\n `);\n\n this.runTask(() => (0, _metal.set)(this.context, 'categories', _runtime.ObjectProxy.create({\n content: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n })));\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • Smartphones: 8203
  • \n
  • JavaScript Frameworks: Infinity
  • \n
\n `);\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with ES6 Maps', class extends EachInTest {\n createHash(pojo) {\n let map = new Map();\n Object.keys(pojo).forEach(key => {\n map.set(key, pojo[key]);\n });\n return {\n hash: map,\n delegate: {\n updateNestedValue(context, key, innerKey, value) {\n let target = context.hash.get(key);\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n\n [`@test it supports having objects as keys on ES6 Maps`]() {\n let map = new Map();\n map.set({ name: 'one' }, 'foo');\n map.set({ name: 'two' }, 'bar');\n\n this.render(_abstractTestCase.strip`\n
    \n {{#each-in map key=\"@identity\" as |key value|}}\n
  • {{key.name}}: {{value}}
  • \n {{/each-in}}\n
`, { map });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • one: foo
  • \n
  • two: bar
  • \n
\n `);\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let map = new Map();\n map.set({ name: 'three' }, 'qux');\n (0, _metal.set)(this.context, 'map', map);\n });\n\n this.assertHTML(_abstractTestCase.strip`\n
    \n
  • three: qux
  • \n
\n `);\n }\n });\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n (0, _testCase.moduleFor)('Syntax test: {{#each-in}} with custom iterables', class extends EachInTest {\n createHash(pojo) {\n let ary = Object.keys(pojo).reduce((accum, key) => {\n return accum.concat([[key, pojo[key]]]);\n }, []);\n let iterable = {\n [Symbol.iterator]: () => makeIterator(ary)\n };\n return {\n hash: iterable,\n delegate: {\n updateNestedValue(context, key, innerKey, value) {\n let ary = Array.from(context.hash);\n let target = ary.find(([k]) => k === key)[1];\n (0, _metal.set)(target, innerKey, value);\n }\n }\n };\n }\n });\n }\n\n // Utils\n function makeIterator(ary) {\n var index = 0;\n\n return {\n next() {\n return index < ary.length ? { value: ary[index++], done: false } : { done: true };\n }\n };\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/each-test', ['@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/utils', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_metal, _abstractTestCase, _testCase, _runtime, _helpers, _utils, _sharedConditionalTests) {\n 'use strict';\n\n class ArrayDelegate {\n constructor(content, target) {\n this._array = content;\n this._target = target || this;\n }\n\n // The following methods are APIs used by the tests\n\n toArray() {\n return this._array.slice();\n }\n\n objectAt(idx) {\n return this._array[idx];\n }\n\n clear() {\n this._array.length = 0;\n this.arrayContentDidChange();\n }\n\n replace(idx, del, ins) {\n this._array.splice(idx, del, ...ins);\n this.arrayContentDidChange();\n }\n\n unshiftObject(obj) {\n this._array.unshift(obj);\n this.arrayContentDidChange();\n }\n\n unshiftObjects(arr) {\n this._array.unshift(...arr);\n this.arrayContentDidChange();\n }\n\n pushObject(obj) {\n this._array.push(obj);\n this.arrayContentDidChange();\n }\n\n pushObjects(arr) {\n this._array.push(...arr);\n this.arrayContentDidChange();\n }\n\n shiftObject() {\n let obj = this._array.shift();\n this.arrayContentDidChange();\n return obj;\n }\n\n popObject() {\n let obj = this._array.pop();\n this.arrayContentDidChange();\n return obj;\n }\n\n insertAt(idx, obj) {\n this._array.splice(idx, 0, obj);\n this.arrayContentDidChange();\n }\n\n removeAt(idx, len = 1) {\n this._array.splice(idx, len);\n this.arrayContentDidChange();\n }\n\n arrayContentDidChange() {\n (0, _metal.notifyPropertyChange)(this._target, '[]');\n (0, _metal.notifyPropertyChange)(this._target, 'length');\n }\n\n toString() {\n return `#<${this.constructor.name || 'UnknownArrayDelegate'}>`;\n }\n\n toJSON() {\n return this.toString();\n }\n }\n\n const makeSet = (() => {\n // IE11 does not support `new Set(items);`\n let set = new Set([1, 2, 3]);\n\n if (set.size === 3) {\n return items => new Set(items);\n } else {\n return items => {\n let s = new Set();\n items.forEach(value => s.add(value));\n return s;\n };\n }\n })();\n\n class SetDelegate extends ArrayDelegate {\n constructor(set) {\n let array = [];\n set.forEach(value => array.push(value));\n super(array, set);\n this._set = set;\n }\n\n arrayContentDidChange() {\n this._set.clear();\n this._array.forEach(value => this._set.add(value));\n super.arrayContentDidChange();\n }\n }\n\n class ForEachable extends ArrayDelegate {\n get length() {\n return this._array.length;\n }\n\n forEach(callback) {\n this._array.forEach(callback);\n }\n }\n\n let ArrayIterable;\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n ArrayIterable = class extends ArrayDelegate {\n [Symbol.iterator]() {\n return this._array[Symbol.iterator]();\n }\n };\n }\n\n class TogglingEachTest extends _sharedConditionalTests.TogglingSyntaxConditionalsTest {\n get truthyValue() {\n return ['non-empty'];\n }\n get falsyValue() {\n return [];\n }\n }\n\n class BasicEachTest extends TogglingEachTest {}\n\n const TRUTHY_CASES = [['hello'], (0, _runtime.A)(['hello']), makeSet(['hello']), new ForEachable(['hello']), _runtime.ArrayProxy.create({ content: ['hello'] }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) })];\n\n const FALSY_CASES = [null, undefined, false, '', 0, [], (0, _runtime.A)([]), makeSet([]), new ForEachable([]), _runtime.ArrayProxy.create({ content: [] }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)([]) })];\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n TRUTHY_CASES.push(new ArrayIterable(['hello']));\n FALSY_CASES.push(new ArrayIterable([]));\n }\n\n (0, _abstractTestCase.applyMixins)(BasicEachTest, new _sharedConditionalTests.TruthyGenerator(TRUTHY_CASES), new _sharedConditionalTests.FalsyGenerator(FALSY_CASES), _sharedConditionalTests.ArrayTestCases);\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each}}', class extends BasicEachTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each as}}', class extends BasicEachTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n class EachEdgeCasesTest extends TogglingEachTest {}\n\n (0, _abstractTestCase.applyMixins)(EachEdgeCasesTest, new _sharedConditionalTests.FalsyGenerator([true, 'hello', 1, Object, function () {}, {}, { foo: 'bar' }, Object.create(null), Object.create({}), Object.create({ foo: 'bar' })]));\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each}}', class extends EachEdgeCasesTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: toggling {{#each as}}', class extends EachEdgeCasesTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n });\n\n class AbstractEachTest extends _testCase.RenderingTest {\n /* abstract */\n createList() /* items */{\n throw new Error('Not implemented: `createList`');\n }\n\n makeList(items) {\n let { list, delegate } = this.createList(items);\n\n this.list = list;\n this.delegate = delegate;\n }\n\n replaceList(list) {\n this.runTask(() => (0, _metal.set)(this.context, 'list', this.createList(list).list));\n }\n\n forEach(callback) {\n return this.delegate.toArray().forEach(callback);\n }\n\n objectAt(idx) {\n return this.delegate.objectAt(idx);\n }\n\n clear() {\n return this.delegate.clear();\n }\n\n replace(idx, del, ins) {\n return this.delegate.replace(idx, del, ins);\n }\n\n unshiftObject(obj) {\n return this.delegate.unshiftObject(obj);\n }\n\n unshiftObjects(arr) {\n return this.delegate.unshiftObjects(arr);\n }\n\n pushObject(obj) {\n return this.delegate.pushObject(obj);\n }\n\n pushObjects(arr) {\n return this.delegate.pushObjects(arr);\n }\n\n shiftObject() {\n return this.delegate.shiftObject();\n }\n\n popObject() {\n return this.delegate.popObject();\n }\n\n insertAt(idx, obj) {\n return this.delegate.insertAt(idx, obj);\n }\n\n removeAt(idx, len) {\n return this.delegate.removeAt(idx, len);\n }\n\n render(template, context = {}) {\n if (this.list !== undefined) {\n context.list = this.list;\n }\n\n return super.render(template, context);\n }\n }\n\n class EachTest extends AbstractEachTest {\n /* single each */\n\n ['@test it repeats the given block for each item in the array']() {\n this.makeList([{ text: 'hello' }]);\n\n this.render(`{{#each list as |item|}}{{item.text}}{{else}}Empty{{/each}}`);\n\n this.assertText('hello');\n\n this.runTask(() => this.rerender());\n\n this.assertText('hello');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'text', 'Hello'));\n\n this.assertText('Hello');\n\n this.runTask(() => {\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'World' });\n });\n\n this.assertText('Hello World');\n\n this.runTask(() => {\n this.pushObject({ text: 'Earth' });\n this.removeAt(1);\n this.insertAt(1, { text: 'Globe' });\n });\n\n this.assertText('HelloGlobeWorldEarth');\n\n this.runTask(() => {\n this.pushObject({ text: 'Planet' });\n this.removeAt(1);\n this.insertAt(1, { text: ' ' });\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'Earth' });\n this.removeAt(3);\n });\n\n this.assertText('Hello WorldPlanet Earth');\n\n this.runTask(() => {\n this.pushObject({ text: 'Globe' });\n this.removeAt(1);\n this.insertAt(1, { text: ' ' });\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'World' });\n this.removeAt(2);\n });\n\n this.assertText('Hello Planet EarthGlobe World');\n\n this.runTask(() => this.replace(2, 4, [{ text: 'my' }]));\n\n this.assertText('Hello my World');\n\n this.runTask(() => this.clear());\n\n this.assertText('Empty');\n\n this.replaceList([{ text: 'hello' }]);\n\n this.assertText('hello');\n }\n\n ['@test it receives the index as the second parameter']() {\n this.makeList([{ text: 'hello' }, { text: 'world' }]);\n\n this.render(`{{#each list as |item index|}}[{{index}}. {{item.text}}]{{/each}}`);\n\n this.assertText('[0. hello][1. world]');\n\n this.assertStableRerender();\n\n this.runTask(() => this.insertAt(1, { text: 'my' }));\n\n this.assertText('[0. hello][1. my][2. world]');\n\n this.replaceList([{ text: 'hello' }, { text: 'world' }]);\n\n this.assertText('[0. hello][1. world]');\n }\n\n ['@test it accepts a string key']() {\n this.makeList([{ text: 'hello' }, { text: 'world' }]);\n\n this.render(`{{#each list key='text' as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('helloworld');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ text: 'again' }));\n\n this.assertText('helloworldagain');\n\n this.replaceList([{ text: 'hello' }, { text: 'world' }]);\n\n this.assertText('helloworld');\n }\n\n ['@test it accepts a numeric key']() {\n this.makeList([{ id: 1 }, { id: 2 }]);\n\n this.render(`{{#each list key='id' as |item|}}{{item.id}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ id: 3 }));\n\n this.assertText('123');\n\n this.replaceList([{ id: 1 }, { id: 2 }]);\n\n this.assertText('12');\n }\n\n ['@test it can specify @index as the key']() {\n this.makeList([{ id: 1 }, { id: 2 }]);\n\n this.render(`{{#each list key='@index' as |item|}}{{item.id}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject({ id: 3 }));\n\n this.assertText('123');\n\n this.replaceList([{ id: 1 }, { id: 2 }]);\n\n this.assertText('12');\n }\n\n ['@test it can specify @identity as the key for arrays of primitives']() {\n this.makeList([1, 2]);\n\n this.render(`{{#each list key='@identity' as |item|}}{{item}}{{/each}}`);\n\n this.assertText('12');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject(3));\n\n this.assertText('123');\n\n this.replaceList([1, 2]);\n\n this.assertText('12');\n }\n\n ['@test it can specify @identity as the key for mixed arrays of objects and primitives']() {\n this.makeList([1, { id: 2 }, 3]);\n\n this.render(`{{#each list key='@identity' as |item|}}{{if item.id item.id item}}{{/each}}`);\n\n this.assertText('123');\n\n this.assertStableRerender();\n\n this.runTask(() => this.insertAt(2, { id: 4 }));\n\n this.assertText('1243');\n\n this.replaceList([1, { id: 2 }, 3]);\n\n this.assertText('123');\n }\n\n ['@test it can render duplicate primitive items']() {\n this.makeList(['a', 'a', 'a']);\n\n this.render(`{{#each list as |item|}}{{item}}{{/each}}`);\n\n this.assertText('aaa');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject('a'));\n\n this.assertText('aaaa');\n\n this.runTask(() => this.pushObject('a'));\n\n this.assertText('aaaaa');\n\n this.replaceList(['a', 'a', 'a']);\n\n this.assertText('aaa');\n }\n\n [`@test updating and setting within #each`]() {\n this.makeList([{ value: 1 }, { value: 2 }, { value: 3 }]);\n\n let FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n this.isEven = true;\n this.tagName = 'li';\n },\n\n _isEven() {\n this.set('isEven', this.get('item.value') % 2 === 0);\n },\n\n didUpdate() {\n this._isEven();\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{#if isEven}}{{item.value}}{{/if}}'\n });\n\n this.render(_abstractTestCase.strip`\n {{#each list as |item|}}\n
  • Prev
  • \n {{foo-bar item=item}}\n
  • Next
  • \n {{/each}}\n `);\n\n this.assertText('Prev1NextPrev2NextPrev3Next');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'value', 3));\n\n this.assertText('PrevNextPrev2NextPrev3Next');\n\n this.replaceList([{ value: 1 }, { value: 2 }, { value: 3 }]);\n\n this.assertText('Prev1NextPrev2NextPrev3Next');\n }\n\n ['@test it can render duplicate objects']() {\n let duplicateItem = { text: 'foo' };\n\n this.makeList([duplicateItem, duplicateItem, { text: 'bar' }, { text: 'baz' }]);\n\n this.render(`{{#each list as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('foofoobarbaz');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObject(duplicateItem));\n\n this.assertText('foofoobarbazfoo');\n\n this.runTask(() => this.pushObject(duplicateItem));\n\n this.assertText('foofoobarbazfoofoo');\n\n this.replaceList([duplicateItem, duplicateItem, { text: 'bar' }, { text: 'baz' }]);\n\n this.assertText('foofoobarbaz');\n }\n\n [`@test it maintains DOM stability when condition changes between objects with the same keys`]() {\n this.makeList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('Hello world');\n\n this.takeSnapshot();\n\n this.runTask(() => {\n this.popObject();\n this.popObject();\n this.pushObject({ text: ' ' });\n this.pushObject({ text: 'world' });\n });\n\n this.assertText('Hello world');\n\n this.assertInvariants();\n\n this.replaceList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.assertText('Hello world');\n\n this.assertInvariants();\n }\n\n [`@test it maintains DOM stability for stable keys when list is updated`]() {\n this.makeList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('Hello world');\n\n this.assertStableRerender();\n\n let oldSnapshot = this.takeSnapshot();\n\n this.runTask(() => {\n this.unshiftObject({ text: ', ' });\n this.unshiftObject({ text: 'Hi' });\n this.pushObject({ text: '!' });\n this.pushObject({ text: 'earth' });\n });\n\n this.assertText('Hi, Hello world!earth');\n\n this.assertPartialInvariants(2, 5);\n\n this.replaceList([{ text: 'Hello' }, { text: ' ' }, { text: 'world' }]);\n\n this.assertText('Hello world');\n\n this.assertInvariants(oldSnapshot, this.takeSnapshot());\n }\n\n [`@test it renders all items with duplicate key values`]() {\n this.makeList([{ text: 'Hello' }, { text: 'Hello' }, { text: 'Hello' }]);\n\n this.render(`{{#each list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n\n this.assertText('HelloHelloHello');\n\n this.runTask(() => {\n this.forEach(hash => (0, _metal.set)(hash, 'text', 'Goodbye'));\n });\n\n this.assertText('GoodbyeGoodbyeGoodbye');\n\n this.replaceList([{ text: 'Hello' }, { text: 'Hello' }, { text: 'Hello' }]);\n\n this.assertText('HelloHelloHello');\n }\n\n ['@test context is not changed to the inner scope inside an {{#each as}} block']() {\n this.makeList([{ name: 'Chad' }, { name: 'Zack' }, { name: 'Asa' }]);\n\n this.render(`{{name}}-{{#each list as |person|}}{{name}}{{/each}}-{{name}}`, {\n name: 'Joel'\n });\n\n this.assertText('Joel-JoelJoelJoel-Joel');\n\n this.assertStableRerender();\n\n this.runTask(() => this.shiftObject());\n\n this.assertText('Joel-JoelJoel-Joel');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Godfrey'));\n\n this.assertText('Godfrey-GodfreyGodfrey-Godfrey');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Joel'));\n this.replaceList([{ name: 'Chad' }, { name: 'Zack' }, { name: 'Asa' }]);\n\n this.assertText('Joel-JoelJoelJoel-Joel');\n }\n\n ['@test can access the item and the original scope']() {\n this.makeList([{ name: 'Tom Dale' }, { name: 'Yehuda Katz' }, { name: 'Godfrey Chan' }]);\n\n this.render(`{{#each list key=\"name\" as |person|}}[{{title}}: {{person.name}}]{{/each}}`, {\n title: 'Señor Engineer'\n });\n\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n\n this.runTask(() => {\n (0, _metal.set)(this.objectAt(1), 'name', 'Stefan Penner');\n this.removeAt(0);\n this.pushObject({ name: 'Tom Dale' });\n this.insertAt(1, { name: 'Chad Hietala' });\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('[Principal Engineer: Stefan Penner][Principal Engineer: Chad Hietala][Principal Engineer: Godfrey Chan][Principal Engineer: Tom Dale]');\n\n this.runTask(() => (0, _metal.set)(this.context, 'title', 'Señor Engineer'));\n this.replaceList([{ name: 'Tom Dale' }, { name: 'Yehuda Katz' }, { name: 'Godfrey Chan' }]);\n\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n }\n\n ['@test the scoped variable is not available outside the {{#each}} block.']() {\n this.makeList(['Yehuda']);\n\n this.render(`{{name}}-{{#each list as |name|}}{{name}}{{/each}}-{{name}}`, {\n name: 'Stef'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.pushObjects([' ', 'Katz']));\n\n this.assertText('Stef-Yehuda Katz-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Yehuda Katz-Tom');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Stef'));\n this.replaceList(['Yehuda']);\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test inverse template is displayed with context']() {\n this.makeList([]);\n\n this.render(`{{#each list as |thing|}}Has Thing{{else}}No Thing {{otherThing}}{{/each}}`, {\n otherThing: 'bar'\n });\n\n this.assertText('No Thing bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Thing bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'biz'));\n\n this.assertText('No Thing biz');\n\n this.runTask(() => this.pushObject('non-empty'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'baz'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'bar'));\n this.replaceList([]);\n\n this.assertText('No Thing bar');\n }\n\n ['@test content that are not initially present updates correctly GH#13983']() {\n // The root cause of this bug is that Glimmer did not call `didInitializeChildren`\n // on the inserted `TryOpcode`, causing that `TryOpcode` to have an uninitialized\n // tag. Currently the only way to observe this the \"JUMP-IF-NOT-MODIFIED\", i.e. by\n // wrapping it in an component.\n\n this.registerComponent('x-wrapper', { template: '{{yield}}' });\n\n this.makeList([]);\n\n this.render(`{{#x-wrapper}}{{#each list as |obj|}}[{{obj.text}}]{{/each}}{{/x-wrapper}}`);\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => this.pushObject({ text: 'foo' }));\n\n this.assertText('[foo]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(0), 'text', 'FOO'));\n\n this.assertText('[FOO]');\n\n this.runTask(() => this.pushObject({ text: 'bar' }));\n\n this.assertText('[FOO][bar]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(1), 'text', 'BAR'));\n\n this.assertText('[FOO][BAR]');\n\n this.runTask(() => (0, _metal.set)(this.objectAt(1), 'text', 'baz'));\n\n this.assertText('[FOO][baz]');\n\n this.runTask(() => this.replace(1, 1, [{ text: 'BAZ' }]));\n\n this.assertText('[FOO][BAZ]');\n\n this.replaceList([]);\n\n this.assertText('');\n }\n\n ['@test empty trusted content clears properly [GH#16314]']() {\n this.makeList(['hello']);\n\n this.render(`before {{#each list as |value|}}{{{value}}}{{/each}} after`);\n\n this.assertText('before hello after');\n\n this.assertStableRerender();\n\n this.runTask(() => this.pushObjects([null, ' world']));\n\n this.assertText('before hello world after');\n\n this.runTask(() => this.replace(1, 2, [undefined, ' world!']));\n\n this.assertText('before hello world! after');\n\n this.runTask(() => this.replace(1, 2, [(0, _helpers.htmlSafe)(''), ' world!!']));\n\n this.assertText('before hello world!! after');\n\n this.replaceList(['hello']);\n\n this.assertText('before hello after');\n }\n\n /* multi each */\n\n ['@test re-using the same variable with different {{#each}} blocks does not override each other']() {\n let admins = this.createList([{ name: 'Tom Dale' }]);\n let users = this.createList([{ name: 'Yehuda Katz' }]);\n\n this.render(`Admin: {{#each admins key=\"name\" as |person|}}[{{person.name}}]{{/each}} User: {{#each users key=\"name\" as |person|}}[{{person.name}}]{{/each}}`, {\n admins: admins.list,\n users: users.list\n });\n\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n\n this.runTask(() => {\n admins.delegate.pushObject({ name: 'Godfrey Chan' });\n (0, _metal.set)(users.delegate.objectAt(0), 'name', 'Stefan Penner');\n });\n\n this.assertText('Admin: [Tom Dale][Godfrey Chan] User: [Stefan Penner]');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admins', this.createList([{ name: 'Tom Dale' }]).list);\n (0, _metal.set)(this.context, 'users', this.createList([{ name: 'Yehuda Katz' }]).list);\n });\n\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n }\n\n [`@test an outer {{#each}}'s scoped variable does not clobber an inner {{#each}}'s property if they share the same name - Issue #1315`]() {\n let content = this.createList(['X', 'Y']);\n let options = this.createList([{ label: 'One', value: 1 }, { label: 'Two', value: 2 }]);\n\n this.render(_abstractTestCase.strip`\n {{#each content as |value|}}\n {{value}}-\n {{#each options as |option|}}\n {{option.value}}:{{option.label}}\n {{/each}}\n {{/each}}\n `, {\n content: content.list,\n options: options.list\n });\n\n this.assertText('X-1:One2:TwoY-1:One2:Two');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n content.delegate.pushObject('Z');\n (0, _metal.set)(options.delegate.objectAt(0), 'value', 0);\n });\n\n this.assertText('X-0:One2:TwoY-0:One2:TwoZ-0:One2:Two');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'content', this.createList(['X', 'Y']).list);\n (0, _metal.set)(this.context, 'options', this.createList([{ label: 'One', value: 1 }, { label: 'Two', value: 2 }]).list);\n });\n\n this.assertText('X-1:One2:TwoY-1:One2:Two');\n }\n\n ['@test the scoped variable is not available outside the {{#each}} block']() {\n let first = this.createList(['Limbo']);\n let fifth = this.createList(['Wrath']);\n let ninth = this.createList(['Treachery']);\n\n this.render(`{{ring}}-{{#each first as |ring|}}{{ring}}-{{#each fifth as |ring|}}{{ring}}-{{#each ninth as |ring|}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}`, {\n ring: 'Greed',\n first: first.list,\n fifth: fifth.list,\n ninth: ninth.list\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n fifth.delegate.insertAt(0, 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Wrath-Treachery-Wrath-Limbo-O');\n\n this.runTask(() => {\n first.delegate.pushObject('I');\n ninth.delegate.replace(0, 1, ['K']);\n });\n\n this.assertText('O-Limbo-D-K-D-Wrath-K-Wrath-Limbo-I-D-K-D-Wrath-K-Wrath-I-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'Greed');\n (0, _metal.set)(this.context, 'first', this.createList(['Limbo']).list);\n (0, _metal.set)(this.context, 'fifth', this.createList(['Wrath']).list);\n (0, _metal.set)(this.context, 'ninth', this.createList(['Treachery']).list);\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#each name as |foo|}}, then {{#each foo as |bar|}}']() {\n let inner = this.createList(['caterpillar']);\n let outer = this.createList([inner.list]);\n\n this.render(`{{#each name key=\"@index\" as |foo|}}{{#each foo as |bar|}}{{bar}}{{/each}}{{/each}}`, {\n name: outer.list\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => {\n inner.delegate.replace(0, 1, ['lady']);\n outer.delegate.pushObject(this.createList(['bird']).list);\n });\n\n this.assertText('ladybird');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', this.createList([this.createList(['caterpillar']).list]).list));\n\n this.assertText('caterpillar');\n }\n }\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with native arrays', class extends EachTest {\n createList(items) {\n return { list: items, delegate: new ArrayDelegate(items, items) };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with emberA-wrapped arrays', class extends EachTest {\n createList(items) {\n let wrapped = (0, _runtime.A)(items);\n return { list: wrapped, delegate: wrapped };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with native Set', class extends EachTest {\n createList(items) {\n let set = makeSet(items);\n return { list: set, delegate: new SetDelegate(set) };\n }\n\n ['@test it can render duplicate primitive items'](assert) {\n assert.ok(true, 'not supported by Set');\n }\n\n ['@test it can render duplicate objects'](assert) {\n assert.ok(true, 'not supported by Set');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array-like objects implementing forEach', class extends EachTest {\n createList(items) {\n let forEachable = new ForEachable(items);\n return { list: forEachable, delegate: forEachable };\n }\n });\n\n if (_utils.HAS_NATIVE_SYMBOL) {\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array-like objects implementing Symbol.iterator', class extends EachTest {\n createList(items) {\n let iterable = new ArrayIterable(items);\n return { list: iterable, delegate: iterable };\n }\n });\n }\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array proxies, modifying itself', class extends EachTest {\n createList(items) {\n let proxty = _runtime.ArrayProxy.create({ content: (0, _runtime.A)(items) });\n return { list: proxty, delegate: proxty };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with array proxies, replacing its content', class extends EachTest {\n createList(items) {\n let wrapped = (0, _runtime.A)(items);\n return {\n list: wrapped,\n delegate: _runtime.ArrayProxy.create({ content: wrapped })\n };\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each as}} undefined path', class extends _testCase.RenderingTest {\n ['@test keying off of `undefined` does not render']() {\n this.render(_abstractTestCase.strip`\n {{#each foo.bar.baz as |thing|}}\n {{thing}}\n {{/each}}`, { foo: {} });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: ['Here!'] } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#each}} with sparse arrays', class extends _testCase.RenderingTest {\n ['@test it should itterate over holes']() {\n let sparseArray = [];\n sparseArray[3] = 'foo';\n sparseArray[4] = 'bar';\n\n this.render(_abstractTestCase.strip`\n {{#each list as |value key|}}\n [{{key}}:{{value}}]\n {{/each}}`, { list: (0, _runtime.A)(sparseArray) });\n\n this.assertText('[0:][1:][2:][3:foo][4:bar]');\n\n this.assertStableRerender();\n\n this.runTask(() => {\n let list = (0, _metal.get)(this.context, 'list');\n list.pushObject('baz');\n });\n\n this.assertText('[0:][1:][2:][3:foo][4:bar][5:baz]');\n }\n });\n\n /* globals MutationObserver: false */\n if (typeof MutationObserver === 'function') {\n (0, _testCase.moduleFor)('Syntax test: {{#each as}} DOM mutation test', class extends _testCase.RenderingTest {\n constructor() {\n super(...arguments);\n this.observer = null;\n }\n\n observe(element) {\n let observer = this.observer = new MutationObserver(function () {});\n observer.observe(element, { childList: true, characterData: true });\n }\n\n teardown() {\n if (this.observer) {\n this.observer.disconnect();\n }\n\n super.teardown();\n }\n\n assertNoMutation() {\n this.assert.deepEqual(this.observer.takeRecords(), [], 'Expected no mutations');\n }\n\n expectMutations() {\n this.assert.ok(this.observer.takeRecords().length > 0, 'Expected some mutations');\n }\n\n ['@test {{#each}} should not mutate a subtree when the array has not changed [GH #14332]']() {\n let page = { title: 'Blog Posts' };\n\n let model = [{ title: 'Rails is omakase' }, { title: 'Ember is omakase' }];\n\n this.render(_abstractTestCase.strip`\n

    {{page.title}}

    \n\n
      \n {{#each model as |post|}}\n
    • {{post.title}}
    • \n {{/each}}\n
    \n `, { page, model });\n\n this.assertHTML(_abstractTestCase.strip`\n

    Blog Posts

    \n\n
      \n
    • Rails is omakase
    • \n
    • Ember is omakase
    • \n
    \n `);\n\n this.observe(this.$('#posts')[0]);\n\n // MutationObserver is async\n return _runtime.RSVP.Promise.resolve(() => {\n this.assertStableRerender();\n }).then(() => {\n this.assertNoMutation();\n\n this.runTask(() => (0, _metal.set)(this.context, 'page', { title: 'Essays' }));\n\n this.assertHTML(_abstractTestCase.strip`\n

    Essays

    \n\n
      \n
    • Rails is omakase
    • \n
    • Ember is omakase
    • \n
    \n `);\n }).then(() => {\n this.assertNoMutation();\n\n this.runTask(() => (0, _metal.set)(this.context.page, 'title', 'Think Pieces™'));\n\n this.assertHTML(_abstractTestCase.strip`\n

    Think Pieces™

    \n\n
      \n
    • Rails is omakase
    • \n
    • Ember is omakase
    • \n
    \n `);\n }).then(() => {\n // The last set is localized to the `page` object, so we do not expect Glimmer\n // to re-iterate the list\n this.assertNoMutation();\n });\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/experimental-syntax-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer'], function (_testCase, _abstractTestCase, _glimmer) {\n 'use strict';\n\n (0, _testCase.moduleFor)('registerMacros', class extends _testCase.RenderingTest {\n constructor() {\n let originalMacros = _glimmer._experimentalMacros.slice();\n\n (0, _glimmer._registerMacros)(blocks => {\n blocks.add('-let', (params, hash, _default, inverse, builder) => {\n builder.compileParams(params);\n builder.invokeStaticBlock(_default, params.length);\n });\n });\n\n super(...arguments);\n this.originalMacros = originalMacros;\n }\n\n teardown() {\n _glimmer._experimentalMacros.length = 0;\n this.originalMacros.forEach(macro => _glimmer._experimentalMacros.push(macro));\n\n super.teardown();\n }\n\n ['@test allows registering custom syntax via private API']() {\n this.render(_abstractTestCase.strip`\n {{#-let obj as |bar|}}\n {{bar}}\n {{/-let}}\n `, { obj: 'hello world!' });\n\n this.assertText('hello world!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/if-unless-test', ['@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/runtime', '@ember/-internals/metal', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests'], function (_helpers, _runtime, _metal, _abstractTestCase, _testCase, _sharedConditionalTests) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#unless}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#unless ${cond}}}${falsy}{{else}}${truthy}{{/unless}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}} and {{#unless}} without inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#if ${cond}}}${truthy}{{/if}}{{#unless ${cond}}}${falsy}{{/unless}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#if}}', class extends _testCase.RenderingTest {\n ['@test using `if` with an `{{each}}` destroys components when transitioning to and from inverse (GH #12267)'](assert) {\n let destroyedChildrenCount = 0;\n\n this.registerComponent('foo-bar', {\n template: '{{number}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n destroyedChildrenCount++;\n }\n })\n });\n\n this.render(_abstractTestCase.strip`\n {{#if cond}}\n {{#each numbers as |number|}}\n {{foo-bar number=number}}\n {{/each}}\n {{else}}\n Nothing Here!\n {{/if}}`, { cond: true, numbers: (0, _runtime.A)([1, 2, 3]) });\n\n this.assertText('123');\n\n this.runTask(() => this.rerender());\n\n this.assertText('123');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Nothing Here!');\n assert.equal(destroyedChildrenCount, 3, 'the children were properly destroyed');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('123');\n }\n\n ['@test looking up `undefined` property defaults to false']() {\n this.render(_abstractTestCase.strip`\n {{#if foo.bar.baz}}\n Here!\n {{else}}\n Nothing Here!\n {{/if}}`, { foo: {} });\n\n this.assertText('Nothing Here!');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Nothing Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: true } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('Nothing Here!');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/in-element-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/test-helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer', '@ember/-internals/metal'], function (_testCase, _testHelpers, _abstractTestCase, _glimmer, _metal) {\n 'use strict';\n\n (0, _testCase.moduleFor)('{{-in-element}}', class extends _testCase.RenderingTest {\n ['@test using {{#in-element whatever}} asserts']() {\n // the in-element keyword is not yet public API this test should be removed\n // once https://github.com/emberjs/rfcs/pull/287 lands and is enabled\n\n let el = document.createElement('div');\n expectAssertion(() => {\n this.render(_abstractTestCase.strip`{{#in-element el}}{{/in-element}}`, { el });\n }, /The {{in-element}} helper cannot be used. \\('-top-level' @ L1:C0\\)/);\n }\n\n ['@test allows rendering into an external element']() {\n let someElement = document.createElement('div');\n\n this.render(_abstractTestCase.strip`\n {{#-in-element someElement}}\n {{text}}\n {{/-in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Whoop!');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Huzzah!!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Huzzah!!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, 'Whoop!');\n }\n\n ['@test components are cleaned up properly'](assert) {\n let hooks = [];\n\n let someElement = document.createElement('div');\n\n this.registerComponent('modal-display', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n hooks.push('didInsertElement');\n },\n\n willDestroyElement() {\n hooks.push('willDestroyElement');\n }\n }),\n\n template: `{{text}}`\n });\n\n this.render(_abstractTestCase.strip`\n {{#if showModal}}\n {{#-in-element someElement}}\n {{modal-display text=text}}\n {{/-in-element}}\n {{/if}}\n `, {\n someElement,\n text: 'Whoop!',\n showModal: false\n });\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, '');\n\n this.assertStableRerender();\n\n this.runTask(() => (0, _metal.set)(this.context, 'showModal', true));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Huzzah!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Huzzah!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n\n this.runTask(() => (0, _metal.set)(this.context, 'showModal', false));\n\n (0, _testHelpers.equalTokens)(this.element, '');\n (0, _testHelpers.equalTokens)(someElement, '');\n\n assert.deepEqual(hooks, ['didInsertElement', 'willDestroyElement']);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/let-test', ['@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_metal, _runtime, _testCase, _abstractTestCase) {\n 'use strict';\n\n if (true /* EMBER_TEMPLATE_BLOCK_LET_HELPER */) {\n (0, _testCase.moduleFor)('Syntax test: {{#let as}}', class extends _testCase.RenderingTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#let ${cond} as |test|}}${truthy}{{else}}${falsy}{{/let}}`;\n }\n\n ['@test it renders the block if `undefined` is passed as an argument']() {\n this.render(_abstractTestCase.strip`\n {{#let foo.bar.baz as |thing|}}\n value: \"{{thing}}\"\n {{/let}}`, { foo: {} });\n\n this.assertText('value: \"\"');\n\n this.runTask(() => this.rerender());\n\n this.assertText('value: \"\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: 'Here!' } }));\n\n this.assertText('value: \"Here!\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('value: \"\"');\n }\n\n ['@test it renders the block if arguments are falsey']() {\n this.render(`{{#let cond1 cond2 as |cond|}}value: \"{{cond1}}\"{{/let}}`, {\n cond1: false\n });\n\n this.assertText('value: \"false\"');\n\n this.runTask(() => this.rerender());\n\n this.assertText('value: \"false\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', ''));\n\n this.assertText('value: \"\"');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', 0));\n\n this.assertText('value: \"0\"');\n }\n\n ['@test it yields multiple arguments in order']() {\n this.render(`{{#let foo bar baz.name as |a b c|}}{{a}} {{b}} {{c}}{{/let}}`, {\n foo: 'Señor Engineer',\n bar: '',\n baz: { name: 'Dale' }\n });\n\n this.assertText('Señor Engineer Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'bar', 'Tom'));\n\n this.assertText('Señor Engineer Tom Dale');\n }\n\n ['@test can access alias and original scope']() {\n this.render(`{{#let person as |tom|}}{{title}}: {{tom.name}}{{/let}}`, {\n title: 'Señor Engineer',\n person: { name: 'Tom Dale' }\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person.name', 'Yehuda Katz');\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('Principal Engineer: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'title', 'Señor Engineer');\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n }\n\n ['@test the scoped variable is not available outside the {{#let}} block.']() {\n this.render(`{{name}}-{{#let other as |name|}}{{name}}{{/let}}-{{name}}`, {\n name: 'Stef',\n other: 'Yehuda'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'other', 'Chad'));\n\n this.assertText('Stef-Chad-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Chad-Tom');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'Stef');\n (0, _metal.set)(this.context, 'other', 'Yehuda');\n });\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test can access alias of a proxy']() {\n this.render(`{{#let proxy as |person|}}{{person.name}}{{/let}}`, {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertText('Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Tom Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Yehuda Katz'));\n\n this.assertText('Yehuda Katz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Stefan Penner'));\n\n this.assertText('Stefan Penner');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertText('Tom Dale');\n }\n\n ['@test can access alias of an array']() {\n this.render(`{{#let arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/let}}`, {\n arrayThing: (0, _runtime.A)(['Hello', ' ', 'world'])\n });\n\n this.assertText('Hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello world');\n\n this.runTask(() => {\n let array = (0, _metal.get)(this.context, 'arrayThing');\n array.replace(0, 1, ['Goodbye']);\n (0, _runtime.removeAt)(array, 1);\n array.insertAt(1, ', ');\n array.pushObject('!');\n });\n\n this.assertText('Goodbye, world!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'arrayThing', ['Hello', ' ', 'world']));\n\n this.assertText('Hello world');\n }\n\n ['@test `attrs` can be used as a block param [GH#14678]']() {\n this.render('{{#let hash as |attrs|}}[{{hash.foo}}-{{attrs.foo}}]{{/let}}', {\n hash: { foo: 'foo' }\n });\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.context.set('hash.foo', 'FOO'));\n\n this.assertText('[FOO-FOO]');\n\n this.runTask(() => this.context.set('hash.foo', 'foo'));\n\n this.assertText('[foo-foo]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: Multiple {{#let as}} helpers', class extends _testCase.RenderingTest {\n ['@test re-using the same variable with different {{#let}} blocks does not override each other']() {\n this.render(`Admin: {{#let admin as |person|}}{{person.name}}{{/let}} User: {{#let user as |person|}}{{person.name}}{{/let}}`, {\n admin: { name: 'Tom Dale' },\n user: { name: 'Yehuda Katz' }\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin.name', 'Godfrey Chan');\n (0, _metal.set)(this.context, 'user.name', 'Stefan Penner');\n });\n\n this.assertText('Admin: Godfrey Chan User: Stefan Penner');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'user', { name: 'Yehuda Katz' });\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n }\n\n ['@test the scoped variable is not available outside the {{#let}} block']() {\n this.render(`{{ring}}-{{#let first as |ring|}}{{ring}}-{{#let fifth as |ring|}}{{ring}}-{{#let ninth as |ring|}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}`, {\n ring: 'Greed',\n first: 'Limbo',\n fifth: 'Wrath',\n ninth: 'Treachery'\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n (0, _metal.set)(this.context, 'fifth', 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Limbo-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'I');\n (0, _metal.set)(this.context, 'ninth', 'K');\n });\n\n this.assertText('O-I-D-K-D-I-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'Greed');\n (0, _metal.set)(this.context, 'first', 'Limbo');\n (0, _metal.set)(this.context, 'fifth', 'Wrath');\n (0, _metal.set)(this.context, 'ninth', 'Treachery');\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#let name as |foo|}}, then {{#let foo as |bar|}}']() {\n this.render(`{{#let name as |foo|}}{{#let foo as |bar|}}{{bar}}{{/let}}{{/let}}`, {\n name: 'caterpillar'\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'butterfly'));\n\n this.assertText('butterfly');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'caterpillar'));\n\n this.assertText('caterpillar');\n }\n\n ['@test updating the context should update the alias']() {\n this.render(`{{#let this as |person|}}{{person.name}}{{/let}}`, {\n name: 'Los Pivots'\n });\n\n this.assertText('Los Pivots');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Los Pivots');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', \"l'Pivots\"));\n\n this.assertText(\"l'Pivots\");\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Los Pivots'));\n\n this.assertText('Los Pivots');\n }\n\n ['@test nested {{#let}} blocks should have access to root context']() {\n this.render(_abstractTestCase.strip`\n {{name}}\n {{#let committer1.name as |name|}}\n [{{name}}\n {{#let committer2.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n {{#let committer2.name as |name|}}\n [{{name}}\n {{#let committer1.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n `, {\n name: 'ebryn',\n committer1: { name: 'trek' },\n committer2: { name: 'machty' }\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'chancancode'));\n\n this.assertText('chancancode[trek[machty]trek]chancancode[machty[trek]machty]chancancode');\n\n this.runTask(() => (0, _metal.set)(this.context, 'committer1', { name: 'krisselden' }));\n\n this.assertText('chancancode[krisselden[machty]krisselden]chancancode[machty[krisselden]machty]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'committer1.name', 'wycats');\n (0, _metal.set)(this.context, 'committer2', { name: 'rwjblue' });\n });\n\n this.assertText('chancancode[wycats[rwjblue]wycats]chancancode[rwjblue[wycats]rwjblue]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'ebryn');\n (0, _metal.set)(this.context, 'committer1', { name: 'trek' });\n (0, _metal.set)(this.context, 'committer2', { name: 'machty' });\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n }\n });\n }\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/with-dynamic-var-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_testCase, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('{{-with-dynamic-var}}', class extends _testCase.RenderingTest {\n ['@test does not allow setting values other than outletState']() {\n expectAssertion(() => {\n this.render(_abstractTestCase.strip`\n {{#-with-dynamic-vars foo=\"bar\"}}\n {{-get-dynamic-var 'foo'}}\n {{/-with-dynamic-vars}}\n `);\n }, /Using `-with-dynamic-scope` is only supported for `outletState` \\(you used `foo`\\)./);\n }\n\n ['@test allows setting/getting outletState']() {\n // this is simply asserting that we can write and read outletState\n // the actual value being used here is not what is used in real life\n // feel free to change the value being set and asserted as needed\n this.render(_abstractTestCase.strip`\n {{#-with-dynamic-vars outletState=\"bar\"}}\n {{-get-dynamic-var 'outletState'}}\n {{/-with-dynamic-vars}}\n `);\n\n this.assertText('bar');\n }\n\n ['@test does not allow setting values other than outletState']() {\n expectAssertion(() => {\n this.render(`{{-get-dynamic-var 'foo'}}`);\n }, /Using `-get-dynamic-scope` is only supported for `outletState` \\(you used `foo`\\)./);\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/integration/syntax/with-test', ['@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/shared-conditional-tests', '@ember/-internals/glimmer/tests/utils/abstract-test-case'], function (_metal, _runtime, _testCase, _sharedConditionalTests, _abstractTestCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Syntax test: {{#with}}', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#with ${cond}}}${truthy}{{else}}${falsy}{{/with}}`;\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: {{#with as}}', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({ cond, truthy, falsy }) {\n return `{{#with ${cond} as |test|}}${truthy}{{else}}${falsy}{{/with}}`;\n }\n\n ['@test keying off of `undefined` does not render']() {\n this.render(_abstractTestCase.strip`\n {{#with foo.bar.baz as |thing|}}\n {{thing}}\n {{/with}}`, { foo: {} });\n\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', { bar: { baz: 'Here!' } }));\n\n this.assertText('Here!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'foo', {}));\n\n this.assertText('');\n }\n\n ['@test it renders and hides the given block based on the conditional']() {\n this.render(`{{#with cond1 as |cond|}}{{cond.greeting}}{{else}}False{{/with}}`, {\n cond1: { greeting: 'Hello' }\n });\n\n this.assertText('Hello');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.greeting', 'Hello world'));\n\n this.assertText('Hello world');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', false));\n\n this.assertText('False');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', { greeting: 'Hello' }));\n\n this.assertText('Hello');\n }\n\n ['@test can access alias and original scope']() {\n this.render(`{{#with person as |tom|}}{{title}}: {{tom.name}}{{/with}}`, {\n title: 'Señor Engineer',\n person: { name: 'Tom Dale' }\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Señor Engineer: Tom Dale');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person.name', 'Yehuda Katz');\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n\n this.assertText('Principal Engineer: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'person', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'title', 'Señor Engineer');\n });\n\n this.assertText('Señor Engineer: Tom Dale');\n }\n\n ['@test the scoped variable is not available outside the {{#with}} block.']() {\n this.render(`{{name}}-{{#with other as |name|}}{{name}}{{/with}}-{{name}}`, {\n name: 'Stef',\n other: 'Yehuda'\n });\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Stef-Yehuda-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'other', 'Chad'));\n\n this.assertText('Stef-Chad-Stef');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n\n this.assertText('Tom-Chad-Tom');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'Stef');\n (0, _metal.set)(this.context, 'other', 'Yehuda');\n });\n\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test inverse template is displayed with context']() {\n this.render(`{{#with falsyThing as |thing|}}Has Thing{{else}}No Thing {{otherThing}}{{/with}}`, {\n falsyThing: null,\n otherThing: 'bar'\n });\n\n this.assertText('No Thing bar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('No Thing bar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'biz'));\n\n this.assertText('No Thing biz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'falsyThing', true));\n\n this.assertText('Has Thing');\n\n this.runTask(() => (0, _metal.set)(this.context, 'otherThing', 'baz'));\n\n this.assertText('Has Thing');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'otherThing', 'bar');\n (0, _metal.set)(this.context, 'falsyThing', null);\n });\n\n this.assertText('No Thing bar');\n }\n\n ['@test can access alias of a proxy']() {\n this.render(`{{#with proxy as |person|}}{{person.name}}{{/with}}`, {\n proxy: _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })\n });\n\n this.assertText('Tom Dale');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Tom Dale');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.name', 'Yehuda Katz'));\n\n this.assertText('Yehuda Katz');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', { name: 'Godfrey Chan' }));\n\n this.assertText('Godfrey Chan');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Stefan Penner'));\n\n this.assertText('Stefan Penner');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy.content', null));\n\n this.assertText('');\n\n this.runTask(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({ content: { name: 'Tom Dale' } })));\n\n this.assertText('Tom Dale');\n }\n\n ['@test can access alias of an array']() {\n this.render(`{{#with arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/with}}`, {\n arrayThing: (0, _runtime.A)(['Hello', ' ', 'world'])\n });\n\n this.assertText('Hello world');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Hello world');\n\n this.runTask(() => {\n let array = (0, _metal.get)(this.context, 'arrayThing');\n array.replace(0, 1, ['Goodbye']);\n (0, _runtime.removeAt)(array, 1);\n array.insertAt(1, ', ');\n array.pushObject('!');\n });\n\n this.assertText('Goodbye, world!');\n\n this.runTask(() => (0, _metal.set)(this.context, 'arrayThing', ['Hello', ' ', 'world']));\n\n this.assertText('Hello world');\n }\n\n ['@test `attrs` can be used as a block param [GH#14678]']() {\n this.render('{{#with hash as |attrs|}}[{{hash.foo}}-{{attrs.foo}}]{{/with}}', {\n hash: { foo: 'foo' }\n });\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.rerender());\n\n this.assertText('[foo-foo]');\n\n this.runTask(() => this.context.set('hash.foo', 'FOO'));\n\n this.assertText('[FOO-FOO]');\n\n this.runTask(() => this.context.set('hash.foo', 'foo'));\n\n this.assertText('[foo-foo]');\n }\n });\n\n (0, _testCase.moduleFor)('Syntax test: Multiple {{#with as}} helpers', class extends _testCase.RenderingTest {\n ['@test re-using the same variable with different {{#with}} blocks does not override each other']() {\n this.render(`Admin: {{#with admin as |person|}}{{person.name}}{{/with}} User: {{#with user as |person|}}{{person.name}}{{/with}}`, {\n admin: { name: 'Tom Dale' },\n user: { name: 'Yehuda Katz' }\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin.name', 'Godfrey Chan');\n (0, _metal.set)(this.context, 'user.name', 'Stefan Penner');\n });\n\n this.assertText('Admin: Godfrey Chan User: Stefan Penner');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'admin', { name: 'Tom Dale' });\n (0, _metal.set)(this.context, 'user', { name: 'Yehuda Katz' });\n });\n\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n }\n\n ['@test the scoped variable is not available outside the {{#with}} block']() {\n this.render(`{{ring}}-{{#with first as |ring|}}{{ring}}-{{#with fifth as |ring|}}{{ring}}-{{#with ninth as |ring|}}{{ring}}-{{/with}}{{ring}}-{{/with}}{{ring}}-{{/with}}{{ring}}`, {\n ring: 'Greed',\n first: 'Limbo',\n fifth: 'Wrath',\n ninth: 'Treachery'\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n (0, _metal.set)(this.context, 'fifth', 'D');\n });\n\n this.assertText('O-Limbo-D-Treachery-D-Limbo-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'first', 'I');\n (0, _metal.set)(this.context, 'ninth', 'K');\n });\n\n this.assertText('O-I-D-K-D-I-O');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'ring', 'Greed');\n (0, _metal.set)(this.context, 'first', 'Limbo');\n (0, _metal.set)(this.context, 'fifth', 'Wrath');\n (0, _metal.set)(this.context, 'ninth', 'Treachery');\n });\n\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#with name as |foo|}}, then {{#with foo as |bar|}}']() {\n this.render(`{{#with name as |foo|}}{{#with foo as |bar|}}{{bar}}{{/with}}{{/with}}`, {\n name: 'caterpillar'\n });\n\n this.assertText('caterpillar');\n\n this.runTask(() => this.rerender());\n\n this.assertText('caterpillar');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'butterfly'));\n\n this.assertText('butterfly');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'caterpillar'));\n\n this.assertText('caterpillar');\n }\n\n ['@test updating the context should update the alias']() {\n this.render(`{{#with this as |person|}}{{person.name}}{{/with}}`, {\n name: 'Los Pivots'\n });\n\n this.assertText('Los Pivots');\n\n this.runTask(() => this.rerender());\n\n this.assertText('Los Pivots');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', \"l'Pivots\"));\n\n this.assertText(\"l'Pivots\");\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'Los Pivots'));\n\n this.assertText('Los Pivots');\n }\n\n ['@test nested {{#with}} blocks should have access to root context']() {\n this.render(_abstractTestCase.strip`\n {{name}}\n {{#with committer1.name as |name|}}\n [{{name}}\n {{#with committer2.name as |name|}}\n [{{name}}]\n {{/with}}\n {{name}}]\n {{/with}}\n {{name}}\n {{#with committer2.name as |name|}}\n [{{name}}\n {{#with committer1.name as |name|}}\n [{{name}}]\n {{/with}}\n {{name}}]\n {{/with}}\n {{name}}\n `, {\n name: 'ebryn',\n committer1: { name: 'trek' },\n committer2: { name: 'machty' }\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => this.rerender());\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n\n this.runTask(() => (0, _metal.set)(this.context, 'name', 'chancancode'));\n\n this.assertText('chancancode[trek[machty]trek]chancancode[machty[trek]machty]chancancode');\n\n this.runTask(() => (0, _metal.set)(this.context, 'committer1', { name: 'krisselden' }));\n\n this.assertText('chancancode[krisselden[machty]krisselden]chancancode[machty[krisselden]machty]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'committer1.name', 'wycats');\n (0, _metal.set)(this.context, 'committer2', { name: 'rwjblue' });\n });\n\n this.assertText('chancancode[wycats[rwjblue]wycats]chancancode[rwjblue[wycats]rwjblue]chancancode');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'name', 'ebryn');\n (0, _metal.set)(this.context, 'committer1', { name: 'trek' });\n (0, _metal.set)(this.context, 'committer2', { name: 'machty' });\n });\n\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/unit/outlet-test', ['@ember/-internals/glimmer', '@ember/runloop', 'internal-test-helpers'], function (_glimmer, _runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Glimmer OutletView', class extends _internalTestHelpers.AbstractTestCase {\n ['@test render in the render queue'](assert) {\n let didAppendOutletView = 0;\n let expectedOutlet = '#foo.bar';\n\n let renderer = {\n appendOutletView(view, target) {\n didAppendOutletView++;\n assert.equal(view, outletView);\n assert.equal(target, expectedOutlet);\n }\n };\n\n let outletView = new _glimmer.OutletView({}, renderer);\n\n (0, _runloop.run)(() => {\n assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (before appendTo)');\n outletView.appendTo(expectedOutlet);\n assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (sync after appendTo)');\n\n (0, _runloop.schedule)('actions', () => assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (in actions)'));\n (0, _runloop.schedule)('render', () => assert.equal(didAppendOutletView, 1, 'appendOutletView should be invoked in render'));\n });\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test', ['@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/metal', 'internal-test-helpers'], function (_testCase, _helpers, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('ember-glimmer runtime resolver cache', class extends _testCase.RenderingTest {\n '@test a helper definition is only generated once'(assert) {\n this.registerHelper('foo-bar', () => 'foo-bar helper!');\n this.registerHelper('baz-qux', () => 'baz-qux helper!');\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n this.render(`\n {{~#if cond~}}\n {{foo-bar}}\n {{~else~}}\n {{baz-qux}}\n {{~/if}}`, {\n cond: true\n });\n\n this.assertText('foo-bar helper!');\n state = this.expectCacheChanges({ helperDefinitionCount: 1 }, state, 'calculate foo-bar helper only');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('baz-qux helper!');\n state = this.expectCacheChanges({\n helperDefinitionCount: 1\n }, state, 'calculate baz-qux helper, misses cache');\n\n // show foo-bar again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('foo-bar helper!');\n state = this.expectCacheChanges({}, state, 'toggle back to foo-bar cache hit');\n\n // show baz-qux again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('baz-qux helper!');\n state = this.expectCacheChanges({}, state, 'toggle back to baz-qux cache hit');\n }\n\n '@test a component definition is only generated once'(assert) {\n // static layout\n this.registerComponent('component-one', { template: 'One' });\n this.registerComponent('component-two', {\n ComponentClass: _helpers.Component.extend(),\n template: 'Two'\n });\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n // show component-one for the first time\n this.render(`{{component componentName}}`, {\n componentName: 'component-one'\n });\n\n this.assertText('One');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'test case component and component-one no change');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n\n this.assertText('Two');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'component-two first render');\n\n // show component-one again\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-one'));\n\n this.assertText('One');\n state = this.expectCacheChanges({}, state, 'toggle back to component-one no change');\n\n // show component-two again\n this.runTask(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n\n this.assertText('Two');\n state = this.expectCacheChanges({}, state, 'toggle back to component-two no change');\n }\n\n ['@test each template is only compiled once'](assert) {\n // static layout\n this.registerComponent('component-one', { template: 'One' });\n\n // test directly import template factory onto late bound layout\n let Two = _helpers.Component.extend({\n layout: this.compile('Two')\n });\n this.registerComponent('component-two', { ComponentClass: Two });\n\n // inject layout onto component, share layout with component-one\n this.registerComponent('root-component', { ComponentClass: _helpers.Component });\n this.owner.inject('component:root-component', 'layout', 'template:components/component-one');\n\n // template instance shared between to template managers\n let rootFactory = this.owner.factoryFor('component:root-component');\n\n // assert precondition\n let state = this.getCacheCounters();\n assert.deepEqual(state, {\n templateCacheHits: 0,\n templateCacheMisses: 0,\n componentDefinitionCount: 0,\n helperDefinitionCount: 0\n }, 'precondition');\n\n // show component-one for the first time\n this.render(`\n {{~#if cond~}}\n {{component-one}}\n {{~else~}}\n {{component-two}}\n {{~/if}}`, {\n cond: true\n });\n\n this.assertText('One');\n state = this.expectCacheChanges({ componentDefinitionCount: 1 }, state, 'test case component and component-one no change');\n\n // show component-two for the first time\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Two');\n state = this.expectCacheChanges({\n templateCacheMisses: 1,\n componentDefinitionCount: 1\n }, state, 'component-two first render misses template cache');\n\n // show component-one again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', true));\n\n this.assertText('One');\n state = this.expectCacheChanges({}, state, 'toggle back to component-one no change');\n\n // show component-two again\n this.runTask(() => (0, _metal.set)(this.context, 'cond', false));\n\n this.assertText('Two');\n state = this.expectCacheChanges({\n templateCacheHits: 1\n }, state, 'toggle back to component-two hits template cache');\n\n // render new root append\n let root = rootFactory.create();\n try {\n (0, _internalTestHelpers.runAppend)(root);\n this.assertText('TwoOne');\n // roots have different capabilities so this will hit\n state = this.expectCacheChanges({}, state, 'append root with component-one no change');\n\n // render new root append\n let root2 = rootFactory.create();\n try {\n (0, _internalTestHelpers.runAppend)(root2);\n this.assertText('TwoOneOne');\n state = this.expectCacheChanges({}, state, 'append another root no change');\n } finally {\n (0, _internalTestHelpers.runDestroy)(root2);\n }\n } finally {\n (0, _internalTestHelpers.runDestroy)(root);\n }\n }\n\n getCacheCounters() {\n let {\n templateCacheHits,\n templateCacheMisses,\n componentDefinitionCount,\n helperDefinitionCount\n } = this.runtimeResolver;\n\n return {\n templateCacheHits,\n templateCacheMisses,\n componentDefinitionCount,\n helperDefinitionCount\n };\n }\n\n expectCacheChanges(expected, lastState, message) {\n let state = this.getCacheCounters();\n let actual = diff(state, lastState);\n this.assert.deepEqual(actual, expected, message);\n return state;\n }\n });\n\n function diff(state, lastState) {\n let res = {};\n Object.keys(state).forEach(key => {\n let delta = state[key] - lastState[key];\n if (delta !== 0) {\n res[key] = state[key] - lastState[key];\n }\n });\n return res;\n }\n});","enifed('@ember/-internals/glimmer/tests/unit/template-factory-test', ['ember-template-compiler', '@ember/-internals/glimmer', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/glimmer/tests/utils/helpers'], function (_emberTemplateCompiler, _glimmer, _testCase, _helpers) {\n 'use strict';\n\n (0, _testCase.moduleFor)('Template factory test', class extends _testCase.RenderingTest {\n ['@test the template factory returned from precompile is the same as compile'](assert) {\n let { owner } = this;\n let { runtimeResolver } = this;\n\n let templateStr = 'Hello {{name}}';\n let options = { moduleName: 'my-app/templates/some-module.hbs' };\n\n let spec = (0, _emberTemplateCompiler.precompile)(templateStr, options);\n let body = `exports.default = template(${spec});`;\n let module = new Function('exports', 'template', body);\n let exports = {};\n module(exports, _glimmer.template);\n let Precompiled = exports['default'];\n\n let Compiled = (0, _emberTemplateCompiler.compile)(templateStr, options);\n\n assert.equal(typeof Precompiled.create, 'function', 'precompiled is a factory');\n assert.ok(Precompiled.id, 'precompiled has id');\n\n assert.equal(typeof Compiled.create, 'function', 'compiled is a factory');\n assert.ok(Compiled.id, 'compiled has id');\n\n assert.equal(runtimeResolver.templateCacheMisses, 0, 'misses 0');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n let precompiled = runtimeResolver.createTemplate(Precompiled, owner);\n\n assert.equal(runtimeResolver.templateCacheMisses, 1, 'misses 1');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n let compiled = runtimeResolver.createTemplate(Compiled, owner);\n\n assert.equal(runtimeResolver.templateCacheMisses, 2, 'misses 2');\n assert.equal(runtimeResolver.templateCacheHits, 0, 'hits 0');\n\n assert.ok(typeof precompiled.spec !== 'string', 'Spec has been parsed');\n assert.ok(typeof compiled.spec !== 'string', 'Spec has been parsed');\n\n this.registerComponent('x-precompiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Precompiled\n })\n });\n\n this.registerComponent('x-compiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Compiled\n })\n });\n\n this.render('{{x-precompiled name=\"precompiled\"}} {{x-compiled name=\"compiled\"}}');\n\n assert.equal(runtimeResolver.templateCacheMisses, 2, 'misses 2');\n assert.equal(runtimeResolver.templateCacheHits, 2, 'hits 2');\n\n this.assertText('Hello precompiled Hello compiled');\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/unit/utils/debug-stack-test', ['@ember/-internals/glimmer', 'internal-test-helpers'], function (_glimmer, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Glimmer DebugStack', class extends _internalTestHelpers.AbstractTestCase {\n ['@test pushing and popping'](assert) {\n if (true /* DEBUG */) {\n let stack = new _glimmer.DebugStack();\n\n assert.equal(stack.peek(), undefined);\n\n stack.push('template:application');\n\n assert.equal(stack.peek(), '\"template:application\"');\n\n stack.push('component:top-level-component');\n\n assert.equal(stack.peek(), '\"component:top-level-component\"');\n\n stack.pushEngine('engine:my-engine');\n stack.push('component:component-in-engine');\n\n assert.equal(stack.peek(), '\"component:component-in-engine\" (in \"engine:my-engine\")');\n\n stack.pop();\n stack.pop();\n let item = stack.pop();\n\n assert.equal(item, 'component:top-level-component');\n assert.equal(stack.peek(), '\"template:application\"');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/abstract-test-case', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, 'TestCase', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.AbstractTestCase;\n }\n });\n Object.defineProperty(exports, 'applyMixins', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.applyMixins;\n }\n });\n Object.defineProperty(exports, 'strip', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.strip;\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/helpers', ['exports', 'ember-template-compiler', '@ember/-internals/glimmer'], function (exports, _emberTemplateCompiler, _glimmer) {\n 'use strict';\n\n Object.defineProperty(exports, 'compile', {\n enumerable: true,\n get: function () {\n return _emberTemplateCompiler.compile;\n }\n });\n Object.defineProperty(exports, 'precompile', {\n enumerable: true,\n get: function () {\n return _emberTemplateCompiler.precompile;\n }\n });\n Object.defineProperty(exports, 'INVOKE', {\n enumerable: true,\n get: function () {\n return _glimmer.INVOKE;\n }\n });\n Object.defineProperty(exports, 'Helper', {\n enumerable: true,\n get: function () {\n return _glimmer.Helper;\n }\n });\n Object.defineProperty(exports, 'helper', {\n enumerable: true,\n get: function () {\n return _glimmer.helper;\n }\n });\n Object.defineProperty(exports, 'Component', {\n enumerable: true,\n get: function () {\n return _glimmer.Component;\n }\n });\n Object.defineProperty(exports, 'LinkComponent', {\n enumerable: true,\n get: function () {\n return _glimmer.LinkComponent;\n }\n });\n Object.defineProperty(exports, 'InteractiveRenderer', {\n enumerable: true,\n get: function () {\n return _glimmer.InteractiveRenderer;\n }\n });\n Object.defineProperty(exports, 'InertRenderer', {\n enumerable: true,\n get: function () {\n return _glimmer.InertRenderer;\n }\n });\n Object.defineProperty(exports, 'htmlSafe', {\n enumerable: true,\n get: function () {\n return _glimmer.htmlSafe;\n }\n });\n Object.defineProperty(exports, 'SafeString', {\n enumerable: true,\n get: function () {\n return _glimmer.SafeString;\n }\n });\n Object.defineProperty(exports, 'DOMChanges', {\n enumerable: true,\n get: function () {\n return _glimmer.DOMChanges;\n }\n });\n Object.defineProperty(exports, 'isHTMLSafe', {\n enumerable: true,\n get: function () {\n return _glimmer.isHTMLSafe;\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/shared-conditional-tests', ['exports', '@ember/polyfills', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/glimmer/tests/utils/helpers'], function (exports, _polyfills, _abstractTestCase, _testCase, _metal, _runtime, _helpers) {\n 'use strict';\n\n exports.IfUnlessWithSyntaxTest = exports.TogglingSyntaxConditionalsTest = exports.IfUnlessHelperTest = exports.TogglingHelperConditionalsTest = exports.TogglingConditionalsTest = exports.ArrayTestCases = exports.ObjectTestCases = exports.BasicConditionalsTest = exports.StableFalsyGenerator = exports.StableTruthyGenerator = exports.FalsyGenerator = exports.TruthyGenerator = undefined;\n\n\n class AbstractConditionalsTest extends _testCase.RenderingTest {\n get truthyValue() {\n return true;\n }\n\n get falsyValue() {\n return false;\n }\n\n wrapperFor(templates) {\n return templates.join('');\n }\n\n wrappedTemplateFor(options) {\n return this.wrapperFor([this.templateFor(options)]);\n }\n\n /* abstract */\n templateFor() /* { cond, truthy, falsy } */{\n // e.g. `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`\n throw new Error('Not implemented: `templateFor`');\n }\n\n /* abstract */\n renderValues() /* ...values */{\n throw new Error('Not implemented: `renderValues`');\n }\n }\n\n class AbstractGenerator {\n constructor(cases) {\n this.cases = cases;\n }\n\n /* abstract */\n generate() /* value, idx */{\n throw new Error('Not implemented: `generate`');\n }\n }\n\n /*\n The test cases in this file generally follow the following pattern:\n \n 1. Render with [ truthy, ...(other truthy variations), falsy, ...(other falsy variations) ]\n 2. No-op rerender\n 3. Make all of them falsy (through interior mutation)\n 4. Make all of them truthy (through interior mutation, sometimes with some slight variations)\n 5. Reset them to their original values (through replacement)\n */\n\n class TruthyGenerator extends AbstractGenerator {\n generate(value, idx) {\n return {\n [`@test it should consider ${JSON.stringify(value)} truthy [${idx}]`]() {\n this.renderValues(value);\n\n this.assertText('T1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('T1');\n }\n };\n }\n }\n\n exports.TruthyGenerator = TruthyGenerator;\n class FalsyGenerator extends AbstractGenerator {\n generate(value, idx) {\n return {\n [`@test it should consider ${JSON.stringify(value)} falsy [${idx}]`]() {\n this.renderValues(value);\n\n this.assertText('F1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('F1');\n }\n };\n }\n }\n\n exports.FalsyGenerator = FalsyGenerator;\n class StableTruthyGenerator extends TruthyGenerator {\n generate(value, idx) {\n return (0, _polyfills.assign)(super.generate(value, idx), {\n [`@test it maintains DOM stability when condition changes from ${value} to another truthy value and back [${idx}]`]() {\n this.renderValues(value);\n\n this.assertText('T1');\n\n this.takeSnapshot();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n\n this.assertText('T1');\n\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('T1');\n\n this.assertInvariants();\n }\n });\n }\n }\n\n exports.StableTruthyGenerator = StableTruthyGenerator;\n class StableFalsyGenerator extends FalsyGenerator {\n generate(value, idx) {\n return (0, _polyfills.assign)(super.generate(value), {\n [`@test it maintains DOM stability when condition changes from ${value} to another falsy value and back [${idx}]`]() {\n this.renderValues(value);\n\n this.assertText('F1');\n\n this.takeSnapshot();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1');\n\n this.assertInvariants();\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', value));\n\n this.assertText('F1');\n\n this.assertInvariants();\n }\n });\n }\n }\n\n exports.StableFalsyGenerator = StableFalsyGenerator;\n class ObjectProxyGenerator extends AbstractGenerator {\n generate(value, idx) {\n // This is inconsistent with our usual to-bool policy, but the current proxy implementation\n // simply uses !!content to determine truthiness\n if (value) {\n return {\n [`@test it should consider an object proxy with \\`${JSON.stringify(value)}\\` truthy [${idx}]`]() {\n this.renderValues(_runtime.ObjectProxy.create({ content: value }));\n\n this.assertText('T1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.content', this.falsyValue));\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ content: value })));\n\n this.assertText('T1');\n }\n };\n } else {\n return {\n [`@test it should consider an object proxy with \\`${JSON.stringify(value)}\\` falsy [${idx}]`]() {\n this.renderValues(_runtime.ObjectProxy.create({ content: value }));\n\n this.assertText('F1');\n\n this.runTask(() => this.rerender());\n\n this.assertText('F1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1.content', this.truthyValue));\n\n this.assertText('T1');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ content: value })));\n\n this.assertText('F1');\n }\n };\n }\n }\n }\n\n // Testing behaviors shared across all conditionals, i.e. {{#if}}, {{#unless}},\n // {{#with}}, {{#each}}, {{#each-in}}, (if) and (unless)\n class BasicConditionalsTest extends AbstractConditionalsTest {\n ['@test it renders the corresponding block based on the conditional']() {\n this.renderValues(this.truthyValue, this.falsyValue);\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n }\n\n exports.BasicConditionalsTest = BasicConditionalsTest;\n // Testing behaviors related to ember objects, object proxies, etc\n const ObjectTestCases = exports.ObjectTestCases = {\n ['@test it considers object proxies without content falsy']() {\n this.renderValues(_runtime.ObjectProxy.create({ content: {} }), _runtime.ObjectProxy.create({ content: _runtime.Object.create() }), _runtime.ObjectProxy.create({ content: null }));\n\n this.assertText('T1T2F3');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1T2F3');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n\n this.assertText('F1F2F3');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', _runtime.Object.create());\n (0, _metal.set)(this.context, 'cond2.content', {});\n (0, _metal.set)(this.context, 'cond3.content', { foo: 'bar' });\n });\n\n this.assertText('T1T2T3');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({ content: {} }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ObjectProxy.create({ content: _runtime.Object.create() }));\n (0, _metal.set)(this.context, 'cond3', _runtime.ObjectProxy.create({ content: null }));\n });\n\n this.assertText('T1T2F3');\n }\n };\n\n // Testing behaviors related to arrays and array proxies\n const ArrayTestCases = exports.ArrayTestCases = {\n ['@test it considers empty arrays falsy']() {\n this.renderValues((0, _runtime.A)(['hello']), (0, _runtime.A)());\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1'), 0));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.get)(this.context, 'cond1').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2').pushObjects([1]);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', (0, _runtime.A)(['hello']));\n (0, _metal.set)(this.context, 'cond2', (0, _runtime.A)());\n });\n\n this.assertText('T1F2');\n },\n\n ['@test it considers array proxies without content falsy']() {\n this.renderValues(_runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }), _runtime.ArrayProxy.create({ content: null }));\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1.content', (0, _runtime.A)(['hello']));\n (0, _metal.set)(this.context, 'cond2.content', (0, _runtime.A)([1]));\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({ content: null }));\n });\n\n this.assertText('T1F2');\n },\n\n ['@test it considers array proxies with empty arrays falsy']() {\n this.renderValues(_runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }), _runtime.ArrayProxy.create({ content: (0, _runtime.A)() }));\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1.content'), 0));\n\n this.assertText('F1F2');\n\n this.runTask(() => {\n (0, _metal.get)(this.context, 'cond1.content').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2.content').pushObjects([1]);\n });\n\n this.assertText('T1T2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({ content: (0, _runtime.A)(['hello']) }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({ content: (0, _runtime.A)() }));\n });\n\n this.assertText('T1F2');\n }\n };\n\n const IfUnlessWithTestCases = [new StableTruthyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), {}, { foo: 'bar' }, _runtime.Object.create(), _runtime.Object.create({ foo: 'bar' }), _runtime.ObjectProxy.create({ content: true }), Object, function () {},\n /*jshint -W053 */\n new String('hello'), new String(''), new Boolean(true), new Boolean(false),\n /*jshint +W053 */\n new Date()]), new StableFalsyGenerator([false, null, undefined, '', 0, [], (0, _runtime.A)(), _runtime.ObjectProxy.create({ content: undefined })]), new ObjectProxyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), _runtime.ArrayProxy.create({ content: ['hello'] }), _runtime.ArrayProxy.create({ content: [] }), {}, { foo: 'bar' }, _runtime.Object.create(), _runtime.Object.create({ foo: 'bar' }), _runtime.ObjectProxy.create({ content: true }), _runtime.ObjectProxy.create({ content: undefined }),\n /*jshint -W053 */\n new String('hello'), new String(''), new Boolean(true), new Boolean(false),\n /*jshint +W053 */\n new Date(), false, null, undefined, '', 0, [], (0, _runtime.A)()]), ObjectTestCases, ArrayTestCases];\n\n // Testing behaviors shared across the \"toggling\" conditionals, i.e. {{#if}},\n // {{#unless}}, {{#with}}, {{#each}}, {{#each-in}}, (if) and (unless)\n class TogglingConditionalsTest extends BasicConditionalsTest {}\n\n exports.TogglingConditionalsTest = TogglingConditionalsTest;\n // Testing behaviors shared across the (if) and (unless) helpers\n class TogglingHelperConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n let templates = [];\n let context = {};\n\n for (let i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({ cond: `cond${i}`, truthy: `t${i}`, falsy: `f${i}` }));\n context[`t${i}`] = `T${i}`;\n context[`f${i}`] = `F${i}`;\n context[`cond${i}`] = values[i - 1];\n }\n\n let wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, context);\n }\n\n ['@test it has access to the outer scope from both templates']() {\n let template = this.wrapperFor([this.templateFor({ cond: 'cond1', truthy: 'truthy', falsy: 'falsy' }), this.templateFor({ cond: 'cond2', truthy: 'truthy', falsy: 'falsy' })]);\n\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n\n this.assertText('YESNO');\n\n this.runTask(() => this.rerender());\n\n this.assertText('YESNO');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n\n this.assertText('YASSNOPE');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('NOPEYASS');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YES');\n (0, _metal.set)(this.context, 'falsy', 'NO');\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('YESNO');\n }\n\n ['@test it does not update when the unbound helper is used']() {\n let template = this.wrapperFor([this.templateFor({\n cond: '(unbound cond1)',\n truthy: '\"T1\"',\n falsy: '\"F1\"'\n }), this.templateFor({\n cond: '(unbound cond2)',\n truthy: '\"T2\"',\n falsy: '\"F2\"'\n })]);\n\n this.render(template, { cond1: this.truthyValue, cond2: this.falsyValue });\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n\n ['@test evaluation should be lazy'](assert) {\n let truthyEvaluated;\n let falsyEvaluated;\n\n let withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n let withoutEvaluatingFalsy = callback => {\n falsyEvaluated = false;\n callback();\n assert.ok(!falsyEvaluated, 'x-falsy is not evaluated');\n };\n\n this.registerHelper('x-truthy', {\n compute() {\n truthyEvaluated = true;\n return 'T';\n }\n });\n\n this.registerHelper('x-falsy', {\n compute() {\n falsyEvaluated = true;\n return 'F';\n }\n });\n\n let template = this.wrappedTemplateFor({\n cond: 'cond',\n truthy: '(x-truthy)',\n falsy: '(x-falsy)'\n });\n\n withoutEvaluatingFalsy(() => this.render(template, { cond: this.truthyValue }));\n\n this.assertText('T');\n\n withoutEvaluatingFalsy(() => this.runTask(() => this.rerender()));\n\n this.assertText('T');\n\n withoutEvaluatingTruthy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n\n this.assertText('F');\n\n withoutEvaluatingTruthy(() => this.runTask(() => this.rerender()));\n\n this.assertText('F');\n\n withoutEvaluatingFalsy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n\n this.assertText('T');\n }\n }\n\n exports.TogglingHelperConditionalsTest = TogglingHelperConditionalsTest;\n class IfUnlessHelperTest extends TogglingHelperConditionalsTest {}\n\n exports.IfUnlessHelperTest = IfUnlessHelperTest;\n (0, _abstractTestCase.applyMixins)(IfUnlessHelperTest, ...IfUnlessWithTestCases);\n\n // Testing behaviors shared across the \"toggling\" syntatical constructs,\n // i.e. {{#if}}, {{#unless}}, {{#with}}, {{#each}} and {{#each-in}}\n class TogglingSyntaxConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n let templates = [];\n let context = {};\n\n for (let i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({\n cond: `cond${i}`,\n truthy: `{{t}}${i}`,\n falsy: `{{f}}${i}`\n }));\n context[`cond${i}`] = values[i - 1];\n }\n\n let wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, (0, _polyfills.assign)({ t: 'T', f: 'F' }, context));\n }\n\n ['@test it does not update when the unbound helper is used']() {\n let template = `${this.templateFor({\n cond: '(unbound cond1)',\n truthy: 'T1',\n falsy: 'F1'\n })}${this.templateFor({\n cond: '(unbound cond2)',\n truthy: 'T2',\n falsy: 'F2'\n })}`;\n\n this.render(template, { cond1: this.truthyValue, cond2: this.falsyValue });\n\n this.assertText('T1F2');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T1F2');\n\n this.runTask(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('T1F2');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('T1F2');\n }\n\n ['@test it has access to the outer scope from both templates']() {\n let template = this.wrapperFor([this.templateFor({\n cond: 'cond1',\n truthy: '{{truthy}}',\n falsy: '{{falsy}}'\n }), this.templateFor({\n cond: 'cond2',\n truthy: '{{truthy}}',\n falsy: '{{falsy}}'\n })]);\n\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n\n this.assertText('YESNO');\n\n this.runTask(() => this.rerender());\n\n this.assertText('YESNO');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n\n this.assertText('YASSNOPE');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n\n this.assertText('NOPEYASS');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'truthy', 'YES');\n (0, _metal.set)(this.context, 'falsy', 'NO');\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n\n this.assertText('YESNO');\n }\n\n ['@test it updates correctly when enclosing another conditional']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n let inner = this.templateFor({\n cond: 'inner',\n truthy: 'T-inner',\n falsy: 'F-inner'\n });\n let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: inner,\n falsy: 'F-outer'\n });\n\n this.render(template, { outer: this.truthyValue, inner: this.truthyValue });\n\n this.assertText('T-inner');\n\n this.runTask(() => this.rerender());\n\n this.assertText('T-inner');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', this.falsyValue));\n\n this.assertText('F-inner');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n }\n\n ['@test it updates correctly when enclosing #each']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: '{{#each inner as |text|}}{{text}}{{/each}}',\n falsy: 'F-outer'\n });\n\n this.render(template, {\n outer: this.truthyValue,\n inner: ['inner', '-', 'before']\n });\n\n this.assertText('inner-before');\n\n this.runTask(() => this.rerender());\n\n this.assertText('inner-before');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', ['inner-after']));\n\n this.assertText('inner-after');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n\n // Reset\n this.runTask(() => {\n (0, _metal.set)(this.context, 'inner', ['inner-again']);\n (0, _metal.set)(this.context, 'outer', this.truthyValue);\n });\n\n this.assertText('inner-again');\n\n // Now clear the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', []));\n\n this.assertText('');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n }\n\n ['@test it updates correctly when enclosing triple-curlies']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n let template = this.wrappedTemplateFor({\n cond: 'outer',\n truthy: '{{{inner}}}',\n falsy: 'F-outer'\n });\n\n this.render(template, {\n outer: this.truthyValue,\n inner: 'inner-before'\n });\n\n this.assertText('inner-before');\n\n this.runTask(() => this.rerender());\n\n this.assertText('inner-before');\n\n // Changes the inner bounds\n this.runTask(() => (0, _metal.set)(this.context, 'inner', '

    inner-after

    '));\n\n this.assertText('inner-after');\n\n // Now rerender the outer conditional, which require first clearing its bounds\n this.runTask(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n\n this.assertText('F-outer');\n }\n\n ['@test child conditional should not render children if parent conditional becomes false'](assert) {\n let childCreated = false;\n\n this.registerComponent('foo-bar', {\n template: 'foo-bar',\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n childCreated = true;\n }\n })\n });\n\n let innerTemplate = this.templateFor({\n cond: 'cond2',\n truthy: '{{foo-bar}}',\n falsy: ''\n });\n let wrappedTemplate = this.wrappedTemplateFor({\n cond: 'cond1',\n truthy: innerTemplate,\n falsy: ''\n });\n\n this.render(wrappedTemplate, {\n cond1: this.truthyValue,\n cond2: this.falsyValue\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => this.rerender());\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n\n this.runTask(() => {\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n });\n\n assert.ok(!childCreated);\n this.assertText('');\n }\n\n ['@test evaluation should be lazy'](assert) {\n let truthyEvaluated;\n let falsyEvaluated;\n\n let withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n let withoutEvaluatingFalsy = callback => {\n falsyEvaluated = false;\n callback();\n assert.ok(!falsyEvaluated, 'x-falsy is not evaluated');\n };\n\n this.registerHelper('x-truthy', {\n compute() {\n truthyEvaluated = true;\n return 'T';\n }\n });\n\n this.registerHelper('x-falsy', {\n compute() {\n falsyEvaluated = true;\n return 'F';\n }\n });\n\n let template = this.wrappedTemplateFor({\n cond: 'cond',\n truthy: '{{x-truthy}}',\n falsy: '{{x-falsy}}'\n });\n\n withoutEvaluatingFalsy(() => this.render(template, { cond: this.truthyValue }));\n\n this.assertText('T');\n\n withoutEvaluatingFalsy(() => this.runTask(() => this.rerender()));\n\n this.assertText('T');\n\n withoutEvaluatingTruthy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n\n this.assertText('F');\n\n withoutEvaluatingTruthy(() => this.runTask(() => this.rerender()));\n\n this.assertText('F');\n\n withoutEvaluatingFalsy(() => this.runTask(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n\n this.assertText('T');\n }\n }\n\n exports.TogglingSyntaxConditionalsTest = TogglingSyntaxConditionalsTest;\n class IfUnlessWithSyntaxTest extends TogglingSyntaxConditionalsTest {}\n\n exports.IfUnlessWithSyntaxTest = IfUnlessWithSyntaxTest;\n (0, _abstractTestCase.applyMixins)(IfUnlessWithSyntaxTest, ...IfUnlessWithTestCases);\n});","enifed('@ember/-internals/glimmer/tests/utils/string-test', ['@ember/-internals/glimmer/tests/utils/helpers', '@ember/-internals/glimmer/tests/utils/abstract-test-case', '@ember/-internals/glimmer/tests/utils/test-case'], function (_helpers, _abstractTestCase, _testCase) {\n 'use strict';\n\n (0, _testCase.moduleFor)('SafeString', class extends _abstractTestCase.TestCase {\n ['@test htmlSafe should return an instance of SafeString']() {\n let safeString = (0, _helpers.htmlSafe)('you need to be more bold');\n\n this.assert.ok(safeString instanceof _helpers.SafeString, 'should be a SafeString');\n }\n\n ['@test htmlSafe should return an empty string for null']() {\n let safeString = (0, _helpers.htmlSafe)(null);\n\n this.assert.equal(safeString instanceof _helpers.SafeString, true, 'should be a SafeString');\n this.assert.equal(safeString.toString(), '', 'should return an empty string');\n }\n\n ['@test htmlSafe should return an instance of SafeString']() {\n let safeString = (0, _helpers.htmlSafe)();\n\n this.assert.equal(safeString instanceof _helpers.SafeString, true, 'should be a SafeString');\n this.assert.equal(safeString.toString(), '', 'should return an empty string');\n }\n });\n\n (0, _testCase.moduleFor)('SafeString isHTMLSafe', class extends _abstractTestCase.TestCase {\n ['@test isHTMLSafe should detect SafeString']() {\n let safeString = (0, _helpers.htmlSafe)('Emphasize the important things.');\n\n this.assert.ok((0, _helpers.isHTMLSafe)(safeString));\n }\n\n ['@test isHTMLSafe should not detect SafeString on primatives']() {\n this.assert.notOk((0, _helpers.isHTMLSafe)('Hello World'));\n this.assert.notOk((0, _helpers.isHTMLSafe)({}));\n this.assert.notOk((0, _helpers.isHTMLSafe)([]));\n this.assert.notOk((0, _helpers.isHTMLSafe)(10));\n this.assert.notOk((0, _helpers.isHTMLSafe)(null));\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/test-case', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, 'TestCase', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.AbstractTestCase;\n }\n });\n Object.defineProperty(exports, 'ApplicationTest', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.ApplicationTestCase;\n }\n });\n Object.defineProperty(exports, 'RenderingTest', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.RenderingTestCase;\n }\n });\n Object.defineProperty(exports, 'moduleFor', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.moduleFor;\n }\n });\n});","enifed('@ember/-internals/glimmer/tests/utils/test-helpers', ['exports', 'internal-test-helpers'], function (exports, _internalTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, 'styles', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.styles;\n }\n });\n Object.defineProperty(exports, 'classes', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.classes;\n }\n });\n Object.defineProperty(exports, 'equalTokens', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.equalTokens;\n }\n });\n Object.defineProperty(exports, 'equalsElement', {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.equalsElement;\n }\n });\n});","enifed('@ember/-internals/meta/tests/listeners_test', ['internal-test-helpers', '@ember/-internals/meta'], function (_internalTestHelpers, _meta) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.meta listeners', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basics'](assert) {\n let t = {};\n let m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n let matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n m.removeFromListeners('hello', t, 'm');\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n }\n\n ['@test inheritance'](assert) {\n let target = {};\n let parent = {};\n let parentMeta = (0, _meta.meta)(parent);\n parentMeta.addToListeners('hello', target, 'm', 0);\n\n let child = Object.create(parent);\n let m = (0, _meta.meta)(child);\n\n let matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], target);\n assert.equal(matching[1], 'm');\n assert.equal(matching[2], 0);\n m.removeFromListeners('hello', target, 'm');\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n matching = parentMeta.matchingListeners('hello');\n assert.equal(matching.length, 3);\n }\n\n ['@test deduplication'](assert) {\n let t = {};\n let m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n m.addToListeners('hello', t, 'm', 0);\n let matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n }\n\n ['@test parent caching'](assert) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n\n class Class {}\n let classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n\n let instance = new Class();\n let m = (0, _meta.meta)(instance);\n\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n\n matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 3);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n }\n\n ['@test parent cache invalidation'](assert) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n _meta.counters.listenersInherited = 0;\n\n class Class {}\n let classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n\n let instance = new Class();\n let m = (0, _meta.meta)(instance);\n\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 0);\n\n m.addToListeners('hello', null, 'm2');\n\n matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 6);\n assert.equal(_meta.counters.flattenedListenersCalls, 4);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 1);\n }\n\n ['@test reopen after flatten'](assert) {\n // Ensure counter is zeroed\n _meta.counters.reopensAfterFlatten = 0;\n\n class Class1 {}\n let class1Meta = (0, _meta.meta)(Class1.prototype);\n class1Meta.addToListeners('hello', null, 'm', 0);\n\n let instance1 = new Class1();\n let m1 = (0, _meta.meta)(instance1);\n\n class Class2 {}\n let class2Meta = (0, _meta.meta)(Class2.prototype);\n class2Meta.addToListeners('hello', null, 'm', 0);\n\n let instance2 = new Class2();\n let m2 = (0, _meta.meta)(instance2);\n\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 0, 'no reopen calls yet');\n\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'reopen calls after invalidating parent cache');\n\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'no reopen calls after mutating leaf nodes');\n\n class1Meta.removeFromListeners('hello', null, 'm');\n class2Meta.removeFromListeners('hello', null, 'm');\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 2, 'one reopen call after mutating parents');\n\n class1Meta.addToListeners('hello', null, 'm', 0);\n m1.matchingListeners('hello');\n class2Meta.addToListeners('hello', null, 'm', 0);\n m2.matchingListeners('hello');\n\n assert.equal(_meta.counters.reopensAfterFlatten, 3, 'one reopen call after mutating parents and flattening out of order');\n }\n\n ['@test REMOVE_ALL does not interfere with future adds'](assert) {\n expectDeprecation(() => {\n let t = {};\n let m = (0, _meta.meta)({});\n\n m.addToListeners('hello', t, 'm', 0);\n let matching = m.matchingListeners('hello');\n\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n\n // Remove all listeners\n m.removeAllListeners('hello');\n\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n\n m.addToListeners('hello', t, 'm', 0);\n matching = m.matchingListeners('hello');\n\n // listener was added back successfully\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n });\n }\n });\n});","enifed('@ember/-internals/meta/tests/meta_test', ['internal-test-helpers', '@ember/-internals/meta'], function (_internalTestHelpers, _meta) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.meta', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should return the same hash for an object'](assert) {\n let obj = {};\n\n (0, _meta.meta)(obj).foo = 'bar';\n\n assert.equal((0, _meta.meta)(obj).foo, 'bar', 'returns same hash with multiple calls to Ember.meta()');\n }\n\n ['@test meta is not enumerable'](assert) {\n let proto, obj, props, prop;\n proto = { foo: 'bar' };\n (0, _meta.meta)(proto);\n obj = Object.create(proto);\n (0, _meta.meta)(obj);\n obj.bar = 'baz';\n props = [];\n for (prop in obj) {\n props.push(prop);\n }\n assert.deepEqual(props.sort(), ['bar', 'foo']);\n if (typeof JSON !== 'undefined' && 'stringify' in JSON) {\n try {\n JSON.stringify(obj);\n } catch (e) {\n assert.ok(false, 'meta should not fail JSON.stringify');\n }\n }\n }\n\n ['@test meta.writeWatching issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeWatching('hello', 1);\n }, 'Cannot update watchers for `hello` on `` after it has been destroyed.');\n }\n\n ['@test meta.writableTag issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableTag(() => {});\n }, 'Cannot create a new tag for `` after it has been destroyed.');\n }\n\n ['@test meta.writableChainWatchers issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableChainWatchers(() => {});\n }, 'Cannot create a new chain watcher for `` after it has been destroyed.');\n }\n\n ['@test meta.writableChains issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writableChains(() => {});\n }, 'Cannot create a new chains for `` after it has been destroyed.');\n }\n\n ['@test meta.writeValues issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeValues('derp', 'ohai');\n }, 'Cannot set the value of `derp` on `` after it has been destroyed.');\n }\n\n ['@test meta.writeDeps issues useful error after destroy']() {\n let target = {\n toString() {\n return '';\n }\n };\n let targetMeta = (0, _meta.meta)(target);\n\n targetMeta.destroy();\n\n expectAssertion(() => {\n targetMeta.writeDeps('derp', 'ohai', 1);\n }, 'Cannot modify dependent keys for `ohai` on `` after it has been destroyed.');\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/get_path_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('get with path', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n obj = {\n foo: {\n bar: {\n baz: { biff: 'BIFF' }\n }\n },\n foothis: {\n bar: {\n baz: { biff: 'BIFF' }\n }\n },\n falseValue: false,\n emptyString: '',\n Wuz: {\n nar: 'foo'\n },\n nullValue: null\n };\n }\n\n teardown() {\n obj = undefined;\n }\n\n // ..........................................................\n // LOCAL PATHS\n //\n ['@test [obj, foo] -> obj.foo'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foo'), obj.foo);\n }\n\n ['@test [obj, foo.bar] -> obj.foo.bar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foo.bar'), obj.foo.bar);\n }\n\n ['@test [obj, foothis.bar] -> obj.foothis.bar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foothis.bar'), obj.foothis.bar);\n }\n\n ['@test [obj, falseValue.notDefined] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'falseValue.notDefined'), undefined);\n }\n\n ['@test [obj, emptyString.length] -> 0'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'emptyString.length'), 0);\n }\n\n ['@test [obj, nullValue.notDefined] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'nullValue.notDefined'), undefined);\n }\n\n // ..........................................................\n // GLOBAL PATHS TREATED LOCAL WITH GET\n //\n\n ['@test [obj, Wuz] -> obj.Wuz'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'Wuz'), obj.Wuz);\n }\n\n ['@test [obj, Wuz.nar] -> obj.Wuz.nar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'Wuz.nar'), obj.Wuz.nar);\n }\n\n ['@test [obj, Foo] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'Foo'), undefined);\n }\n\n ['@test [obj, Foo.bar] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'Foo.bar'), undefined);\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/get_properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('getProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test can retrieve a hash of properties from an object via an argument list or array of property names'](assert) {\n let obj = {\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n };\n\n assert.deepEqual((0, _metal.getProperties)(obj, 'firstName', 'lastName'), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, 'firstName', 'lastName'), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, 'lastName'), { lastName: 'Jobs' });\n assert.deepEqual((0, _metal.getProperties)(obj), {});\n assert.deepEqual((0, _metal.getProperties)(obj, ['firstName', 'lastName']), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, ['firstName']), {\n firstName: 'Steve'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, []), {});\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/get_test', ['@ember/-internals/environment', '@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers', '@ember/runloop'], function (_environment, _runtime, _metal, _internalTestHelpers, _runloop) {\n 'use strict';\n\n function aget(x, y) {\n return x[y];\n }\n\n (0, _internalTestHelpers.moduleFor)('get', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object'](assert) {\n let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null\n };\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n assert.equal((0, _metal.get)(obj, key), obj[key], key);\n }\n }\n\n ['@test should retrieve a number key on an object'](assert) {\n let obj = { 1: 'first' };\n\n assert.equal((0, _metal.get)(obj, 1), 'first');\n }\n\n ['@test should retrieve an array index'](assert) {\n let arr = ['first', 'second'];\n\n assert.equal((0, _metal.get)(arr, 0), 'first');\n assert.equal((0, _metal.get)(arr, 1), 'second');\n }\n\n ['@test should retrieve an empty string key on an object'](assert) {\n let obj = { '': 'empty-string' };\n\n assert.equal((0, _metal.get)(obj, ''), 'empty-string');\n }\n\n ['@test should return undefined when passed an empty string if that key does not exist on an object'](assert) {\n let obj = { tomster: true };\n\n assert.equal((0, _metal.get)(obj, ''), undefined);\n }\n\n ['@test should not access a property more than once'](assert) {\n let count = 0;\n let obj = {\n get id() {\n return ++count;\n }\n };\n\n (0, _metal.get)(obj, 'id');\n\n assert.equal(count, 1);\n }\n\n ['@test should call unknownProperty on watched values if the value is undefined using getFromEmberMetal()/set()'](assert) {\n let obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n };\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should return value from unknown');\n }\n\n ['@test should call unknownProperty on watched values if the value is undefined using accessors'](assert) {\n if (_environment.ENV.USES_ACCESSORS) {\n let obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n };\n assert.equal(aget(obj, 'foo'), 'FOO', 'should return value from unknown');\n } else {\n assert.ok('SKIPPING ACCESSORS');\n }\n }\n\n ['@test get works with paths correctly'](assert) {\n let func = function () {};\n func.bar = 'awesome';\n\n let destroyedObj = _runtime.Object.create({ bar: 'great' });\n (0, _runloop.run)(() => destroyedObj.destroy());\n\n assert.equal((0, _metal.get)({ foo: null }, 'foo.bar'), undefined);\n assert.equal((0, _metal.get)({ foo: { bar: 'hello' } }, 'foo.bar.length'), 5);\n assert.equal((0, _metal.get)({ foo: func }, 'foo.bar'), 'awesome');\n assert.equal((0, _metal.get)({ foo: func }, 'foo.bar.length'), 7);\n assert.equal((0, _metal.get)({}, 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)(function () {}, 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)('', 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)({ foo: destroyedObj }, 'foo.bar'), undefined);\n }\n\n ['@test warn on attempts to call get with no arguments']() {\n expectAssertion(function () {\n (0, _metal.get)('aProperty');\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to call get with only one argument']() {\n expectAssertion(function () {\n (0, _metal.get)('aProperty');\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to call get with more then two arguments']() {\n expectAssertion(function () {\n (0, _metal.get)({}, 'aProperty', true);\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to get a property of undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'aProperty');\n }, /Cannot call get with 'aProperty' on an undefined object/i);\n }\n\n ['@test warn on attempts to get a property path of undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'aProperty.on.aPath');\n }, /Cannot call get with 'aProperty.on.aPath' on an undefined object/);\n }\n\n ['@test warn on attempts to get a property of null']() {\n expectAssertion(function () {\n (0, _metal.get)(null, 'aProperty');\n }, /Cannot call get with 'aProperty' on an undefined object/);\n }\n\n ['@test warn on attempts to get a property path of null']() {\n expectAssertion(function () {\n (0, _metal.get)(null, 'aProperty.on.aPath');\n }, /Cannot call get with 'aProperty.on.aPath' on an undefined object/);\n }\n\n ['@test warn on attempts to use get with an unsupported property path']() {\n let obj = {};\n expectAssertion(() => (0, _metal.get)(obj, null), /The key provided to get must be a string or number, you passed null/);\n expectAssertion(() => (0, _metal.get)(obj, NaN), /The key provided to get must be a string or number, you passed NaN/);\n expectAssertion(() => (0, _metal.get)(obj, undefined), /The key provided to get must be a string or number, you passed undefined/);\n expectAssertion(() => (0, _metal.get)(obj, false), /The key provided to get must be a string or number, you passed false/);\n }\n\n // ..........................................................\n // BUGS\n //\n\n ['@test (regression) watched properties on unmodified inherited objects should still return their original value'](assert) {\n let MyMixin = _metal.Mixin.create({\n someProperty: 'foo',\n propertyDidChange: (0, _metal.observer)('someProperty', () => {})\n });\n\n let baseObject = MyMixin.apply({});\n let theRealObject = Object.create(baseObject);\n\n assert.equal((0, _metal.get)(theRealObject, 'someProperty'), 'foo', 'should return the set value, not false');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('getWithDefault', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object'](assert) {\n let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null\n };\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n assert.equal((0, _metal.getWithDefault)(obj, key, 'fail'), obj[key], key);\n }\n\n obj = {\n undef: undefined\n };\n\n assert.equal((0, _metal.getWithDefault)(obj, 'undef', 'default'), 'default', 'explicit undefined retrieves the default');\n assert.equal((0, _metal.getWithDefault)(obj, 'not-present', 'default'), 'default', 'non-present key retrieves the default');\n }\n\n ['@test should call unknownProperty if defined and value is undefined'](assert) {\n let obj = {\n count: 0,\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n this.count++;\n return 'FOO';\n }\n };\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should return value from unknown');\n assert.equal(obj.count, 1, 'should have invoked');\n }\n\n ['@test if unknownProperty is present, it is called using getFromEmberMetal()/set()'](assert) {\n let obj = {\n unknownProperty(key) {\n if (key === 'foo') {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n }\n };\n assert.equal((0, _metal.getWithDefault)(obj, 'foo', 'fail'), 'FOO', 'should return value from unknownProperty');\n assert.equal((0, _metal.getWithDefault)(obj, 'bar', 'default'), 'default', 'should convert undefined from unknownProperty into default');\n }\n\n ['@test if unknownProperty is present, it is called using accessors'](assert) {\n if (_environment.ENV.USES_ACCESSORS) {\n let obj = {\n unknownProperty(key) {\n if (key === 'foo') {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n }\n };\n assert.equal(aget(obj, 'foo', 'fail'), 'FOO', 'should return value from unknownProperty');\n assert.equal(aget(obj, 'bar', 'default'), 'default', 'should convert undefined from unknownProperty into default');\n } else {\n assert.ok('SKIPPING ACCESSORS');\n }\n }\n\n // ..........................................................\n // BUGS\n //\n\n ['@test (regression) watched properties on unmodified inherited objects should still return their original value'](assert) {\n let MyMixin = _metal.Mixin.create({\n someProperty: 'foo',\n propertyDidChange: (0, _metal.observer)('someProperty', () => {\n /* nothing to do */\n })\n });\n\n let baseObject = MyMixin.apply({});\n let theRealObject = Object.create(baseObject);\n\n assert.equal((0, _metal.getWithDefault)(theRealObject, 'someProperty', 'fail'), 'foo', 'should return the set value, not false');\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/mandatory_setters_test', ['@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n function hasMandatorySetter(object, property) {\n try {\n return Object.getOwnPropertyDescriptor(object, property).set.isMandatorySetter === true;\n } catch (e) {\n return false;\n }\n }\n\n function hasMetaValue(object, property) {\n return (0, _meta.meta)(object).peekValues(property) !== undefined;\n }\n\n if (true /* DEBUG */) {\n (0, _internalTestHelpers.moduleFor)('mandory-setters', class extends _internalTestHelpers.AbstractTestCase {\n ['@test does not assert if property is not being watched'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n obj.someProp = 'blastix';\n assert.equal((0, _metal.get)(obj, 'someProp'), 'blastix');\n }\n\n ['@test should not setup mandatory-setter if property is not writable'](assert) {\n assert.expect(6);\n\n let obj = {};\n\n Object.defineProperty(obj, 'a', { value: true });\n Object.defineProperty(obj, 'b', { value: false });\n Object.defineProperty(obj, 'c', { value: undefined });\n Object.defineProperty(obj, 'd', { value: undefined, writable: false });\n Object.defineProperty(obj, 'e', {\n value: undefined,\n configurable: false\n });\n Object.defineProperty(obj, 'f', {\n value: undefined,\n configurable: true\n });\n\n (0, _metal.watch)(obj, 'a');\n (0, _metal.watch)(obj, 'b');\n (0, _metal.watch)(obj, 'c');\n (0, _metal.watch)(obj, 'd');\n (0, _metal.watch)(obj, 'e');\n (0, _metal.watch)(obj, 'f');\n\n assert.ok(!hasMandatorySetter(obj, 'a'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'b'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'c'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'd'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'e'), 'mandatory-setter should not be installed');\n assert.ok(!hasMandatorySetter(obj, 'f'), 'mandatory-setter should not be installed');\n }\n\n ['@test should not teardown non mandatory-setter descriptor'](assert) {\n assert.expect(1);\n\n let obj = {\n get a() {\n return 'hi';\n }\n };\n\n (0, _metal.watch)(obj, 'a');\n (0, _metal.unwatch)(obj, 'a');\n\n assert.equal(obj.a, 'hi');\n }\n\n ['@test should not confuse non descriptor watched gets'](assert) {\n assert.expect(2);\n\n let obj = {\n get a() {\n return 'hi';\n }\n };\n\n (0, _metal.watch)(obj, 'a');\n assert.equal((0, _metal.get)(obj, 'a'), 'hi');\n assert.equal(obj.a, 'hi');\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property'](assert) {\n assert.expect(2);\n\n let obj = { someProp: null };\n\n Object.defineProperty(obj, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test watched ES5 setter should not be smashed by mandatory setter'](assert) {\n let value;\n let obj = {\n get foo() {},\n set foo(_value) {\n value = _value;\n }\n };\n\n (0, _metal.watch)(obj, 'foo');\n\n (0, _metal.set)(obj, 'foo', 2);\n assert.equal(value, 2);\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in parent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n let obj = new Foo();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in grandparent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n function Bar() {}\n Bar.prototype = Object.create(Foo.prototype);\n Bar.prototype.constructor = Bar;\n\n let obj = new Bar();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should not setup mandatory-setter if setter is already setup on property in great grandparent prototype'](assert) {\n assert.expect(2);\n\n function Foo() {}\n\n Object.defineProperty(Foo.prototype, 'someProp', {\n get() {\n return null;\n },\n\n set(value) {\n assert.equal(value, 'foo-bar', 'custom setter was called');\n }\n });\n\n function Bar() {}\n Bar.prototype = Object.create(Foo.prototype);\n Bar.prototype.constructor = Bar;\n\n function Qux() {}\n Qux.prototype = Object.create(Bar.prototype);\n Qux.prototype.constructor = Qux;\n\n let obj = new Qux();\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'mandatory-setter should not be installed');\n\n obj.someProp = 'foo-bar';\n }\n\n ['@test should assert if set without set when property is being watched']() {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n (0, _metal.watch)(obj, 'someProp');\n\n expectAssertion(function () {\n obj.someProp = 'foo-bar';\n }, 'You must use set() to set the `someProp` property (of custom-object) to `foo-bar`.');\n }\n\n ['@test should not assert if set with set when property is being watched'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n (0, _metal.watch)(obj, 'someProp');\n (0, _metal.set)(obj, 'someProp', 'foo-bar');\n\n assert.equal((0, _metal.get)(obj, 'someProp'), 'foo-bar');\n }\n\n ['@test does not setup mandatory-setter if non-configurable'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: false,\n enumerable: true,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.ok(!hasMandatorySetter(obj, 'someProp'), 'blastix');\n }\n\n ['@test ensure after watch the property is restored (and the value is no-longer stored in meta) [non-enumerable]'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: true,\n enumerable: false,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.equal(hasMandatorySetter(obj, 'someProp'), true, 'should have a mandatory setter');\n\n let descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n\n assert.equal(descriptor.value, undefined, 'expected existing value to NOT remain');\n\n assert.ok(hasMetaValue(obj, 'someProp'), 'someProp is stored in meta.values');\n\n (0, _metal.unwatch)(obj, 'someProp');\n\n assert.ok(!hasMetaValue(obj, 'someProp'), 'someProp is no longer stored in meta.values');\n\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(hasMandatorySetter(obj, 'someProp'), false, 'should no longer have a mandatory setter');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n assert.equal(descriptor.value, 'blastix', 'expected existing value to remain');\n\n obj.someProp = 'new value';\n\n // make sure the descriptor remains correct (nothing funky, like a redefined, happened in the setter);\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, false, 'property should remain non-enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(descriptor.value, 'new value', 'expected existing value to NOT remain');\n assert.equal(obj.someProp, 'new value', 'expected value to be the getter');\n assert.equal(obj.someProp, 'new value');\n }\n\n ['@test ensure after watch the property is restored (and the value is no-longer stored in meta) [enumerable]'](assert) {\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n Object.defineProperty(obj, 'someProp', {\n configurable: true,\n enumerable: true,\n value: 'blastix'\n });\n\n (0, _metal.watch)(obj, 'someProp');\n assert.equal(hasMandatorySetter(obj, 'someProp'), true, 'should have a mandatory setter');\n\n let descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n\n assert.equal(descriptor.value, undefined, 'expected existing value to NOT remain');\n\n assert.ok(hasMetaValue(obj, 'someProp'), 'someProp is stored in meta.values');\n\n (0, _metal.unwatch)(obj, 'someProp');\n\n assert.ok(!hasMetaValue(obj, 'someProp'), 'someProp is no longer stored in meta.values');\n\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(hasMandatorySetter(obj, 'someProp'), false, 'should no longer have a mandatory setter');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(obj.someProp, 'blastix', 'expected value to be the getter');\n assert.equal(descriptor.value, 'blastix', 'expected existing value to remain');\n\n obj.someProp = 'new value';\n\n // make sure the descriptor remains correct (nothing funky, like a redefined, happened in the setter);\n descriptor = Object.getOwnPropertyDescriptor(obj, 'someProp');\n\n assert.equal(descriptor.enumerable, true, 'property should remain enumerable');\n assert.equal(descriptor.configurable, true, 'property should remain configurable');\n assert.equal(descriptor.value, 'new value', 'expected existing value to NOT remain');\n assert.equal(obj.someProp, 'new value');\n }\n\n ['@test sets up mandatory-setter if property comes from prototype'](assert) {\n assert.expect(2);\n\n let obj = {\n someProp: null,\n toString() {\n return 'custom-object';\n }\n };\n\n let obj2 = Object.create(obj);\n\n (0, _metal.watch)(obj2, 'someProp');\n\n assert.ok(hasMandatorySetter(obj2, 'someProp'), 'mandatory setter has been setup');\n\n expectAssertion(function () {\n obj2.someProp = 'foo-bar';\n }, 'You must use set() to set the `someProp` property (of custom-object) to `foo-bar`.');\n }\n\n ['@test inheritance remains live'](assert) {\n function Parent() {}\n Parent.prototype.food = 'chips';\n\n let child = new Parent();\n\n assert.equal(child.food, 'chips');\n\n (0, _metal.watch)(child, 'food');\n\n assert.equal(child.food, 'chips');\n\n Parent.prototype.food = 'icecreame';\n\n assert.equal(child.food, 'icecreame');\n\n (0, _metal.unwatch)(child, 'food');\n\n assert.equal(child.food, 'icecreame');\n\n Parent.prototype.food = 'chips';\n\n assert.equal(child.food, 'chips');\n }\n\n ['@test inheritance remains live and preserves this'](assert) {\n function Parent(food) {\n this._food = food;\n }\n\n Object.defineProperty(Parent.prototype, 'food', {\n get() {\n return this._food;\n }\n });\n\n let child = new Parent('chips');\n\n assert.equal(child.food, 'chips');\n\n (0, _metal.watch)(child, 'food');\n\n assert.equal(child.food, 'chips');\n\n child._food = 'icecreame';\n\n assert.equal(child.food, 'icecreame');\n\n (0, _metal.unwatch)(child, 'food');\n\n assert.equal(child.food, 'icecreame');\n\n let foodDesc = Object.getOwnPropertyDescriptor(Parent.prototype, 'food');\n assert.ok(!foodDesc.configurable, 'Parent.prototype.food desc should be non configable');\n assert.ok(!foodDesc.enumerable, 'Parent.prototype.food desc should be non enumerable');\n\n assert.equal(foodDesc.get.call({\n _food: 'hi'\n }), 'hi');\n assert.equal(foodDesc.set, undefined);\n\n assert.equal(child.food, 'icecreame');\n }\n });\n }\n});","enifed('@ember/-internals/metal/tests/accessors/set_path_test', ['@ember/-internals/environment', '@ember/-internals/metal', 'internal-test-helpers'], function (_environment, _metal, _internalTestHelpers) {\n 'use strict';\n\n let originalLookup = _environment.context.lookup;\n let lookup;\n\n let obj;\n function commonSetup() {\n _environment.context.lookup = lookup = {};\n obj = {\n foo: {\n bar: {\n baz: { biff: 'BIFF' }\n }\n }\n };\n }\n\n function commonTeardown() {\n _environment.context.lookup = originalLookup;\n obj = null;\n }\n\n (0, _internalTestHelpers.moduleFor)('set with path', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n commonSetup();\n }\n\n teardown() {\n commonTeardown();\n }\n\n ['@test [Foo, bar] -> Foo.bar'](assert) {\n lookup.Foo = {\n toString() {\n return 'Foo';\n }\n }; // Behave like an Ember.Namespace\n\n (0, _metal.set)(lookup.Foo, 'bar', 'baz');\n assert.equal((0, _metal.get)(lookup.Foo, 'bar'), 'baz');\n }\n\n // ..........................................................\n //\n // LOCAL PATHS\n\n ['@test [obj, foo] -> obj.foo'](assert) {\n (0, _metal.set)(obj, 'foo', 'BAM');\n assert.equal((0, _metal.get)(obj, 'foo'), 'BAM');\n }\n\n ['@test [obj, foo.bar] -> obj.foo.bar'](assert) {\n (0, _metal.set)(obj, 'foo.bar', 'BAM');\n assert.equal((0, _metal.get)(obj, 'foo.bar'), 'BAM');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('set with path - deprecated', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n commonSetup();\n }\n\n teardown() {\n commonTeardown();\n }\n\n // ..........................................................\n // DEPRECATED\n //\n ['@test [obj, bla.bla] gives a proper exception message'](assert) {\n let exceptionMessage = 'Property set failed: object in path \"bla\" could not be found.';\n try {\n (0, _metal.set)(obj, 'bla.bla', 'BAM');\n } catch (ex) {\n assert.equal(ex.message, exceptionMessage);\n }\n }\n\n ['@test [obj, foo.baz.bat] -> EXCEPTION'](assert) {\n assert.throws(() => (0, _metal.set)(obj, 'foo.baz.bat', 'BAM'));\n }\n\n ['@test [obj, foo.baz.bat] -> EXCEPTION'](assert) {\n (0, _metal.trySet)(obj, 'foo.baz.bat', 'BAM');\n assert.ok(true, 'does not raise');\n }\n });\n});","enifed('@ember/-internals/metal/tests/accessors/set_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('set', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _metal.setHasViews)(() => false);\n }\n\n ['@test should set arbitrary properties on an object'](assert) {\n let obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null,\n undefinedValue: undefined\n };\n\n let newObj = {};\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n\n assert.equal((0, _metal.set)(newObj, key, obj[key]), obj[key], 'should return value');\n assert.ok(key in newObj, 'should have key');\n assert.ok(newObj.hasOwnProperty(key), 'should have key');\n assert.equal((0, _metal.get)(newObj, key), obj[key], 'should set value');\n }\n }\n\n ['@test should set a number key on an object'](assert) {\n let obj = {};\n\n (0, _metal.set)(obj, 1, 'first');\n assert.equal(obj[1], 'first');\n }\n\n ['@test should set an array index'](assert) {\n let arr = ['first', 'second'];\n\n (0, _metal.set)(arr, 1, 'lol');\n assert.deepEqual(arr, ['first', 'lol']);\n }\n\n ['@test should call setUnknownProperty if defined and value is undefined'](assert) {\n let obj = {\n count: 0,\n\n unknownProperty() {\n assert.ok(false, 'should not invoke unknownProperty if setUnknownProperty is defined');\n },\n\n setUnknownProperty(key, value) {\n assert.equal(key, 'foo', 'should pass key');\n assert.equal(value, 'BAR', 'should pass key');\n this.count++;\n return 'FOO';\n }\n };\n\n assert.equal((0, _metal.set)(obj, 'foo', 'BAR'), 'BAR', 'should return set value');\n assert.equal(obj.count, 1, 'should have invoked');\n }\n\n ['@test warn on attempts to call set with undefined as object']() {\n expectAssertion(() => (0, _metal.set)(undefined, 'aProperty', 'BAM'), /Cannot call set with 'aProperty' on an undefined object./);\n }\n\n ['@test warn on attempts to call set with null as object']() {\n expectAssertion(() => (0, _metal.set)(null, 'aProperty', 'BAM'), /Cannot call set with 'aProperty' on an undefined object./);\n }\n\n ['@test warn on attempts to use set with an unsupported property path']() {\n let obj = {};\n expectAssertion(() => (0, _metal.set)(obj, null, 42), /The key provided to set must be a string or number, you passed null/);\n expectAssertion(() => (0, _metal.set)(obj, NaN, 42), /The key provided to set must be a string or number, you passed NaN/);\n expectAssertion(() => (0, _metal.set)(obj, undefined, 42), /The key provided to set must be a string or number, you passed undefined/);\n expectAssertion(() => (0, _metal.set)(obj, false, 42), /The key provided to set must be a string or number, you passed false/);\n }\n\n ['@test warn on attempts of calling set on a destroyed object']() {\n let obj = { isDestroyed: true };\n\n expectAssertion(() => (0, _metal.set)(obj, 'favoriteFood', 'hot dogs'), 'calling set on destroyed object: [object Object].favoriteFood = hot dogs');\n }\n\n ['@test does not trigger auto-run assertion for objects that have not been tagged'](assert) {\n (0, _metal.setHasViews)(() => true);\n let obj = {};\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test does not warn on attempts of calling set on a destroyed object with `trySet`'](assert) {\n let obj = { isDestroyed: true };\n\n (0, _metal.trySet)(obj, 'favoriteFood', 'hot dogs');\n assert.equal(obj.favoriteFood, undefined, 'does not set and does not error');\n }\n });\n});","enifed('@ember/-internals/metal/tests/alias_test', ['@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let obj, count;\n\n function incrementCount() {\n count++;\n }\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/metal/alias', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = { foo: { faz: 'FOO' } };\n count = 0;\n }\n\n afterEach() {\n obj = null;\n }\n\n ['@test should proxy get to alt key'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n }\n\n ['@test should proxy set to alt key'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.set)(obj, 'bar', 'BAR');\n assert.equal((0, _metal.get)(obj, 'foo.faz'), 'BAR');\n }\n\n ['@test old dependent keys should not trigger property changes'](assert) {\n let obj1 = Object.create(null);\n (0, _metal.defineProperty)(obj1, 'foo', null, null);\n (0, _metal.defineProperty)(obj1, 'bar', (0, _metal.alias)('foo'));\n (0, _metal.defineProperty)(obj1, 'baz', (0, _metal.alias)('foo'));\n (0, _metal.defineProperty)(obj1, 'baz', (0, _metal.alias)('bar')); // redefine baz\n (0, _metal.addObserver)(obj1, 'baz', incrementCount);\n\n (0, _metal.set)(obj1, 'foo', 'FOO');\n assert.equal(count, 1);\n\n (0, _metal.removeObserver)(obj1, 'baz', incrementCount);\n\n (0, _metal.set)(obj1, 'foo', 'OOF');\n assert.equal(count, 1);\n }\n\n [`@test inheriting an observer of the alias from the prototype then\n redefining the alias on the instance to another property dependent on same key\n does not call the observer twice`](assert) {\n let obj1 = Object.create(null);\n obj1.incrementCount = incrementCount;\n\n (0, _meta.meta)(obj1).proto = obj1;\n\n (0, _metal.defineProperty)(obj1, 'foo', null, null);\n (0, _metal.defineProperty)(obj1, 'bar', (0, _metal.alias)('foo'));\n (0, _metal.defineProperty)(obj1, 'baz', (0, _metal.alias)('foo'));\n (0, _metal.addObserver)(obj1, 'baz', null, 'incrementCount');\n\n let obj2 = Object.create(obj1);\n (0, _metal.defineProperty)(obj2, 'baz', (0, _metal.alias)('bar')); // override baz\n\n (0, _metal.set)(obj2, 'foo', 'FOO');\n assert.equal(count, 1);\n\n (0, _metal.removeObserver)(obj2, 'baz', null, 'incrementCount');\n\n (0, _metal.set)(obj2, 'foo', 'OOF');\n assert.equal(count, 1);\n }\n\n ['@test an observer of the alias works if added after defining the alias'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n assert.equal(count, 1);\n }\n\n ['@test an observer of the alias works if added before defining the alias'](assert) {\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n assert.equal(count, 1);\n }\n\n ['@test object with alias is dirtied if interior object of alias is set after consumption'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.get)(obj, 'bar');\n\n let tag = (0, _metal.tagFor)(obj);\n let tagValue = tag.value();\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n\n assert.ok(!tag.validate(tagValue), 'setting the aliased key should dirty the object');\n }\n\n ['@test setting alias on self should fail assertion']() {\n expectAssertion(() => (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('bar')), \"Setting alias 'bar' on self\");\n }\n\n ['@test destroyed alias does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.defineProperty)(obj, 'bar', null);\n\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n }\n\n ['@test setting on oneWay alias does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz').oneWay());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.set)(obj, 'bar', null);\n\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n }\n\n ['@test redefined alias with observer does not disturb watch count'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz').oneWay());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n\n assert.equal(count, 0);\n\n (0, _metal.set)(obj, 'bar', null);\n\n assert.equal(count, 1);\n assert.notOk((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n\n assert.equal(count, 1);\n assert.ok((0, _metal.isWatching)(obj, 'foo.faz'));\n\n (0, _metal.set)(obj, 'foo.faz', 'great');\n\n assert.equal(count, 2);\n }\n });\n});","enifed('@ember/-internals/metal/tests/chains_test', ['@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Chains', class extends _internalTestHelpers.AbstractTestCase {\n ['@test finishChains should properly copy chains from prototypes to instances'](assert) {\n function didChange() {}\n\n let obj = {};\n (0, _metal.addObserver)(obj, 'foo.bar', null, didChange);\n\n let childObj = Object.create(obj);\n\n let parentMeta = (0, _meta.meta)(obj);\n let childMeta = (0, _meta.meta)(childObj);\n\n (0, _metal.finishChains)(childMeta);\n\n assert.ok(parentMeta.readableChains() !== childMeta.readableChains(), 'The chains object is copied');\n }\n\n ['@test does not observe primitive values'](assert) {\n let obj = {\n foo: { bar: 'STRING' }\n };\n\n (0, _metal.addObserver)(obj, 'foo.bar.baz', null, function () {});\n let meta = (0, _meta.peekMeta)(obj);\n assert.notOk(meta._object);\n }\n\n ['@test observer and CP chains'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('qux.[]', function () {}));\n (0, _metal.defineProperty)(obj, 'qux', (0, _metal.computed)(function () {}));\n\n // create DK chains\n (0, _metal.get)(obj, 'foo');\n\n // create observer chain\n (0, _metal.addObserver)(obj, 'qux.length', function () {});\n\n /*\n +-----+\n | qux | root CP\n +-----+\n ^\n +------+-----+\n | |\n +--------+ +----+\n | length | | [] | chainWatchers\n +--------+ +----+\n observer CP(foo, 'qux.[]')\n */\n\n // invalidate qux\n (0, _metal.notifyPropertyChange)(obj, 'qux');\n\n // CP chain is blown away\n\n /*\n +-----+\n | qux | root CP\n +-----+\n ^\n +------+xxxxxx\n | x\n +--------+ xxxxxx\n | length | x [] x chainWatchers\n +--------+ xxxxxx\n observer CP(foo, 'qux.[]')\n */\n\n (0, _metal.get)(obj, 'qux'); // CP chain re-recreated\n assert.ok(true, 'no crash');\n }\n\n ['@test checks cache correctly'](assert) {\n let obj = {};\n let parentChainNode = new _metal.ChainNode(null, null, obj);\n let chainNode = new _metal.ChainNode(parentChainNode, 'foo');\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return undefined;\n }));\n (0, _metal.get)(obj, 'foo');\n\n assert.strictEqual(chainNode.value(), undefined);\n }\n\n ['@test chains are watched correctly'](assert) {\n let obj = { foo: { bar: { baz: 1 } } };\n\n (0, _metal.watch)(obj, 'foo.bar.baz');\n\n assert.equal((0, _metal.watcherCount)(obj, 'foo'), 1);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar.baz'), 1);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar'), 1);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo.bar, 'baz'), 1);\n\n (0, _metal.unwatch)(obj, 'foo.bar.baz');\n\n assert.equal((0, _metal.watcherCount)(obj, 'foo'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'foo.bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo, 'bar.baz'), 0);\n assert.equal((0, _metal.watcherCount)(obj.foo.bar, 'baz'), 0);\n }\n\n ['@test chains with single character keys are watched correctly'](assert) {\n let obj = { a: { b: { c: 1 } } };\n\n (0, _metal.watch)(obj, 'a.b.c');\n\n assert.equal((0, _metal.watcherCount)(obj, 'a'), 1);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b.c'), 1);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b'), 1);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a.b, 'c'), 1);\n\n (0, _metal.unwatch)(obj, 'a.b.c');\n\n assert.equal((0, _metal.watcherCount)(obj, 'a'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b'), 0);\n assert.equal((0, _metal.watcherCount)(obj, 'a.b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a, 'b.c'), 0);\n assert.equal((0, _metal.watcherCount)(obj.a.b, 'c'), 0);\n }\n\n ['@test writable chains is not defined more than once'](assert) {\n assert.expect(0);\n\n class Base {\n constructor() {\n (0, _metal.finishChains)((0, _meta.meta)(this));\n }\n\n didChange() {}\n }\n\n Base.prototype.foo = {\n bar: {\n baz: {\n value: 123\n }\n }\n };\n\n // Define a standard computed property, which will eventually setup dependencies\n (0, _metal.defineProperty)(Base.prototype, 'bar', (0, _metal.computed)('foo.bar', {\n get() {\n return this.foo.bar;\n }\n }));\n\n // Define some aliases, which will proxy chains along\n (0, _metal.defineProperty)(Base.prototype, 'baz', (0, _metal.alias)('bar.baz'));\n (0, _metal.defineProperty)(Base.prototype, 'value', (0, _metal.alias)('baz.value'));\n\n // Define an observer, which will eagerly attempt to setup chains and watch\n // their values. This follows the aliases eagerly, and forces the first\n // computed to actually set up its values/dependencies for chains. If\n // writableChains was not already defined, this results in multiple root\n // chain nodes being defined on the same object meta.\n (0, _metal.addObserver)(Base.prototype, 'value', null, 'didChange');\n\n class Child extends Base {}\n\n let childObj = new Child();\n\n (0, _metal.set)(childObj, 'foo.bar', {\n baz: {\n value: 456\n }\n });\n }\n });\n});","enifed('@ember/-internals/metal/tests/computed_test', ['@ember/-internals/runtime', '@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_runtime, _metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let obj, count;\n\n (0, _internalTestHelpers.moduleFor)('computed', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property should be an instance of descriptor'](assert) {\n assert.ok((0, _metal.computed)(function () {}) instanceof _metal.Descriptor);\n }\n\n ['@test computed properties assert the presence of a getter or setter function']() {\n expectAssertion(function () {\n (0, _metal.computed)('nogetternorsetter', {});\n }, 'Computed properties must receive a getter or a setter, you passed none.');\n }\n\n ['@test computed properties check for the presence of a function or configuration object']() {\n expectAssertion(function () {\n (0, _metal.computed)('nolastargument');\n }, 'computed expects a function or an object as last argument.');\n }\n\n ['@test computed properties defined with an object only allow `get` and `set` keys']() {\n expectAssertion(function () {\n (0, _metal.computed)({\n get() {},\n set() {},\n other() {}\n });\n }, 'Config object passed to computed can only contain `get` and `set` keys.');\n }\n\n ['@test computed property can be accessed without `get`'](assert) {\n let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\n\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test defining computed property should invoke property on get'](assert) {\n let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test defining computed property should invoke property on set'](assert) {\n let obj = {};\n let count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n set(key, value) {\n count++;\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n }));\n\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value');\n assert.equal(count, 1, 'should have invoked computed property');\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed bar', 'should return new value');\n }\n\n ['@test defining a computed property with a dependent key ending with @each is expanded to []'](assert) {\n let cp = (0, _metal.computed)('blazo.@each', function () {});\n\n assert.deepEqual(cp._dependentKeys, ['blazo.[]']);\n\n cp = (0, _metal.computed)('qux', 'zoopa.@each', function () {});\n\n assert.deepEqual(cp._dependentKeys, ['qux', 'zoopa.[]']);\n }\n\n ['@test defining a computed property with a dependent key more than one level deep beyond @each is not supported']() {\n expectNoWarning(() => {\n (0, _metal.computed)('todos', () => {});\n });\n\n expectNoWarning(() => {\n (0, _metal.computed)('todos.@each.owner', () => {});\n });\n\n expectWarning(() => {\n (0, _metal.computed)('todos.@each.owner.name', () => {});\n }, /You used the key \"todos\\.@each\\.owner\\.name\" which is invalid\\. /);\n\n expectWarning(() => {\n (0, _metal.computed)('todos.@each.owner.@each.name', () => {});\n }, /You used the key \"todos\\.@each\\.owner\\.@each\\.name\" which is invalid\\. /);\n }\n });\n\n let objA, objB;\n (0, _internalTestHelpers.moduleFor)('computed should inherit through prototype', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n set(key, value) {\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n }));\n\n objB = Object.create(objA);\n objB.__foo = 'FOO'; // make a copy;\n }\n\n afterEach() {\n objA = objB = null;\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should get FOO from B');\n\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should NOT change B');\n\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'computed bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should NOT change A');\n\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'computed bar', 'should NOT change B');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('redefining computed property to normal', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n set(key, value) {\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n }));\n\n objB = Object.create(objA);\n (0, _metal.defineProperty)(objB, 'foo'); // make this just a normal property.\n }\n\n afterEach() {\n objA = objB = null;\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), undefined, 'should get undefined from B');\n\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), undefined, 'should NOT change B');\n\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should NOT change A');\n\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar', 'should NOT change B');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('redefining computed property to another property', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objA = { __foo: 'FOO' };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n set(key, value) {\n this['__' + key] = 'A ' + value;\n return this['__' + key];\n }\n }));\n\n objB = Object.create(objA);\n objB.__foo = 'FOO';\n (0, _metal.defineProperty)(objB, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n set(key, value) {\n this['__' + key] = 'B ' + value;\n return this['__' + key];\n }\n }));\n }\n\n afterEach() {\n objA = objB = null;\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should get FOO from B');\n\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should NOT change B');\n\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'B bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BIFF', 'should NOT change A');\n\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'B bar', 'should NOT change B');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - metadata', class extends _internalTestHelpers.AbstractTestCase {\n ['@test can set metadata on a computed property'](assert) {\n let computedProperty = (0, _metal.computed)(function () {});\n computedProperty.meta({ key: 'keyValue' });\n\n assert.equal(computedProperty.meta().key, 'keyValue', 'saves passed meta hash to the _meta property');\n }\n\n ['@test meta should return an empty hash if no meta is set'](assert) {\n let computedProperty = (0, _metal.computed)(function () {});\n assert.deepEqual(computedProperty.meta(), {}, 'returned value is an empty hash');\n }\n });\n\n // ..........................................................\n // CACHEABLE\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - cacheable', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {};\n count = 0;\n let func = function () {\n count++;\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({ get: func, set: func }));\n }\n\n afterEach() {\n obj = count = null;\n }\n ['@test cacheable should cache'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'first get');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'second get');\n assert.equal(count, 1, 'should only invoke once');\n }\n\n ['@test modifying a cacheable property should update cache'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'first get');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'second get');\n\n assert.equal((0, _metal.set)(obj, 'foo', 'baz'), 'baz', 'setting');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'third get');\n assert.equal(count, 2, 'should not invoke again');\n }\n\n ['@test inherited property should not pick up cache'](assert) {\n let objB = Object.create(obj);\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'obj first get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB first get');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'obj second get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB second get');\n\n (0, _metal.set)(obj, 'foo', 'baz'); // modify A\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 3', 'obj third get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB third get');\n }\n\n ['@test getCachedValueFor should return the cached value'](assert) {\n assert.equal((0, _metal.getCachedValueFor)(obj, 'foo'), undefined, 'should not yet be a cached value');\n\n (0, _metal.get)(obj, 'foo');\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'foo'), 'bar 1', 'should retrieve cached value');\n }\n\n ['@test getCachedValueFor should return falsy cached values'](assert) {\n (0, _metal.defineProperty)(obj, 'falsy', (0, _metal.computed)(function () {\n return false;\n }));\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'falsy'), undefined, 'should not yet be a cached value');\n\n (0, _metal.get)(obj, 'falsy');\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'falsy'), false, 'should retrieve cached value');\n }\n\n ['@test setting a cached computed property passes the old value as the third argument'](assert) {\n let obj = {\n foo: 0\n };\n\n let receivedOldValue;\n\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)({\n get() {},\n set(key, value, oldValue) {\n receivedOldValue = oldValue;\n return value;\n }\n }).property('foo'));\n\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.strictEqual(receivedOldValue, undefined, 'oldValue should be undefined');\n\n (0, _metal.set)(obj, 'plusOne', 2);\n assert.strictEqual(receivedOldValue, 1, 'oldValue should be 1');\n\n (0, _metal.set)(obj, 'plusOne', 3);\n assert.strictEqual(receivedOldValue, 2, 'oldValue should be 2');\n }\n });\n\n // ..........................................................\n // DEPENDENT KEYS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = { bar: 'baz' };\n count = 0;\n let getterAndSetter = function () {\n count++;\n (0, _metal.get)(this, 'bar');\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get: getterAndSetter,\n set: getterAndSetter\n }).property('bar'));\n }\n\n afterEach() {\n obj = count = null;\n }\n\n ['@test should lazily watch dependent keys on set'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n }\n\n ['@test should lazily watch dependent keys on get'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n (0, _metal.get)(obj, 'foo');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n }\n\n ['@test local dependent key should invalidate cache'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'get once');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'cached retrieve');\n }\n\n ['@test should invalidate multiple nested dependent keys'](assert) {\n let count = 0;\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n count++;\n (0, _metal.get)(this, 'baz');\n return 'baz ' + count;\n }).property('baz'));\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'get once');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'baz', 'BIFF'); // should invalidate bar -> foo\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'should not be watching dependent key after cache cleared');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), false, 'should not be watching dependent key after cache cleared');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'cached retrieve');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily setup watching dependent key');\n assert.equal((0, _metal.isWatching)(obj, 'baz'), true, 'lazily setup watching dependent key');\n }\n\n ['@test circular keys should not blow up'](assert) {\n let func = function () {\n count++;\n return 'bar ' + count;\n };\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)({ get: func, set: func }).property('foo'));\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n count++;\n return 'foo ' + count;\n }).property('bar'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'get once');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should invalidate bar -> foo -> bar\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'cached retrieve');\n }\n\n ['@test redefining a property should undo old dependent keys'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1');\n assert.equal((0, _metal.isWatching)(obj, 'bar'), true, 'lazily watching dependent key');\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n count++;\n return 'baz ' + count;\n }).property('baz'));\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'after redefining should not be watching dependent key');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should not kill cache\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n\n (0, _metal.set)(obj, 'baz', 'BOP');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 3');\n }\n\n ['@test can watch multiple dependent keys specified declaratively via brace expansion'](assert) {\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n count++;\n return 'foo ' + count;\n }).property('qux.{bar,baz}'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'get once');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'cached retrieve');\n\n (0, _metal.set)(obj, 'qux', {});\n (0, _metal.set)(obj, 'qux.bar', 'bar'); // invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 2', 'foo invalidated from bar');\n\n (0, _metal.set)(obj, 'qux.baz', 'baz'); // invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'foo invalidated from baz');\n\n (0, _metal.set)(obj, 'qux.quux', 'quux'); // do not invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'foo not invalidated by quux');\n }\n\n ['@test throws assertion if brace expansion notation has spaces']() {\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'roo', (0, _metal.computed)(function () {\n count++;\n return 'roo ' + count;\n }).property('fee.{bar, baz,bop , }'));\n }, /cannot contain spaces/);\n }\n\n ['@test throws an assertion if an uncached `get` is called after object is destroyed'](assert) {\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'precond not watching dependent key');\n\n let meta = (0, _meta.meta)(obj);\n meta.destroy();\n\n obj.toString = () => '';\n\n expectAssertion(() => {\n (0, _metal.get)(obj, 'foo');\n }, 'Cannot modify dependent keys for `foo` on `` after it has been destroyed.');\n\n assert.equal((0, _metal.isWatching)(obj, 'bar'), false, 'deps were not updated');\n }\n });\n\n // ..........................................................\n // CHAINED DEPENDENT KEYS\n //\n\n let func;\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey with chained properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n };\n\n count = 0;\n func = function () {\n count++;\n return (0, _metal.get)(obj, 'foo.bar.baz.biff') + ' ' + count;\n };\n }\n\n afterEach() {\n obj = count = func = null;\n }\n\n ['@test depending on simple chain'](assert) {\n // assign computed property\n (0, _metal.defineProperty)(obj, 'prop', (0, _metal.computed)(func).property('foo.bar.baz.biff'));\n\n assert.equal((0, _metal.get)(obj, 'prop'), 'BIFF 1');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 2');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 2');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', { biff: 'BLOB' });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 4');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 4');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 6');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 6');\n\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 8');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 8');\n\n (0, _metal.defineProperty)(obj, 'prop');\n (0, _metal.set)(obj, 'prop', 'NONE');\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE');\n\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE'); // should do nothing\n assert.equal(count, 8, 'should be not have invoked computed again');\n }\n\n ['@test chained dependent keys should evaluate computed properties lazily'](assert) {\n (0, _metal.defineProperty)(obj.foo.bar, 'b', (0, _metal.computed)(func));\n (0, _metal.defineProperty)(obj.foo, 'c', (0, _metal.computed)(function () {}).property('bar.b'));\n assert.equal(count, 0, 'b should not run');\n }\n });\n\n // ..........................................................\n // improved-cp-syntax\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - improved cp syntax', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setter and getters are passed using an object'](assert) {\n let testObj = _runtime.Object.extend({\n a: '1',\n b: '2',\n aInt: (0, _metal.computed)('a', {\n get(keyName) {\n assert.equal(keyName, 'aInt', 'getter receives the keyName');\n return parseInt(this.get('a'));\n },\n set(keyName, value, oldValue) {\n assert.equal(keyName, 'aInt', 'setter receives the keyName');\n assert.equal(value, 123, 'setter receives the new value');\n assert.equal(oldValue, 1, 'setter receives the old value');\n this.set('a', '' + value); // side effect\n return parseInt(this.get('a'));\n }\n })\n }).create();\n\n assert.ok(testObj.get('aInt') === 1, 'getter works');\n testObj.set('aInt', 123);\n assert.ok(testObj.get('a') === '123', 'setter works');\n assert.ok(testObj.get('aInt') === 123, 'cp has been updated too');\n }\n\n ['@test setter can be omited'](assert) {\n let testObj = _runtime.Object.extend({\n a: '1',\n b: '2',\n aInt: (0, _metal.computed)('a', {\n get(keyName) {\n assert.equal(keyName, 'aInt', 'getter receives the keyName');\n return parseInt(this.get('a'));\n }\n })\n }).create();\n\n assert.ok(testObj.get('aInt') === 1, 'getter works');\n assert.ok(testObj.get('a') === '1');\n testObj.set('aInt', '123');\n assert.ok(testObj.get('aInt') === '123', 'cp has been updated too');\n }\n\n ['@test getter can be omited'](assert) {\n let testObj = _runtime.Object.extend({\n com: (0, _metal.computed)({\n set(key, value) {\n return value;\n }\n })\n }).create();\n\n assert.ok(testObj.get('com') === undefined);\n testObj.set('com', '123');\n assert.ok(testObj.get('com') === '123', 'cp has been updated');\n }\n\n ['@test the return value of the setter gets cached'](assert) {\n let testObj = _runtime.Object.extend({\n a: '1',\n sampleCP: (0, _metal.computed)('a', {\n get() {\n assert.ok(false, 'The getter should not be invoked');\n return 'get-value';\n },\n set() {\n return 'set-value';\n }\n })\n }).create();\n\n testObj.set('sampleCP', 'abcd');\n assert.ok(testObj.get('sampleCP') === 'set-value', 'The return value of the CP was cached');\n }\n });\n\n // ..........................................................\n // BUGS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed edge cases', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adding a computed property should show up in key iteration'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {}));\n\n let found = [];\n for (let key in obj) {\n found.push(key);\n }\n assert.ok(found.indexOf('foo') >= 0, 'should find computed property in iteration found=' + found);\n assert.ok('foo' in obj, 'foo in obj should pass');\n }\n\n [\"@test when setting a value after it had been retrieved empty don't pass function UNDEFINED as oldValue\"](assert) {\n let obj = {};\n let oldValueIsNoFunction = true;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {},\n set(key, value, oldValue) {\n if (typeof oldValue === 'function') {\n oldValueIsNoFunction = false;\n }\n return undefined;\n }\n }));\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', undefined);\n\n assert.ok(oldValueIsNoFunction);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - setter', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setting a watched computed property'](assert) {\n let obj = {\n firstName: 'Yehuda',\n lastName: 'Katz'\n };\n\n (0, _metal.defineProperty)(obj, 'fullName', (0, _metal.computed)({\n get() {\n return (0, _metal.get)(this, 'firstName') + ' ' + (0, _metal.get)(this, 'lastName');\n },\n set(key, value) {\n let values = value.split(' ');\n (0, _metal.set)(this, 'firstName', values[0]);\n (0, _metal.set)(this, 'lastName', values[1]);\n return value;\n }\n }).property('firstName', 'lastName'));\n\n let fullNameDidChange = 0;\n let firstNameDidChange = 0;\n let lastNameDidChange = 0;\n (0, _metal.addObserver)(obj, 'fullName', function () {\n fullNameDidChange++;\n });\n (0, _metal.addObserver)(obj, 'firstName', function () {\n firstNameDidChange++;\n });\n (0, _metal.addObserver)(obj, 'lastName', function () {\n lastNameDidChange++;\n });\n\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Yehuda Katz');\n\n (0, _metal.set)(obj, 'fullName', 'Yehuda Katz');\n\n (0, _metal.set)(obj, 'fullName', 'Kris Selden');\n\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Kris Selden');\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Kris');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Selden');\n\n assert.equal(fullNameDidChange, 1);\n assert.equal(firstNameDidChange, 1);\n assert.equal(lastNameDidChange, 1);\n }\n\n ['@test setting a cached computed property that modifies the value you give it'](assert) {\n let obj = {\n foo: 0\n };\n\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)({\n get() {\n return (0, _metal.get)(this, 'foo') + 1;\n },\n set(key, value) {\n (0, _metal.set)(this, 'foo', value);\n return value + 1;\n }\n }).property('foo'));\n\n let plusOneDidChange = 0;\n (0, _metal.addObserver)(obj, 'plusOne', function () {\n plusOneDidChange++;\n });\n\n assert.equal((0, _metal.get)(obj, 'plusOne'), 1);\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n\n assert.equal(plusOneDidChange, 1);\n\n (0, _metal.set)(obj, 'foo', 5);\n assert.equal((0, _metal.get)(obj, 'plusOne'), 6);\n\n assert.equal(plusOneDidChange, 2);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - default setter', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test when setting a value on a computed property that doesn't handle sets\"](assert) {\n let obj = {};\n let observerFired = false;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return 'foo';\n }));\n\n (0, _metal.addObserver)(obj, 'foo', null, () => observerFired = true);\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'The set value is properly returned');\n assert.ok(typeof obj.foo === 'string', 'The computed property was removed');\n assert.ok(observerFired, 'The observer was still notified');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed - readOnly', class extends _internalTestHelpers.AbstractTestCase {\n ['@test is chainable'](assert) {\n let cp = (0, _metal.computed)(function () {}).readOnly();\n\n assert.ok(cp instanceof _metal.Descriptor);\n assert.ok(cp instanceof _metal.ComputedProperty);\n }\n\n ['@test throws assertion if called over a CP with a setter defined with the new syntax']() {\n expectAssertion(() => {\n (0, _metal.computed)({\n get() {},\n set() {}\n }).readOnly();\n }, /Computed properties that define a setter using the new syntax cannot be read-only/);\n }\n\n ['@test protects against setting'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return 'barValue';\n }).readOnly());\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n\n assert.throws(() => {\n (0, _metal.set)(obj, 'bar', 'newBar');\n }, /Cannot set read\\-only property \"bar\" on object:/);\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n }\n });\n});","enifed('@ember/-internals/metal/tests/descriptor_test', ['@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers'], function (_runtime, _metal, _internalTestHelpers) {\n 'use strict';\n\n let classes = [class {\n static module(title) {\n return `${title}: using defineProperty on an object directly`;\n }\n\n constructor() {\n this.object = {};\n }\n\n install(key, desc, assert) {\n let { object } = this;\n\n (0, _metal.defineProperty)(object, key, desc);\n\n assert.ok(object.hasOwnProperty(key));\n }\n\n set(key, value) {\n this.object[key] = value;\n }\n\n finalize() {\n return this.object;\n }\n\n source() {\n return this.object;\n }\n }, class {\n static module(title) {\n return `${title}: using defineProperty on a prototype`;\n }\n\n constructor() {\n this.proto = {};\n }\n\n install(key, desc, assert) {\n let { proto } = this;\n\n (0, _metal.defineProperty)(proto, key, desc);\n\n assert.ok(proto.hasOwnProperty(key));\n }\n\n set(key, value) {\n this.proto[key] = value;\n }\n\n finalize() {\n return Object.create(this.proto);\n }\n\n source() {\n return this.proto;\n }\n }, class {\n static module(title) {\n return `${title}: in EmberObject.extend()`;\n }\n\n constructor() {\n this.klass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.klass = _runtime.Object.extend(this.props);\n return this.klass.create();\n }\n\n source() {\n return this.klass.prototype;\n }\n }, class {\n static module(title) {\n return `${title}: in EmberObject.extend() through a mixin`;\n }\n\n constructor() {\n this.klass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.klass = _runtime.Object.extend(_metal.Mixin.create(this.props));\n return this.klass.create();\n }\n\n source() {\n return this.klass.prototype;\n }\n }, class {\n static module(title) {\n return `${title}: inherited from another EmberObject super class`;\n }\n\n constructor() {\n this.superklass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.superklass = _runtime.Object.extend(this.props);\n return this.superklass.extend().create();\n }\n\n source() {\n return this.superklass.prototype;\n }\n }];\n\n classes.forEach(TestClass => {\n (0, _internalTestHelpers.moduleFor)(TestClass.module('@ember/-internals/metal/descriptor'), class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining a configurable property'](assert) {\n let factory = new TestClass(assert);\n\n factory.install('foo', (0, _metal.descriptor)({ configurable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n delete source.foo;\n\n assert.strictEqual(obj.foo, undefined);\n\n Object.defineProperty(source, 'foo', { configurable: true, value: 'baz' });\n\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a non-configurable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ configurable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.throws(() => delete source.foo, TypeError);\n\n assert.throws(() => Object.defineProperty(source, 'foo', {\n configurable: true,\n value: 'baz'\n }), TypeError);\n\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining an enumerable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ enumerable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.ok(Object.keys(source).indexOf('foo') !== -1);\n }\n\n ['@test defining a non-enumerable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ enumerable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.ok(Object.keys(source).indexOf('foo') === -1);\n }\n\n ['@test defining a writable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ writable: true, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n source.foo = 'baz';\n\n assert.equal(obj.foo, 'baz');\n\n obj.foo = 'bat';\n\n assert.equal(obj.foo, 'bat');\n }\n\n ['@test defining a non-writable property'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({ writable: false, value: 'bar' }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n let source = factory.source();\n\n assert.throws(() => source.foo = 'baz', TypeError);\n assert.throws(() => obj.foo = 'baz', TypeError);\n\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining a getter'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n get: function () {\n return this.__foo__;\n }\n }), assert);\n\n factory.set('__foo__', 'bar');\n\n let obj = factory.finalize();\n\n assert.equal(obj.foo, 'bar');\n\n obj.__foo__ = 'baz';\n\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a setter'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n\n factory.set('__foo__', 'bar');\n\n let obj = factory.finalize();\n\n assert.equal(obj.__foo__, 'bar');\n\n obj.foo = 'baz';\n\n assert.equal(obj.__foo__, 'baz');\n }\n\n ['@test combining multiple setter and getters'](assert) {\n let factory = new TestClass(assert);\n factory.install('foo', (0, _metal.descriptor)({\n get: function () {\n return this.__foo__;\n },\n\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n\n factory.set('__foo__', 'foo');\n\n factory.install('bar', (0, _metal.descriptor)({\n get: function () {\n return this.__bar__;\n },\n\n set: function (value) {\n this.__bar__ = value;\n }\n }), assert);\n\n factory.set('__bar__', 'bar');\n\n factory.install('fooBar', (0, _metal.descriptor)({\n get: function () {\n return this.foo + '-' + this.bar;\n }\n }), assert);\n\n let obj = factory.finalize();\n\n assert.equal(obj.fooBar, 'foo-bar');\n\n obj.foo = 'FOO';\n\n assert.equal(obj.fooBar, 'FOO-bar');\n\n obj.__bar__ = 'BAR';\n\n assert.equal(obj.fooBar, 'FOO-BAR');\n\n assert.throws(() => obj.fooBar = 'foobar', TypeError);\n\n assert.equal(obj.fooBar, 'FOO-BAR');\n }\n });\n });\n});","enifed('@ember/-internals/metal/tests/events_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/props/events_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test listener should receive event - removing should remove'](assert) {\n let obj = {};\n let count = 0;\n\n function F() {\n count++;\n }\n\n (0, _metal.addListener)(obj, 'event!', F);\n assert.equal(count, 0, 'nothing yet');\n\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'received event');\n\n (0, _metal.removeListener)(obj, 'event!', F);\n\n count = 0;\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 0, 'received event');\n }\n\n ['@test listeners should be inherited'](assert) {\n let count = 0;\n\n let obj = {\n func() {\n count++;\n }\n };\n\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n\n let obj2 = Object.create(obj);\n\n assert.equal(count, 0, 'nothing yet');\n\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 1, 'received event');\n\n (0, _metal.removeListener)(obj2, 'event!', null, 'func');\n\n count = 0;\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 0, 'did not receive event');\n\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'should still invoke on parent');\n }\n\n ['@test adding a listener more than once should only invoke once'](assert) {\n let count = 0;\n let obj = {\n func() {\n count++;\n }\n };\n\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'should only invoke once');\n }\n\n ['@test adding a listener with a target should invoke with target'](assert) {\n let obj = {};\n let target;\n\n target = {\n count: 0,\n method() {\n this.count++;\n }\n };\n\n (0, _metal.addListener)(obj, 'event!', target, target.method);\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 1, 'should invoke');\n }\n\n ['@test adding a listener with string method should lookup method on event delivery'](assert) {\n let obj = {};\n let target;\n\n target = {\n count: 0,\n method() {}\n };\n\n (0, _metal.addListener)(obj, 'event!', target, 'method');\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 0, 'should invoke but do nothing');\n\n target.method = function () {\n this.count++;\n };\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 1, 'should invoke now');\n }\n\n ['@test calling sendEvent with extra params should be passed to listeners'](assert) {\n let obj = {};\n let params = null;\n (0, _metal.addListener)(obj, 'event!', function () {\n params = Array.prototype.slice.call(arguments);\n });\n\n (0, _metal.sendEvent)(obj, 'event!', ['foo', 'bar']);\n assert.deepEqual(params, ['foo', 'bar'], 'params should be saved');\n }\n\n ['@test hasListeners tells you if there are listeners for a given event'](assert) {\n let obj = {};\n\n function F() {}\n function F2() {}\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'no listeners at first');\n\n (0, _metal.addListener)(obj, 'event!', F);\n (0, _metal.addListener)(obj, 'event!', F2);\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n\n (0, _metal.removeListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n\n (0, _metal.removeListener)(obj, 'event!', F2);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'has no more listeners');\n\n (0, _metal.addListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n }\n\n ['@test calling removeListener without method should remove all listeners'](assert) {\n expectDeprecation(() => {\n let obj = {};\n function F() {}\n function F2() {}\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'no listeners at first');\n\n (0, _metal.addListener)(obj, 'event!', F);\n (0, _metal.addListener)(obj, 'event!', F2);\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n (0, _metal.removeListener)(obj, 'event!');\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'has no more listeners');\n }, /The remove all functionality of removeListener and removeObserver has been deprecated/);\n }\n\n ['@test a listener can be added as part of a mixin'](assert) {\n let triggered = 0;\n let MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.on)('bar', function () {\n triggered++;\n }),\n\n foo2: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n\n let obj = {};\n MyMixin.apply(obj);\n\n (0, _metal.sendEvent)(obj, 'bar');\n assert.equal(triggered, 2, 'should invoke listeners');\n }\n\n [`@test 'on' asserts for invalid arguments`]() {\n expectAssertion(() => {\n _metal.Mixin.create({\n foo1: (0, _metal.on)('bar')\n });\n }, 'on expects function as last argument');\n\n expectAssertion(() => {\n _metal.Mixin.create({\n foo1: (0, _metal.on)(function () {})\n });\n }, 'on called without valid event names');\n }\n\n ['@test a listener added as part of a mixin may be overridden'](assert) {\n let triggered = 0;\n let FirstMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n let SecondMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('baz', function () {\n triggered++;\n })\n });\n\n let obj = {};\n FirstMixin.apply(obj);\n SecondMixin.apply(obj);\n\n (0, _metal.sendEvent)(obj, 'bar');\n assert.equal(triggered, 0, 'should not invoke from overridden property');\n\n (0, _metal.sendEvent)(obj, 'baz');\n assert.equal(triggered, 1, 'should invoke from subclass property');\n }\n });\n});","enifed('@ember/-internals/metal/tests/expand_properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let foundProperties = [];\n\n function addProperty(property) {\n foundProperties.push(property);\n }\n\n (0, _internalTestHelpers.moduleFor)('Property Brace Expansion Test', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n foundProperties = [];\n }\n\n ['@test Properties without expansions are unaffected'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('a', addProperty);\n (0, _metal.expandProperties)('a.b', addProperty);\n (0, _metal.expandProperties)('a.b.[]', addProperty);\n (0, _metal.expandProperties)('a.b.@each.c', addProperty);\n\n assert.deepEqual(['a', 'a.b', 'a.b.[]', 'a.b.@each.c'].sort(), foundProperties.sort());\n }\n\n ['@test A single expansion at the end expands properly'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('a.b.{c,d}', addProperty);\n\n assert.deepEqual(['a.b.c', 'a.b.d'].sort(), foundProperties.sort());\n }\n\n ['@test A property with only a brace expansion expands correctly'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('{a,b,c}', addProperty);\n\n let expected = ['a', 'b', 'c'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Expansions with single properties only expand once'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('a.b.{c}.d.{e}', addProperty);\n\n assert.deepEqual(['a.b.c.d.e'], foundProperties);\n }\n\n ['@test A single brace expansion expands correctly'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('a.{b,c,d}.e', addProperty);\n\n let expected = ['a.b.e', 'a.c.e', 'a.d.e'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Multiple brace expansions work correctly'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('{a,b,c}.d.{e,f}.g', addProperty);\n\n let expected = ['a.d.e.g', 'a.d.f.g', 'b.d.e.g', 'b.d.f.g', 'c.d.e.g', 'c.d.f.g'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test A property with only brace expansions expands correctly'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('{a,b,c}.{d}.{e,f}', addProperty);\n\n let expected = ['a.d.e', 'a.d.f', 'b.d.e', 'b.d.f', 'c.d.e', 'c.d.f'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Nested brace expansions are not allowed']() {\n let nestedBraceProperties = ['a.{b.{c,d}}', 'a.{{b}.c}', 'a.{b,c}.{d.{e,f}.g', 'a.{b.{c}', 'a.{b,c}}', 'model.{bar,baz'];\n\n nestedBraceProperties.forEach(invalidProperties => {\n expectAssertion(() => (0, _metal.expandProperties)(invalidProperties, addProperty));\n }, /Brace expanded properties have to be balanced and cannot be nested/);\n }\n\n ['@test A property with no braces does not expand'](assert) {\n assert.expect(1);\n\n (0, _metal.expandProperties)('a,b,c.d.e,f', addProperty);\n\n assert.deepEqual(foundProperties, ['a,b,c.d.e,f']);\n }\n\n ['@test A pattern must be a string'](assert) {\n assert.expect(1);\n\n expectAssertion(() => {\n (0, _metal.expandProperties)([1, 2], addProperty);\n }, /A computed property key must be a string/);\n }\n\n ['@test A pattern must not contain a space'](assert) {\n assert.expect(1);\n\n expectAssertion(function () {\n (0, _metal.expandProperties)('{a, b}', addProperty);\n }, /Brace expanded properties cannot contain spaces, e.g. \"user.{firstName, lastName}\" should be \"user.{firstName,lastName}\"/);\n }\n });\n});","enifed('@ember/-internals/metal/tests/injected_property_test', ['@ember/-internals/owner', '@ember/-internals/metal', 'internal-test-helpers'], function (_owner, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('InjectedProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test injected properties should be descriptors'](assert) {\n assert.ok(new _metal.InjectedProperty() instanceof _metal.Descriptor);\n }\n\n ['@test injected properties should be overridable'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty());\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should return the overridden value');\n }\n\n ['@test getting on an object without an owner or container should fail assertion']() {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type', 'name'));\n\n expectAssertion(function () {\n (0, _metal.get)(obj, 'foo');\n }, /Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container./);\n }\n\n ['@test getting on an object without an owner but with a container should not fail'](assert) {\n let obj = {\n container: {\n lookup(key) {\n assert.ok(true, 'should call container.lookup');\n return key;\n }\n }\n };\n\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type', 'name'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:name', 'should return the value of container.lookup');\n }\n\n ['@test getting should return a lookup on the container'](assert) {\n assert.expect(2);\n\n let obj = {};\n\n (0, _owner.setOwner)(obj, {\n lookup(key) {\n assert.ok(true, 'should call container.lookup');\n return key;\n }\n });\n\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type', 'name'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:name', 'should return the value of container.lookup');\n }\n\n ['@test omitting the lookup name should default to the property name'](assert) {\n let obj = {};\n\n (0, _owner.setOwner)(obj, {\n lookup(key) {\n return key;\n }\n });\n\n (0, _metal.defineProperty)(obj, 'foo', new _metal.InjectedProperty('type'));\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:foo', 'should lookup the type using the property name');\n }\n });\n});","enifed('@ember/-internals/metal/tests/is_blank_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isBlank', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isBlank'](assert) {\n let string = 'string';\n let fn = function () {};\n let object = { length: 0 };\n\n assert.equal(true, (0, _metal.isBlank)(null), 'for null');\n assert.equal(true, (0, _metal.isBlank)(undefined), 'for undefined');\n assert.equal(true, (0, _metal.isBlank)(''), 'for an empty String');\n assert.equal(true, (0, _metal.isBlank)(' '), 'for a whitespace String');\n assert.equal(true, (0, _metal.isBlank)('\\n\\t'), 'for another whitespace String');\n assert.equal(false, (0, _metal.isBlank)('\\n\\t Hi'), 'for a String with whitespaces');\n assert.equal(false, (0, _metal.isBlank)(true), 'for true');\n assert.equal(false, (0, _metal.isBlank)(false), 'for false');\n assert.equal(false, (0, _metal.isBlank)(string), 'for a String');\n assert.equal(false, (0, _metal.isBlank)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isBlank)(0), 'for 0');\n assert.equal(true, (0, _metal.isBlank)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isBlank)({}), 'for an empty Object');\n assert.equal(true, (0, _metal.isBlank)(object), \"for an Object that has zero 'length'\");\n assert.equal(false, (0, _metal.isBlank)([1, 2, 3]), 'for a non-empty array');\n }\n });\n});","enifed('@ember/-internals/metal/tests/is_empty_test', ['@ember/-internals/metal', '@ember/map', '@ember/map/lib/ordered-set', 'internal-test-helpers'], function (_metal, _map, _orderedSet, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isEmpty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isEmpty'](assert) {\n let string = 'string';\n let fn = function () {};\n let object = { length: 0 };\n\n assert.equal(true, (0, _metal.isEmpty)(null), 'for null');\n assert.equal(true, (0, _metal.isEmpty)(undefined), 'for undefined');\n assert.equal(true, (0, _metal.isEmpty)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isEmpty)(' '), 'for a whitespace String');\n assert.equal(false, (0, _metal.isEmpty)('\\n\\t'), 'for another whitespace String');\n assert.equal(false, (0, _metal.isEmpty)(true), 'for true');\n assert.equal(false, (0, _metal.isEmpty)(false), 'for false');\n assert.equal(false, (0, _metal.isEmpty)(string), 'for a String');\n assert.equal(false, (0, _metal.isEmpty)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isEmpty)(0), 'for 0');\n assert.equal(true, (0, _metal.isEmpty)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isEmpty)({}), 'for an empty Object');\n assert.equal(true, (0, _metal.isEmpty)(object), \"for an Object that has zero 'length'\");\n }\n\n ['@test isEmpty Map'](assert) {\n expectDeprecation(() => {\n let map = new _map.default();\n assert.equal(true, (0, _metal.isEmpty)(map), 'Empty map is empty');\n map.set('foo', 'bar');\n assert.equal(false, (0, _metal.isEmpty)(map), 'Map is not empty');\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test isEmpty Ember.OrderedSet'](assert) {\n expectDeprecation(() => {\n let orderedSet = new _orderedSet.default();\n assert.equal(true, (0, _metal.isEmpty)(orderedSet), 'Empty ordered set is empty');\n orderedSet.add('foo');\n assert.equal(false, (0, _metal.isEmpty)(orderedSet), 'Ordered set is not empty');\n }, 'Use of @ember/OrderedSet is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n });\n});","enifed('@ember/-internals/metal/tests/is_none_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isNone', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isNone'](assert) {\n let string = 'string';\n let fn = function () {};\n\n assert.equal(true, (0, _metal.isNone)(null), 'for null');\n assert.equal(true, (0, _metal.isNone)(undefined), 'for undefined');\n assert.equal(false, (0, _metal.isNone)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isNone)(true), 'for true');\n assert.equal(false, (0, _metal.isNone)(false), 'for false');\n assert.equal(false, (0, _metal.isNone)(string), 'for a String');\n assert.equal(false, (0, _metal.isNone)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isNone)(0), 'for 0');\n assert.equal(false, (0, _metal.isNone)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isNone)({}), 'for an empty Object');\n }\n });\n});","enifed('@ember/-internals/metal/tests/is_present_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isPresent', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isPresent'](assert) {\n let string = 'string';\n let fn = function () {};\n let object = { length: 0 };\n\n assert.equal(false, (0, _metal.isPresent)(), 'for no params');\n assert.equal(false, (0, _metal.isPresent)(null), 'for null');\n assert.equal(false, (0, _metal.isPresent)(undefined), 'for undefined');\n assert.equal(false, (0, _metal.isPresent)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isPresent)(' '), 'for a whitespace String');\n assert.equal(false, (0, _metal.isPresent)('\\n\\t'), 'for another whitespace String');\n assert.equal(true, (0, _metal.isPresent)('\\n\\t Hi'), 'for a String with whitespaces');\n assert.equal(true, (0, _metal.isPresent)(true), 'for true');\n assert.equal(true, (0, _metal.isPresent)(false), 'for false');\n assert.equal(true, (0, _metal.isPresent)(string), 'for a String');\n assert.equal(true, (0, _metal.isPresent)(fn), 'for a Function');\n assert.equal(true, (0, _metal.isPresent)(0), 'for 0');\n assert.equal(false, (0, _metal.isPresent)([]), 'for an empty Array');\n assert.equal(true, (0, _metal.isPresent)({}), 'for an empty Object');\n assert.equal(false, (0, _metal.isPresent)(object), \"for an Object that has zero 'length'\");\n assert.equal(true, (0, _metal.isPresent)([1, 2, 3]), 'for a non-empty array');\n }\n });\n});","enifed('@ember/-internals/metal/tests/libraries_test', ['@ember/debug', '@ember/-internals/metal', 'internal-test-helpers'], function (_debug, _metal, _internalTestHelpers) {\n 'use strict';\n\n let libs, registry; /* globals EmberDev */\n\n let originalWarn = (0, _debug.getDebugFunction)('warn');\n function noop() {}\n\n (0, _internalTestHelpers.moduleFor)('Libraries registry', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n libs = new _metal.Libraries();\n registry = libs._registry;\n }\n\n afterEach() {\n libs = null;\n registry = null;\n\n (0, _debug.setDebugFunction)('warn', originalWarn);\n }\n\n ['@test core libraries come before other libraries'](assert) {\n assert.expect(2);\n\n libs.register('my-lib', '2.0.0a');\n libs.registerCoreLibrary('DS', '1.0.0-beta.2');\n\n assert.equal(registry[0].name, 'DS');\n assert.equal(registry[1].name, 'my-lib');\n }\n\n ['@test only the first registration of a library is stored'](assert) {\n assert.expect(3);\n\n // overwrite warn to supress the double registration warning (see https://github.com/emberjs/ember.js/issues/16391)\n (0, _debug.setDebugFunction)('warn', noop);\n libs.register('magic', 1.23);\n libs.register('magic', 2.23);\n\n assert.equal(registry[0].name, 'magic');\n assert.equal(registry[0].version, 1.23);\n assert.equal(registry.length, 1);\n }\n\n ['@test isRegistered returns correct value'](assert) {\n if (false /* EMBER_LIBRARIES_ISREGISTERED */) {\n assert.expect(3);\n\n assert.equal(libs.isRegistered('magic'), false);\n\n libs.register('magic', 1.23);\n assert.equal(libs.isRegistered('magic'), true);\n\n libs.deRegister('magic');\n assert.equal(libs.isRegistered('magic'), false);\n } else {\n assert.expect(0);\n }\n }\n\n ['@test attempting to register a library that is already registered warns you'](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(1);\n\n libs.register('magic', 1.23);\n\n (0, _debug.setDebugFunction)('warn', function (msg, test) {\n if (!test) {\n assert.equal(msg, 'Library \"magic\" is already registered with Ember.');\n }\n });\n\n // Should warn us\n libs.register('magic', 2.23);\n }\n\n ['@test libraries can be de-registered'](assert) {\n assert.expect(2);\n\n libs.register('lib1', '1.0.0b');\n libs.register('lib2', '1.0.0b');\n libs.register('lib3', '1.0.0b');\n\n libs.deRegister('lib1');\n libs.deRegister('lib3');\n\n assert.equal(registry[0].name, 'lib2');\n assert.equal(registry.length, 1);\n }\n });\n});","enifed('@ember/-internals/metal/tests/main_test', ['ember/version', 'internal-test-helpers'], function (_version, _internalTestHelpers) {\n 'use strict';\n\n // From https://github.com/semver/semver.org/issues/59 & https://regex101.com/r/vW1jA8/6\n const SEMVER_REGEX = /^((?:0|(?:[1-9]\\d*)))\\.((?:0|(?:[1-9]\\d*)))\\.((?:0|(?:[1-9]\\d*)))(?:-([0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*))?$/;\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/metal/core/main', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.VERSION is in alignment with SemVer v2.0.0'](assert) {\n assert.ok(SEMVER_REGEX.test(_version.default), `Ember.VERSION (${_version.default})is valid SemVer v2.0.0`);\n }\n\n ['@test SEMVER_REGEX properly validates and invalidates version numbers'](assert) {\n function validateVersionString(versionString, expectedResult) {\n assert.equal(SEMVER_REGEX.test(versionString), expectedResult);\n }\n\n // Positive test cases\n validateVersionString('1.11.3', true);\n validateVersionString('1.0.0-beta.16.1', true);\n validateVersionString('1.12.1+canary.aba1412', true);\n validateVersionString('2.0.0-beta.1+canary.bb344775', true);\n validateVersionString('3.1.0-foobarBaz+30d70bd3', true);\n\n // Negative test cases\n validateVersionString('1.11.3.aba18a', false);\n validateVersionString('1.11', false);\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/alias_method_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function validateAliasMethod(assert, obj) {\n assert.equal(obj.fooMethod(), 'FOO', 'obj.fooMethod()');\n assert.equal(obj.barMethod(), 'FOO', 'obj.barMethod should be a copy of foo');\n }\n\n (0, _internalTestHelpers.moduleFor)('aliasMethod', class extends _internalTestHelpers.AbstractTestCase {\n ['@test methods of another name are aliased when the mixin is applied'](assert) {\n let MyMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n },\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = MyMixin.apply({});\n validateAliasMethod(assert, obj);\n }\n\n ['@test should follow aliasMethods all the way down'](assert) {\n let MyMixin = _metal.Mixin.create({\n bar: (0, _metal.aliasMethod)('foo'), // put first to break ordered iteration\n baz() {\n return 'baz';\n },\n foo: (0, _metal.aliasMethod)('baz')\n });\n\n let obj = MyMixin.apply({});\n assert.equal((0, _metal.get)(obj, 'bar')(), 'baz', 'should have followed aliasMethods');\n }\n\n ['@test should alias methods from other dependent mixins'](assert) {\n let BaseMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n }\n });\n\n let MyMixin = _metal.Mixin.create(BaseMixin, {\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = MyMixin.apply({});\n validateAliasMethod(assert, obj);\n }\n\n ['@test should alias methods from other mixins applied at same time'](assert) {\n let BaseMixin = _metal.Mixin.create({\n fooMethod() {\n return 'FOO';\n }\n });\n\n let MyMixin = _metal.Mixin.create({\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = (0, _metal.mixin)({}, BaseMixin, MyMixin);\n validateAliasMethod(assert, obj);\n }\n\n ['@test should alias methods from mixins already applied on object'](assert) {\n let BaseMixin = _metal.Mixin.create({\n quxMethod() {\n return 'qux';\n }\n });\n\n let MyMixin = _metal.Mixin.create({\n bar: (0, _metal.aliasMethod)('foo'),\n barMethod: (0, _metal.aliasMethod)('fooMethod')\n });\n\n let obj = {\n fooMethod() {\n return 'FOO';\n }\n };\n\n BaseMixin.apply(obj);\n MyMixin.apply(obj);\n\n validateAliasMethod(assert, obj);\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/apply_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function K() {}\n\n (0, _internalTestHelpers.moduleFor)('Mixin.apply', class extends _internalTestHelpers.AbstractTestCase {\n ['@test using apply() should apply properties'](assert) {\n let MixinA = _metal.Mixin.create({ foo: 'FOO', baz: K });\n let obj = {};\n (0, _metal.mixin)(obj, MixinA);\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should apply foo');\n assert.equal((0, _metal.get)(obj, 'baz'), K, 'should apply foo');\n }\n\n ['@test applying anonymous properties'](assert) {\n let obj = {};\n (0, _metal.mixin)(obj, {\n foo: 'FOO',\n baz: K\n });\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should apply foo');\n assert.equal((0, _metal.get)(obj, 'baz'), K, 'should apply foo');\n }\n\n ['@test applying null values']() {\n expectAssertion(() => (0, _metal.mixin)({}, null));\n }\n\n ['@test applying a property with an undefined value'](assert) {\n let obj = { tagName: '' };\n (0, _metal.mixin)(obj, { tagName: undefined });\n\n assert.strictEqual((0, _metal.get)(obj, 'tagName'), '');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/computed_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n (0, _internalTestHelpers.moduleFor)('Mixin Computed Properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test overriding computed properties'](assert) {\n let MixinA, MixinB, MixinC, MixinD;\n let obj;\n\n MixinA = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return 'A';\n })\n });\n\n MixinB = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'B';\n })\n });\n\n MixinC = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'C';\n })\n });\n\n MixinD = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'D';\n })\n });\n\n obj = {};\n MixinB.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AB', 'should expose super for B');\n\n obj = {};\n MixinC.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AC', 'should expose super for C');\n\n obj = {};\n\n MixinA.apply(obj);\n MixinD.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AD', 'should define super for D');\n\n obj = {};\n (0, _metal.defineProperty)(obj, 'aProp', (0, _metal.computed)(function () {\n return 'obj';\n }));\n MixinD.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'objD', 'should preserve original computed property');\n }\n\n ['@test calling set on overridden computed properties'](assert) {\n let SuperMixin, SubMixin;\n let obj;\n\n let superGetOccurred = false;\n let superSetOccurred = false;\n\n SuperMixin = _metal.Mixin.create({\n aProp: (0, _metal.computed)({\n get() {\n superGetOccurred = true;\n },\n set() {\n superSetOccurred = true;\n }\n })\n });\n\n SubMixin = _metal.Mixin.create(SuperMixin, {\n aProp: (0, _metal.computed)({\n get() {\n return this._super(...arguments);\n },\n set() {\n return this._super(...arguments);\n }\n })\n });\n\n obj = {};\n SubMixin.apply(obj);\n\n (0, _metal.set)(obj, 'aProp', 'set thyself');\n assert.ok(superSetOccurred, 'should pass set to _super');\n\n superSetOccurred = false; // reset the set assertion\n\n obj = {};\n SubMixin.apply(obj);\n\n (0, _metal.get)(obj, 'aProp');\n assert.ok(superGetOccurred, 'should pass get to _super');\n\n (0, _metal.set)(obj, 'aProp', 'set thyself');\n assert.ok(superSetOccurred, 'should pass set to _super after getting');\n }\n\n ['@test setter behavior works properly when overriding computed properties'](assert) {\n let obj = {};\n\n let MixinA = _metal.Mixin.create({\n cpWithSetter2: (0, _metal.computed)(K),\n cpWithSetter3: (0, _metal.computed)(K),\n cpWithoutSetter: (0, _metal.computed)(K)\n });\n\n let cpWasCalled = false;\n\n let MixinB = _metal.Mixin.create({\n cpWithSetter2: (0, _metal.computed)({\n get: K,\n set() {\n cpWasCalled = true;\n }\n }),\n\n cpWithSetter3: (0, _metal.computed)({\n get: K,\n set() {\n cpWasCalled = true;\n }\n }),\n\n cpWithoutSetter: (0, _metal.computed)(function () {\n cpWasCalled = true;\n })\n });\n\n MixinA.apply(obj);\n MixinB.apply(obj);\n\n (0, _metal.set)(obj, 'cpWithSetter2', 'test');\n assert.ok(cpWasCalled, 'The computed property setter was called when defined with two args');\n cpWasCalled = false;\n\n (0, _metal.set)(obj, 'cpWithSetter3', 'test');\n assert.ok(cpWasCalled, 'The computed property setter was called when defined with three args');\n cpWasCalled = false;\n\n (0, _metal.set)(obj, 'cpWithoutSetter', 'test');\n assert.equal((0, _metal.get)(obj, 'cpWithoutSetter'), 'test', 'The default setter was called, the value is correct');\n assert.ok(!cpWasCalled, 'The default setter was called, not the CP itself');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/concatenated_properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin concatenatedProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining concatenated properties should concat future version'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n let MixinB = _metal.Mixin.create({\n foo: ['d', 'e', 'f']\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['a', 'b', 'c', 'd', 'e', 'f']);\n }\n\n ['@test defining concatenated properties should concat future version'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n let MixinB = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n\n assert.deepEqual(obj.concatenatedProperties, []);\n }\n\n ['@test concatenatedProperties should be concatenated'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n let MixinB = _metal.Mixin.create({\n concatenatedProperties: 'bar',\n foo: ['d', 'e', 'f'],\n bar: [1, 2, 3]\n });\n\n let MixinC = _metal.Mixin.create({\n bar: [4, 5, 6]\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.deepEqual((0, _metal.get)(obj, 'concatenatedProperties'), ['foo', 'bar'], 'get concatenatedProperties');\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['a', 'b', 'c', 'd', 'e', 'f'], 'get foo');\n assert.deepEqual((0, _metal.get)(obj, 'bar'), [1, 2, 3, 4, 5, 6], 'get bar');\n }\n\n ['@test adding a prop that is not an array should make array'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: [1, 2, 3]\n });\n\n let MixinB = _metal.Mixin.create({\n foo: 4\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), [1, 2, 3, 4]);\n }\n\n ['@test adding a prop that is not an array should make array'](assert) {\n let MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 'bar'\n });\n\n let obj = (0, _metal.mixin)({}, MixinA);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['bar']);\n }\n\n ['@test adding a non-concatenable property that already has a defined value should result in an array with both values'](assert) {\n let mixinA = _metal.Mixin.create({\n foo: 1\n });\n\n let mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 2\n });\n\n let obj = (0, _metal.mixin)({}, mixinA, mixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), [1, 2]);\n }\n\n ['@test adding a concatenable property that already has a defined value should result in a concatenated value'](assert) {\n let mixinA = _metal.Mixin.create({\n foobar: 'foo'\n });\n\n let mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foobar'],\n foobar: 'bar'\n });\n\n let obj = (0, _metal.mixin)({}, mixinA, mixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foobar'), ['foo', 'bar']);\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/detect_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin.detect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detect() finds a directly applied mixin'](assert) {\n let MixinA = _metal.Mixin.create();\n let obj = {};\n\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n\n MixinA.apply(obj);\n assert.equal(MixinA.detect(obj), true, 'MixinA.detect(obj) after apply()');\n }\n\n ['@test detect() finds nested mixins'](assert) {\n let MixinA = _metal.Mixin.create({});\n let MixinB = _metal.Mixin.create(MixinA);\n let obj = {};\n\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n\n MixinB.apply(obj);\n assert.equal(MixinA.detect(obj), true, 'MixinA.detect(obj) after apply()');\n }\n\n ['@test detect() finds mixins on other mixins'](assert) {\n let MixinA = _metal.Mixin.create({});\n let MixinB = _metal.Mixin.create(MixinA);\n assert.equal(MixinA.detect(MixinB), true, 'MixinA is part of MixinB');\n assert.equal(MixinB.detect(MixinA), false, 'MixinB is not part of MixinA');\n }\n\n ['@test detect handles null values'](assert) {\n let MixinA = _metal.Mixin.create();\n assert.equal(MixinA.detect(null), false);\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/introspection_test', ['@ember/-internals/utils', '@ember/-internals/metal', 'internal-test-helpers'], function (_utils, _metal, _internalTestHelpers) {\n 'use strict';\n\n const PrivateProperty = _metal.Mixin.create({\n _foo: '_FOO'\n }); // NOTE: A previous iteration differentiated between public and private props\n // as well as methods vs props. We are just keeping these for testing; the\n // current impl doesn't care about the differences as much...\n\n const PublicProperty = _metal.Mixin.create({\n foo: 'FOO'\n });\n const PrivateMethod = _metal.Mixin.create({\n _fooMethod() {}\n });\n const PublicMethod = _metal.Mixin.create({\n fooMethod() {}\n });\n const BarProperties = _metal.Mixin.create({\n _bar: '_BAR',\n bar: 'bar'\n });\n const BarMethods = _metal.Mixin.create({\n _barMethod() {},\n barMethod() {}\n });\n\n const Combined = _metal.Mixin.create(BarProperties, BarMethods);\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('Basic introspection', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {};\n (0, _metal.mixin)(obj, PrivateProperty, PublicProperty, PrivateMethod, PublicMethod, Combined);\n }\n\n ['@test Ember.mixins()'](assert) {\n function mapGuids(ary) {\n return ary.map(x => (0, _utils.guidFor)(x));\n }\n\n assert.deepEqual(mapGuids(_metal.Mixin.mixins(obj)), mapGuids([PrivateProperty, PublicProperty, PrivateMethod, PublicMethod, Combined, BarProperties, BarMethods]), 'should return included mixins');\n }\n\n ['@test setting a NAME_KEY on a mixin does not error'](assert) {\n assert.expect(0);\n\n let instance = _metal.Mixin.create();\n instance[_utils.NAME_KEY] = 'My special name!';\n }\n\n ['@test setting a NAME_KEY on a mixin instance does not error'](assert) {\n assert.expect(0);\n\n _metal.Mixin.create({ [_utils.NAME_KEY]: 'My special name' });\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/merged_properties_test', ['@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers'], function (_runtime, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin mergedProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining mergedProperties should merge future version'](assert) {\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: { d: true, e: true, f: true }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: true,\n b: true,\n c: true,\n d: true,\n e: true,\n f: true\n });\n }\n\n ['@test defining mergedProperties on future mixin should merged into past'](assert) {\n let MixinA = _metal.Mixin.create({\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { d: true, e: true, f: true }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: true,\n b: true,\n c: true,\n d: true,\n e: true,\n f: true\n });\n }\n\n ['@test defining mergedProperties with null properties should keep properties null'](assert) {\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: null\n });\n\n let MixinB = _metal.Mixin.create({\n foo: null\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.equal((0, _metal.get)(obj, 'foo'), null);\n }\n\n [\"@test mergedProperties' properties can get overwritten\"](assert) {\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: 1 }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: { a: 2 }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), { a: 2 });\n }\n\n ['@test mergedProperties should be concatenated'](assert) {\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n mergedProperties: 'bar',\n foo: { d: true, e: true, f: true },\n bar: { a: true, l: true }\n });\n\n let MixinC = _metal.Mixin.create({\n bar: { e: true, x: true }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.deepEqual((0, _metal.get)(obj, 'mergedProperties'), ['foo', 'bar'], 'get mergedProperties');\n assert.deepEqual((0, _metal.get)(obj, 'foo'), { a: true, b: true, c: true, d: true, e: true, f: true }, 'get foo');\n assert.deepEqual((0, _metal.get)(obj, 'bar'), { a: true, l: true, e: true, x: true }, 'get bar');\n }\n\n ['@test mergedProperties should exist even if not explicitly set on create'](assert) {\n let AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 'a',\n b: {\n c: 'ccc'\n }\n }\n });\n\n let obj = AnObj.create({\n options: {\n a: 'A'\n }\n });\n\n assert.equal((0, _metal.get)(obj, 'options').a, 'A');\n assert.equal((0, _metal.get)(obj, 'options').b.c, 'ccc');\n }\n\n ['@test defining mergedProperties at create time should not modify the prototype'](assert) {\n let AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 1\n }\n });\n\n let objA = AnObj.create({\n options: {\n a: 2\n }\n });\n let objB = AnObj.create({\n options: {\n a: 3\n }\n });\n\n assert.equal((0, _metal.get)(objA, 'options').a, 2);\n assert.equal((0, _metal.get)(objB, 'options').a, 3);\n }\n\n [\"@test mergedProperties' overwriting methods can call _super\"](assert) {\n assert.expect(4);\n\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n meth(a) {\n assert.equal(a, 'WOOT', \"_super successfully called MixinA's `foo.meth` method\");\n return 'WAT';\n }\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: {\n meth() {\n assert.ok(true, \"MixinB's `foo.meth` method called\");\n return this._super(...arguments);\n }\n }\n });\n\n let MixinC = _metal.Mixin.create({\n foo: {\n meth(a) {\n assert.ok(true, \"MixinC's `foo.meth` method called\");\n return this._super(a);\n }\n }\n });\n\n let obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.equal(obj.foo.meth('WOOT'), 'WAT');\n }\n\n ['@test Merging an Array should raise an error'](assert) {\n assert.expect(1);\n\n let MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: { a: true, b: true, c: true }\n });\n\n let MixinB = _metal.Mixin.create({\n foo: ['a']\n });\n\n expectAssertion(() => {\n (0, _metal.mixin)({}, MixinA, MixinB);\n }, 'You passed in `[\"a\"]` as the value for `foo` but `foo` cannot be an Array');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/method_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin Methods', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining simple methods'](assert) {\n let MixinA, obj, props;\n\n props = {\n publicMethod() {\n return 'publicMethod';\n },\n _privateMethod() {\n return 'privateMethod';\n }\n };\n\n MixinA = _metal.Mixin.create(props);\n obj = {};\n MixinA.apply(obj);\n\n // but should be defined\n assert.equal(props.publicMethod(), 'publicMethod', 'publicMethod is func');\n assert.equal(props._privateMethod(), 'privateMethod', 'privateMethod is func');\n }\n\n ['@test overriding public methods'](assert) {\n let MixinA, MixinB, MixinD, MixinF, obj;\n\n MixinA = _metal.Mixin.create({\n publicMethod() {\n return 'A';\n }\n });\n\n MixinB = _metal.Mixin.create(MixinA, {\n publicMethod() {\n return this._super(...arguments) + 'B';\n }\n });\n\n MixinD = _metal.Mixin.create(MixinA, {\n publicMethod() {\n return this._super(...arguments) + 'D';\n }\n });\n\n MixinF = _metal.Mixin.create({\n publicMethod() {\n return this._super(...arguments) + 'F';\n }\n });\n\n obj = {};\n MixinB.apply(obj);\n assert.equal(obj.publicMethod(), 'AB', 'should define super for A and B');\n\n obj = {};\n MixinD.apply(obj);\n assert.equal(obj.publicMethod(), 'AD', 'should define super for A and B');\n\n obj = {};\n MixinA.apply(obj);\n MixinF.apply(obj);\n assert.equal(obj.publicMethod(), 'AF', 'should define super for A and F');\n\n obj = {\n publicMethod() {\n return 'obj';\n }\n };\n MixinF.apply(obj);\n assert.equal(obj.publicMethod(), 'objF', 'should define super for F');\n }\n\n ['@test overriding inherited objects'](assert) {\n let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let objA = {};\n MixinA.apply(objA);\n\n let objB = Object.create(objA);\n MixinB.apply(objB);\n\n cnt = 0;\n objB.foo();\n assert.equal(cnt, 2, 'should invoke both methods');\n\n cnt = 0;\n objA.foo();\n assert.equal(cnt, 1, 'should not screw w/ parent obj');\n }\n\n ['@test Including the same mixin more than once will only run once'](assert) {\n let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let MixinC = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let MixinD = _metal.Mixin.create(MixinB, MixinC, MixinA, {\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinD.apply(obj);\n MixinA.apply(obj); // try to apply again..\n\n cnt = 0;\n obj.foo();\n\n assert.equal(cnt, 1, 'should invoke MixinA.foo one time');\n }\n\n ['@test _super from a single mixin with no superclass does not error'](assert) {\n let MixinA = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n\n obj.foo();\n assert.ok(true);\n }\n\n ['@test _super from a first-of-two mixins with no superclass function does not error'](assert) {\n // _super was previously calling itself in the second assertion.\n // Use remaining count of calls to ensure it doesn't loop indefinitely.\n let remaining = 3;\n let MixinA = _metal.Mixin.create({\n foo() {\n if (remaining-- > 0) {\n this._super(...arguments);\n }\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n MixinB.apply(obj);\n\n obj.foo();\n assert.ok(true);\n }\n });\n\n // ..........................................................\n // CONFLICTS\n //\n (0, _internalTestHelpers.moduleFor)('Method Conflicts', class extends _internalTestHelpers.AbstractTestCase {\n ['@test overriding toString'](assert) {\n let MixinA = _metal.Mixin.create({\n toString() {\n return 'FOO';\n }\n });\n\n let obj = {};\n MixinA.apply(obj);\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n\n obj = {};\n (0, _metal.mixin)(obj, {\n toString() {\n return 'FOO';\n }\n });\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n }\n });\n\n // ..........................................................\n // BUGS\n //\n (0, _internalTestHelpers.moduleFor)('system/mixin/method_test BUGS', class extends _internalTestHelpers.AbstractTestCase {\n ['@test applying several mixins at once with sup already defined causes infinite loop'](assert) {\n let cnt = 0;\n let MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n });\n\n let MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let MixinC = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n cnt++;\n }\n });\n\n let obj = {};\n (0, _metal.mixin)(obj, MixinA); // sup already exists\n (0, _metal.mixin)(obj, MixinB, MixinC); // must be more than one mixin\n\n cnt = 0;\n obj.foo();\n assert.equal(cnt, 3, 'should invoke all 3 methods');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/observer_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin observer', class extends _internalTestHelpers.AbstractTestCase {\n ['@test global observer helper'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test global observer helper takes multiple params'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', 'baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer after change');\n }\n\n ['@test replacing observer should remove old observer'](assert) {\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let Mixin2 = _metal.Mixin.create({\n foo: (0, _metal.observer)('baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 10);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin, Mixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 10, 'should invoke observer after change');\n }\n\n ['@test observing chain with property before'](assert) {\n let obj2 = { baz: 'baz' };\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n bar: obj2,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property after'](assert) {\n let obj2 = { baz: 'baz' };\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }),\n bar: obj2\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin applied later'](assert) {\n let obj2 = { baz: 'baz' };\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n MyMixin2.apply(obj);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with existing property'](assert) {\n let obj2 = { baz: 'baz' };\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({ bar: obj2 }, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin before'](assert) {\n let obj2 = { baz: 'baz' };\n let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin2, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with property in mixin after'](assert) {\n let obj2 = { baz: 'baz' };\n let MyMixin2 = _metal.Mixin.create({ bar: obj2 });\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observing chain with overridden property'](assert) {\n let obj2 = { baz: 'baz' };\n let obj3 = { baz: 'foo' };\n\n let MyMixin2 = _metal.Mixin.create({ bar: obj3 });\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = (0, _metal.mixin)({ bar: obj2 }, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n assert.equal((0, _metal.isWatching)(obj2, 'baz'), false, 'should not be watching baz');\n assert.equal((0, _metal.isWatching)(obj3, 'baz'), true, 'should be watching baz');\n\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj3, 'baz', 'BEAR');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/reopen_test', ['@ember/-internals/runtime', '@ember/-internals/metal', '@ember/runloop', 'internal-test-helpers'], function (_runtime, _metal, _runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Mixin#reopen', class extends _internalTestHelpers.AbstractTestCase {\n ['@test using reopen() to add more properties to a simple'](assert) {\n let MixinA = _metal.Mixin.create({ foo: 'FOO', baz: 'BAZ' });\n MixinA.reopen({ bar: 'BAR', foo: 'FOO2' });\n let obj = {};\n MixinA.apply(obj);\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO2', 'mixin() should override');\n assert.equal((0, _metal.get)(obj, 'baz'), 'BAZ', 'preserve MixinA props');\n assert.equal((0, _metal.get)(obj, 'bar'), 'BAR', 'include MixinB props');\n }\n\n ['@test using reopen() and calling _super where there is not a super function does not cause infinite recursion'](assert) {\n let Taco = _runtime.Object.extend({\n createBreakfast() {\n // There is no original createBreakfast function.\n // Calling the wrapped _super function here\n // used to end in an infinite call loop\n this._super(...arguments);\n return 'Breakfast!';\n }\n });\n\n Taco.reopen({\n createBreakfast() {\n return this._super(...arguments);\n }\n });\n\n let taco = Taco.create();\n\n let result;\n (0, _runloop.run)(() => {\n try {\n result = taco.createBreakfast();\n } catch (e) {\n result = 'Your breakfast was interrupted by an infinite stack error.';\n }\n });\n\n assert.equal(result, 'Breakfast!');\n }\n });\n});","enifed('@ember/-internals/metal/tests/mixin/without_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('without', class extends _internalTestHelpers.AbstractTestCase {\n ['@test without should create a new mixin excluding named properties'](assert) {\n let MixinA = _metal.Mixin.create({\n foo: 'FOO',\n bar: 'BAR'\n });\n\n let MixinB = MixinA.without('bar');\n\n let obj = {};\n MixinB.apply(obj);\n\n assert.equal(obj.foo, 'FOO', 'should defined foo');\n assert.equal(obj.bar, undefined, 'should not define bar');\n }\n });\n});","enifed('@ember/-internals/metal/tests/namespace_search_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('NamespaceSearch', class extends _internalTestHelpers.AbstractTestCase {\n ['@test classToString: null as this inside class must not throw error'](assert) {\n let mixin = _metal.Mixin.create();\n assert.equal(mixin.toString(), '(unknown)', 'this = null should be handled on Mixin.toString() call');\n }\n });\n});","enifed('@ember/-internals/metal/tests/observer_test', ['@ember/-internals/environment', '@ember/-internals/metal', 'internal-test-helpers'], function (_environment, _metal, _internalTestHelpers) {\n 'use strict';\n\n function K() {}\n\n // ..........................................................\n // ADD OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('addObserver', class extends _internalTestHelpers.AbstractTestCase {\n ['@test observer should assert to invalid input']() {\n expectAssertion(() => {\n (0, _metal.observer)(() => {});\n }, 'observer called without valid path');\n\n expectAssertion(() => {\n (0, _metal.observer)(null);\n }, 'observer called without a function');\n }\n\n ['@test observer should fire when property is modified'](assert) {\n let obj = {};\n let count = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should invoke AFTER value changed');\n count++;\n });\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n ['@test observer should fire when dependent property is modified'](assert) {\n let obj = { bar: 'bar' };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toUpperCase();\n }).property('bar'));\n\n (0, _metal.get)(obj, 'foo');\n\n let count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n assert.equal((0, _metal.get)(obj, 'foo'), 'BAZ', 'should have invoked after prop change');\n count++;\n });\n\n (0, _metal.set)(obj, 'bar', 'baz');\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n ['@test observer should continue to fire after dependent properties are accessed'](assert) {\n let observerCount = 0;\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'prop', (0, _metal.computed)(function () {\n return Math.random();\n }));\n (0, _metal.defineProperty)(obj, 'anotherProp', (0, _metal.computed)('prop', function () {\n return (0, _metal.get)(this, 'prop') + Math.random();\n }));\n\n (0, _metal.addObserver)(obj, 'prop', function () {\n observerCount++;\n });\n\n (0, _metal.get)(obj, 'anotherProp');\n\n for (let i = 0; i < 10; i++) {\n (0, _metal.notifyPropertyChange)(obj, 'prop');\n }\n\n assert.equal(observerCount, 10, 'should continue to fire indefinitely');\n }\n\n ['@test observer added declaratively via brace expansion should fire when property changes'](assert) {\n if (_environment.ENV.EXTEND_PROTOTYPES.Function) {\n let obj = {};\n let count = 0;\n\n (0, _metal.mixin)(obj, {\n observeFooAndBar: function () {\n count++;\n }.observes('{foo,bar}')\n });\n\n (0, _metal.set)(obj, 'foo', 'foo');\n assert.equal(count, 1, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'bar', 'bar');\n assert.equal(count, 2, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'baz', 'baz');\n assert.equal(count, 2, 'observer not invoked on unspecified property');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observer specified declaratively via brace expansion should fire when dependent property changes'](assert) {\n if (_environment.ENV.EXTEND_PROTOTYPES.Function) {\n let obj = { baz: 'Initial' };\n let count = 0;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toLowerCase();\n }).property('bar'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'baz').toUpperCase();\n }).property('baz'));\n\n (0, _metal.mixin)(obj, {\n fooAndBarWatcher: function () {\n count++;\n }.observes('{foo,bar}')\n });\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'baz', 'Baz');\n // fire once for foo, once for bar\n assert.equal(count, 2, 'observer specified via brace expansion invoked on dependent property change');\n\n (0, _metal.set)(obj, 'quux', 'Quux');\n assert.equal(count, 2, 'observer not fired on unspecified property');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observers watching multiple properties via brace expansion should fire when the properties change'](assert) {\n let obj = {};\n let count = 0;\n\n (0, _metal.mixin)(obj, {\n observeFooAndBar: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n\n (0, _metal.set)(obj, 'foo', 'foo');\n assert.equal(count, 1, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'bar', 'bar');\n assert.equal(count, 2, 'observer specified via brace expansion invoked on property change');\n\n (0, _metal.set)(obj, 'baz', 'baz');\n assert.equal(count, 2, 'observer not invoked on unspecified property');\n }\n\n ['@test observers watching multiple properties via brace expansion should fire when dependent properties change'](assert) {\n let obj = { baz: 'Initial' };\n let count = 0;\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'bar').toLowerCase();\n }).property('bar'));\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return (0, _metal.get)(this, 'baz').toUpperCase();\n }).property('baz'));\n\n (0, _metal.mixin)(obj, {\n fooAndBarWatcher: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'baz', 'Baz');\n // fire once for foo, once for bar\n assert.equal(count, 2, 'observer specified via brace expansion invoked on dependent property change');\n\n (0, _metal.set)(obj, 'quux', 'Quux');\n assert.equal(count, 2, 'observer not fired on unspecified property');\n }\n\n ['@test nested observers should fire in order'](assert) {\n let obj = { foo: 'foo', bar: 'bar' };\n let fooCount = 0;\n let barCount = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n (0, _metal.addObserver)(obj, 'bar', function () {\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(fooCount, 1, 'fooCount should have fired already');\n barCount++;\n });\n\n (0, _metal.set)(obj, 'bar', 'BIFF');\n assert.equal(barCount, 1, 'barCount should have fired');\n assert.equal(fooCount, 1, 'foo should have fired');\n }\n\n ['@test removing an chain observer on change should not fail'](assert) {\n let foo = { bar: 'bar' };\n let obj1 = { foo: foo };\n let obj2 = { foo: foo };\n let obj3 = { foo: foo };\n let obj4 = { foo: foo };\n let count1 = 0;\n let count2 = 0;\n let count3 = 0;\n let count4 = 0;\n\n function observer1() {\n count1++;\n }\n function observer2() {\n count2++;\n }\n function observer3() {\n count3++;\n (0, _metal.removeObserver)(obj1, 'foo.bar', observer1);\n (0, _metal.removeObserver)(obj2, 'foo.bar', observer2);\n (0, _metal.removeObserver)(obj4, 'foo.bar', observer4);\n }\n function observer4() {\n count4++;\n }\n\n (0, _metal.addObserver)(obj1, 'foo.bar', observer1);\n (0, _metal.addObserver)(obj2, 'foo.bar', observer2);\n (0, _metal.addObserver)(obj3, 'foo.bar', observer3);\n (0, _metal.addObserver)(obj4, 'foo.bar', observer4);\n\n (0, _metal.set)(foo, 'bar', 'baz');\n\n assert.equal(count1, 1, 'observer1 fired');\n assert.equal(count2, 1, 'observer2 fired');\n assert.equal(count3, 1, 'observer3 fired');\n assert.equal(count4, 0, 'observer4 did not fire');\n }\n\n ['@test deferring property change notifications'](assert) {\n let obj = { foo: 'foo' };\n let fooCount = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n\n (0, _metal.beginPropertyChanges)();\n (0, _metal.set)(obj, 'foo', 'BIFF');\n (0, _metal.set)(obj, 'foo', 'BAZ');\n (0, _metal.endPropertyChanges)();\n\n assert.equal(fooCount, 1, 'foo should have fired once');\n }\n\n ['@test deferring property change notifications safely despite exceptions'](assert) {\n let obj = { foo: 'foo' };\n let fooCount = 0;\n let exc = new Error('Something unexpected happened!');\n\n assert.expect(2);\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n\n try {\n (0, _metal.changeProperties)(function () {\n (0, _metal.set)(obj, 'foo', 'BIFF');\n (0, _metal.set)(obj, 'foo', 'BAZ');\n throw exc;\n });\n } catch (err) {\n if (err !== exc) {\n throw err;\n }\n }\n\n assert.equal(fooCount, 1, 'foo should have fired once');\n\n (0, _metal.changeProperties)(function () {\n (0, _metal.set)(obj, 'foo', 'BIFF2');\n (0, _metal.set)(obj, 'foo', 'BAZ2');\n });\n\n assert.equal(fooCount, 2, 'foo should have fired again once');\n }\n\n ['@test addObserver should propagate through prototype'](assert) {\n let obj = { foo: 'foo', count: 0 };\n let obj2;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n this.count++;\n });\n obj2 = Object.create(obj);\n\n (0, _metal.set)(obj2, 'foo', 'bar');\n\n assert.equal(obj2.count, 1, 'should have invoked observer on inherited');\n assert.equal(obj.count, 0, 'should not have invoked observer on parent');\n\n obj2.count = 0;\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(obj.count, 0, 'should not have invoked observer on parent');\n assert.equal(obj2.count, 0, 'should not have invoked observer on inherited');\n }\n\n ['@test addObserver should respect targets with methods'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange(obj, keyName) {\n let value = (0, _metal.get)(obj, keyName);\n assert.equal(this, target1, 'should invoke with this');\n assert.equal(obj, observed, 'param1 should be observed object');\n assert.equal(keyName, 'foo', 'param2 should be keyName');\n assert.equal(value, 'BAZ', 'param3 should new value');\n this.count++;\n }\n };\n\n let target2 = {\n count: 0,\n\n didChange(obj, keyName) {\n let value = (0, _metal.get)(obj, keyName);\n assert.equal(this, target2, 'should invoke with this');\n assert.equal(obj, observed, 'param1 should be observed object');\n assert.equal(keyName, 'foo', 'param2 should be keyName');\n assert.equal(value, 'BAZ', 'param3 should new value');\n this.count++;\n }\n };\n\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, target2.didChange);\n\n (0, _metal.set)(observed, 'foo', 'BAZ');\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n }\n\n ['@test addObserver should allow multiple objects to observe a property'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n let target2 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, 'didChange');\n\n (0, _metal.set)(observed, 'foo', 'BAZ');\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n }\n });\n\n // ..........................................................\n // REMOVE OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('removeObserver', class extends _internalTestHelpers.AbstractTestCase {\n ['@test removing observer should stop firing'](assert) {\n let obj = {};\n let count = 0;\n function F() {\n count++;\n }\n (0, _metal.addObserver)(obj, 'foo', F);\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1, 'should have invoked observer');\n\n (0, _metal.removeObserver)(obj, 'foo', F);\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, \"removed observer shouldn't fire\");\n }\n\n ['@test local observers can be removed'](assert) {\n let barObserved = 0;\n\n let MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.observer)('bar', function () {\n barObserved++;\n }),\n\n foo2: (0, _metal.observer)('bar', function () {\n barObserved++;\n })\n });\n\n let obj = {};\n MyMixin.apply(obj);\n\n (0, _metal.set)(obj, 'bar', 'HI!');\n assert.equal(barObserved, 2, 'precond - observers should be fired');\n\n (0, _metal.removeObserver)(obj, 'bar', null, 'foo1');\n\n barObserved = 0;\n (0, _metal.set)(obj, 'bar', 'HI AGAIN!');\n\n assert.equal(barObserved, 1, 'removed observers should not be called');\n }\n\n ['@test removeObserver should respect targets with methods'](assert) {\n let observed = { foo: 'foo' };\n\n let target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n let target2 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n };\n\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, target2.didChange);\n\n (0, _metal.set)(observed, 'foo', 'BAZ');\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n\n (0, _metal.removeObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.removeObserver)(observed, 'foo', target2, target2.didChange);\n\n target1.count = target2.count = 0;\n (0, _metal.set)(observed, 'foo', 'BAZ');\n assert.equal(target1.count, 0, 'target1 observer should not fire again');\n assert.equal(target2.count, 0, 'target2 observer should not fire again');\n }\n });\n\n // ..........................................................\n // CHAINED OBSERVERS\n //\n\n let obj, count;\n\n (0, _internalTestHelpers.moduleFor)('addObserver - dependentkey with chained properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n },\n Capital: {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n }\n };\n\n count = 0;\n }\n\n afterEach() {\n obj = count = null;\n }\n\n ['@test depending on a chain with a computed property'](assert) {\n (0, _metal.defineProperty)(obj, 'computed', (0, _metal.computed)(function () {\n return { foo: 'bar' };\n }));\n\n let changed = 0;\n (0, _metal.addObserver)(obj, 'computed.foo', function () {\n changed++;\n });\n\n assert.equal((0, _metal.getCachedValueFor)(obj, 'computed'), undefined, 'addObserver should not compute CP');\n\n (0, _metal.set)(obj, 'computed.foo', 'baz');\n\n assert.equal(changed, 1, 'should fire observer');\n }\n\n ['@test depending on a simple chain'](assert) {\n let val;\n (0, _metal.addObserver)(obj, 'foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(target, key);\n count++;\n });\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', { biff: 'BLARG' });\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n\n (0, _metal.set)(obj, 'foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n\n let foo = (0, _metal.get)(obj, 'foo');\n\n (0, _metal.set)(obj, 'foo', 'BOO');\n assert.equal(val, undefined);\n assert.equal(count, 6);\n\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n\n ['@test depending on a chain with a capitalized first key'](assert) {\n let val;\n\n (0, _metal.addObserver)(obj, 'Capital.foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(obj, key);\n count++;\n });\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar'), 'baz', { biff: 'BLARG' });\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo'), 'bar', { baz: { biff: 'BOOM' } });\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n\n (0, _metal.set)(obj, 'Capital.foo', { bar: { baz: { biff: 'BLARG' } } });\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n\n let foo = (0, _metal.get)(obj, 'foo');\n\n (0, _metal.set)(obj, 'Capital.foo', 'BOO');\n assert.equal(val, undefined);\n assert.equal(count, 6);\n\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n });\n\n // ..........................................................\n // SETTING IDENTICAL VALUES\n //\n\n (0, _internalTestHelpers.moduleFor)('props/observer_test - setting identical values', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setting simple prop should not trigger'](assert) {\n let obj = { foo: 'bar' };\n let count = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 0, 'should not trigger observer');\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, 'should trigger observer');\n\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(count, 1, 'should not trigger observer again');\n }\n\n // The issue here is when a computed property is directly set with a value, then has a\n // dependent key change (which triggers a cache expiration and recomputation), observers will\n // not be fired if the CP setter is called with the last set value.\n ['@test setting a cached computed property whose value has changed should trigger'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get: function () {\n return (0, _metal.get)(this, 'baz');\n },\n set: function (key, value) {\n return value;\n }\n }).property('baz'));\n\n let count = 0;\n\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n\n (0, _metal.set)(obj, 'baz', 'qux');\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(obj, 'foo'), 'qux');\n\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(count, 3);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('changeProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test observers added/removed during changeProperties should do the right thing.'](assert) {\n let obj = {\n foo: 0\n };\n function Observer() {\n this.didChangeCount = 0;\n }\n Observer.prototype = {\n add() {\n (0, _metal.addObserver)(obj, 'foo', this, 'didChange');\n },\n remove() {\n (0, _metal.removeObserver)(obj, 'foo', this, 'didChange');\n },\n didChange() {\n this.didChangeCount++;\n }\n };\n let addedBeforeFirstChangeObserver = new Observer();\n let addedAfterFirstChangeObserver = new Observer();\n let addedAfterLastChangeObserver = new Observer();\n let removedBeforeFirstChangeObserver = new Observer();\n let removedBeforeLastChangeObserver = new Observer();\n let removedAfterLastChangeObserver = new Observer();\n removedBeforeFirstChangeObserver.add();\n removedBeforeLastChangeObserver.add();\n removedAfterLastChangeObserver.add();\n (0, _metal.changeProperties)(function () {\n removedBeforeFirstChangeObserver.remove();\n addedBeforeFirstChangeObserver.add();\n\n (0, _metal.set)(obj, 'foo', 1);\n\n assert.equal(addedBeforeFirstChangeObserver.didChangeCount, 0, 'addObserver called before the first change is deferred');\n\n addedAfterFirstChangeObserver.add();\n removedBeforeLastChangeObserver.remove();\n\n (0, _metal.set)(obj, 'foo', 2);\n\n assert.equal(addedAfterFirstChangeObserver.didChangeCount, 0, 'addObserver called after the first change is deferred');\n\n addedAfterLastChangeObserver.add();\n removedAfterLastChangeObserver.remove();\n });\n\n assert.equal(removedBeforeFirstChangeObserver.didChangeCount, 0, 'removeObserver called before the first change sees none');\n assert.equal(addedBeforeFirstChangeObserver.didChangeCount, 1, 'addObserver called before the first change sees only 1');\n assert.equal(addedAfterFirstChangeObserver.didChangeCount, 1, 'addObserver called after the first change sees 1');\n assert.equal(addedAfterLastChangeObserver.didChangeCount, 1, 'addObserver called after the last change sees 1');\n assert.equal(removedBeforeLastChangeObserver.didChangeCount, 0, 'removeObserver called before the last change sees none');\n assert.equal(removedAfterLastChangeObserver.didChangeCount, 0, 'removeObserver called after the last change sees none');\n }\n\n ['@test calling changeProperties while executing deferred observers works correctly'](assert) {\n let obj = { foo: 0 };\n let fooDidChange = 0;\n\n (0, _metal.addObserver)(obj, 'foo', () => {\n fooDidChange++;\n (0, _metal.changeProperties)(() => {});\n });\n\n (0, _metal.changeProperties)(() => {\n (0, _metal.set)(obj, 'foo', 1);\n });\n\n assert.equal(fooDidChange, 1);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Keys behavior with observers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should not leak properties on the prototype'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(beer), []);\n (0, _metal.removeObserver)(beer, 'type', K);\n }\n\n ['@test observing a non existent property'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'brand', K);\n\n assert.deepEqual(Object.keys(beer), []);\n\n (0, _metal.set)(beer, 'brand', 'Corona');\n assert.deepEqual(Object.keys(beer), ['brand']);\n\n (0, _metal.removeObserver)(beer, 'brand', K);\n }\n\n ['@test with observers switched on and off'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n\n assert.deepEqual(Object.keys(beer), []);\n }\n\n ['@test observers switched on and off with setter in between'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.set)(beer, 'type', 'ale');\n (0, _metal.removeObserver)(beer, 'type', K);\n\n assert.deepEqual(Object.keys(beer), ['type']);\n }\n\n ['@test observer switched on and off and then setter'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n (0, _metal.set)(beer, 'type', 'ale');\n\n assert.deepEqual(Object.keys(beer), ['type']);\n }\n\n ['@test observers switched on and off with setter in between (observed property is not shadowing)'](assert) {\n function Beer() {}\n\n let beer = new Beer();\n (0, _metal.set)(beer, 'type', 'ale');\n assert.deepEqual(Object.keys(beer), ['type'], 'only set');\n\n let otherBeer = new Beer();\n (0, _metal.addObserver)(otherBeer, 'type', K);\n (0, _metal.set)(otherBeer, 'type', 'ale');\n assert.deepEqual(Object.keys(otherBeer), ['type'], 'addObserver -> set');\n\n let yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n\n let itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\n }\n\n ['@test observers switched on and off with setter in between (observed property is shadowing one on the prototype)'](assert) {\n function Beer() {}\n Beer.prototype.type = 'ipa';\n\n let beer = new Beer();\n (0, _metal.set)(beer, 'type', 'ale');\n assert.deepEqual(Object.keys(beer), ['type'], 'after set');\n\n let otherBeer = new Beer();\n (0, _metal.addObserver)(otherBeer, 'type', K);\n (0, _metal.set)(otherBeer, 'type', 'ale');\n assert.deepEqual(Object.keys(otherBeer), ['type'], 'addObserver -> set');\n\n let yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n\n let itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(beer, 'type', K);\n (0, _metal.removeObserver)(beer, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\n }\n });\n});","enifed('@ember/-internals/metal/tests/performance_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n /*\n This test file is designed to capture performance regressions related to\n deferred computation. Things like run loops, computed properties, and bindings\n should run the minimum amount of times to achieve best performance, so any\n bugs that cause them to get evaluated more than necessary should be put here.\n */\n\n (0, _internalTestHelpers.moduleFor)('Computed Properties - Number of times evaluated', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed properties that depend on multiple properties should run only once per run loop'](assert) {\n let obj = { a: 'a', b: 'b', c: 'c' };\n let cpCount = 0;\n let obsCount = 0;\n\n (0, _metal.defineProperty)(obj, 'abc', (0, _metal.computed)(function (key) {\n cpCount++;\n return 'computed ' + key;\n }).property('a', 'b', 'c'));\n\n (0, _metal.get)(obj, 'abc');\n\n cpCount = 0;\n\n (0, _metal.addObserver)(obj, 'abc', function () {\n obsCount++;\n });\n\n (0, _metal.beginPropertyChanges)();\n (0, _metal.set)(obj, 'a', 'aa');\n (0, _metal.set)(obj, 'b', 'bb');\n (0, _metal.set)(obj, 'c', 'cc');\n (0, _metal.endPropertyChanges)();\n\n (0, _metal.get)(obj, 'abc');\n\n assert.equal(cpCount, 1, 'The computed property is only invoked once');\n assert.equal(obsCount, 1, 'The observer is only invoked once');\n }\n\n ['@test computed properties are not executed if they are the last segment of an observer chain pain'](assert) {\n let foo = { bar: { baz: {} } };\n\n let count = 0;\n\n (0, _metal.defineProperty)(foo.bar.baz, 'bam', (0, _metal.computed)(function () {\n count++;\n }));\n\n (0, _metal.addObserver)(foo, 'bar.baz.bam', function () {});\n\n (0, _metal.notifyPropertyChange)((0, _metal.get)(foo, 'bar.baz'), 'bam');\n\n assert.equal(count, 0, 'should not have recomputed property');\n }\n });\n});","enifed('@ember/-internals/metal/tests/properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('defineProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test toString'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'toString', undefined, function () {\n return 'FOO';\n });\n assert.equal(obj.toString(), 'FOO', 'should replace toString');\n }\n\n ['@test for data properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'foo', 'key name should be foo');\n assert.equal(value, 'bar', 'value should be bar');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'foo', undefined, 'bar');\n }\n\n ['@test for computed properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let computedProperty = (0, _metal.computed)(function () {\n return this;\n });\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'foo', 'key name should be foo');\n assert.strictEqual(value, computedProperty, 'value should be passed as computed property');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'foo', computedProperty);\n }\n\n ['@test for descriptor properties, didDefineProperty hook should be called if implemented'](assert) {\n assert.expect(2);\n\n let descriptor = {\n writable: true,\n configurable: false,\n enumerable: true,\n value: 42\n };\n\n let obj = {\n didDefineProperty(obj, keyName, value) {\n assert.equal(keyName, 'answer', 'key name should be answer');\n assert.strictEqual(value, descriptor, 'value should be passed as descriptor');\n }\n };\n\n (0, _metal.defineProperty)(obj, 'answer', descriptor);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.deprecateProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test enables access to deprecated property and returns the value of the new property'](assert) {\n assert.expect(3);\n let obj = { foo: 'bar' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', until: 'some.version' });\n\n expectDeprecation();\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n\n obj.foo = 'blammo';\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n }\n\n ['@test deprecatedKey is not enumerable'](assert) {\n assert.expect(2);\n let obj = { foo: 'bar', blammo: 'whammy' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', until: 'some.version' });\n\n for (let prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n assert.notEqual(prop, 'baz');\n }\n }\n }\n\n ['@test enables setter to deprecated property and updates the value of the new property'](assert) {\n assert.expect(3);\n let obj = { foo: 'bar' };\n\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', { id: 'baz-deprecation', until: 'some.version' });\n\n expectDeprecation();\n obj.baz = 'bloop';\n assert.equal(obj.foo, 'bloop', 'updating baz updates foo');\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n }\n });\n});","enifed('@ember/-internals/metal/tests/property_did_change_hook', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('PROPERTY_DID_CHANGE', class extends _internalTestHelpers.AbstractTestCase {\n ['@test alias and cp'](assert) {\n let counts = {};\n let obj = {\n child: {},\n [_metal.PROPERTY_DID_CHANGE](keyName) {\n counts[keyName] = (counts[keyName] || 0) + 1;\n }\n };\n\n (0, _metal.defineProperty)(obj, 'cost', (0, _metal.alias)('child.cost'));\n (0, _metal.defineProperty)(obj, 'tax', (0, _metal.alias)('child.tax'));\n\n (0, _metal.defineProperty)(obj, 'total', (0, _metal.computed)('cost', 'tax', {\n get() {\n return (0, _metal.get)(this, 'cost') + (0, _metal.get)(this, 'tax');\n }\n }));\n\n assert.ok(!(0, _metal.isWatching)(obj, 'child.cost'), 'precond alias target `child.cost` is not watched');\n assert.equal((0, _metal.get)(obj, 'cost'), undefined);\n // this is how PROPERTY_DID_CHANGE will get notified\n assert.ok((0, _metal.isWatching)(obj, 'child.cost'), 'alias target `child.cost` is watched after consumption');\n\n assert.ok(!(0, _metal.isWatching)(obj, 'child.tax'), 'precond alias target `child.tax` is not watched');\n assert.equal((0, _metal.get)(obj, 'tax'), undefined);\n // this is how PROPERTY_DID_CHANGE will get notified\n assert.ok((0, _metal.isWatching)(obj, 'child.tax'), 'alias target `child.cost` is watched after consumption');\n\n // increments the watching count on the alias itself to 1\n assert.ok(isNaN((0, _metal.get)(obj, 'total')), 'total is initialized');\n\n // decrements the watching count on the alias itself to 0\n (0, _metal.set)(obj, 'child', {\n cost: 399.0,\n tax: 32.93\n });\n\n // this should have called PROPERTY_DID_CHANGE for all of them\n assert.equal(counts['cost'], 1, 'PROPERTY_DID_CHANGE called with cost');\n assert.equal(counts['tax'], 1, 'PROPERTY_DID_CHANGE called with tax');\n assert.equal(counts['total'], 1, 'PROPERTY_DID_CHANGE called with total');\n\n // we should still have a dependency installed\n assert.ok((0, _metal.isWatching)(obj, 'child.cost'), 'watching child.cost');\n assert.ok((0, _metal.isWatching)(obj, 'child.tax'), 'watching child.tax');\n\n (0, _metal.set)(obj, 'child', {\n cost: 100.0,\n tax: 10.0\n });\n\n assert.equal(counts['cost'], 2, 'PROPERTY_DID_CHANGE called with cost');\n assert.equal(counts['tax'], 2, 'PROPERTY_DID_CHANGE called with tax');\n assert.equal(counts['total'], 1, 'PROPERTY_DID_CHANGE called with total');\n }\n });\n});","enifed('@ember/-internals/metal/tests/property_events_test', ['@ember/-internals/meta', '@ember/-internals/metal', 'internal-test-helpers'], function (_meta, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('notifyPropertyChange', class extends _internalTestHelpers.AbstractTestCase {\n ['@test notifies property changes on instances'](assert) {\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n }\n\n let foo = new Foo();\n\n (0, _metal.notifyPropertyChange)(foo, 'bar');\n }\n\n ['@test notifies property changes on instances with meta'](assert) {\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n }\n\n let foo = new Foo();\n\n (0, _meta.meta)(foo); // setup meta\n\n (0, _metal.notifyPropertyChange)(foo, 'bar');\n }\n\n ['@test does not notify on class prototypes with meta'](assert) {\n assert.expect(0);\n\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n }\n\n let foo = new Foo();\n\n (0, _meta.meta)(foo.constructor.prototype); // setup meta for prototype\n\n (0, _metal.notifyPropertyChange)(foo.constructor.prototype, 'bar');\n }\n\n ['@test does not notify on non-class prototypes with meta'](assert) {\n assert.expect(0);\n\n let foo = {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'baz', 'property change notified');\n }\n };\n\n let bar = Object.create(foo);\n\n (0, _meta.meta)(foo); // setup meta for prototype\n (0, _meta.meta)(bar); // setup meta for instance, switch prototype\n\n (0, _metal.notifyPropertyChange)(foo, 'baz');\n }\n });\n});","enifed('@ember/-internals/metal/tests/set_properties_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('setProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test supports setting multiple attributes at once'](assert) {\n assert.deepEqual((0, _metal.setProperties)(null, null), null, 'noop for null properties and null object');\n assert.deepEqual((0, _metal.setProperties)(undefined, undefined), undefined, 'noop for undefined properties and undefined object');\n\n assert.deepEqual((0, _metal.setProperties)({}), undefined, 'noop for no properties');\n assert.deepEqual((0, _metal.setProperties)({}, undefined), undefined, 'noop for undefined');\n assert.deepEqual((0, _metal.setProperties)({}, null), null, 'noop for null');\n assert.deepEqual((0, _metal.setProperties)({}, NaN), NaN, 'noop for NaN');\n assert.deepEqual((0, _metal.setProperties)({}, {}), {}, 'meh');\n\n let props = (0, _metal.setProperties)({}, { foo: undefined });\n assert.deepEqual(props, { foo: undefined }, 'Setting undefined value');\n assert.ok('foo' in props, 'Setting undefined value');\n assert.deepEqual(Object.keys(props), ['foo'], 'Setting undefined value');\n\n assert.deepEqual((0, _metal.setProperties)({}, { foo: 1 }), { foo: 1 }, 'Set a single property');\n\n assert.deepEqual((0, _metal.setProperties)({}, { foo: 1, bar: 1 }), { foo: 1, bar: 1 }, 'Set multiple properties');\n\n assert.deepEqual((0, _metal.setProperties)({ foo: 2, baz: 2 }, { foo: 1 }), { foo: 1 }, 'Set one of multiple properties');\n\n assert.deepEqual((0, _metal.setProperties)({ foo: 2, baz: 2 }, { bar: 2 }), {\n bar: 2\n }, 'Set an additional, previously unset property');\n }\n });\n});","enifed(\"@ember/-internals/metal/tests/tracked/computed_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (false /* EMBER_METAL_TRACKED_PROPERTIES */) {\n (0, _internalTestHelpers.moduleFor)('@tracked getters', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works without get'](assert) {\n let count = 0;\n class Count {\n get foo() {\n count++;\n return `computed foo`;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"foo\", null);\n let obj = new Count();\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n ['@test defining computed property should invoke property on get'](assert) {\n let count = 0;\n class Count {\n get foo() {\n count++;\n return `computed foo`;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"foo\", null);\n let obj = new Count();\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n ['@test defining computed property should invoke property on set'](assert) {\n let count = 0;\n class Foo {\n constructor() {\n this.__foo = '';\n }\n get foo() {\n return this.__foo;\n }\n set foo(value) {\n count++;\n this.__foo = `computed ${value}`;\n }\n }\n __decorate([_metal.tracked], Foo.prototype, \"foo\", null);\n let obj = new Foo();\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value');\n assert.equal(count, 1, 'should have invoked computed property');\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed bar', 'should return new value');\n }\n });\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/get_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (false /* EMBER_METAL_TRACKED_PROPERTIES */) {\n function createObj() {\n class Obj {\n constructor() {\n this.string = 'string';\n this.number = 23;\n this.boolTrue = true;\n this.boolFalse = false;\n this.nullValue = null;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"string\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"number\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolTrue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolFalse\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"nullValue\", void 0);\n return new Obj();\n }\n (0, _internalTestHelpers.moduleFor)('@tracked decorator: get', class extends _internalTestHelpers.AbstractTestCase {\n '@test should get arbitrary properties on an object'() {\n let obj = createObj();\n for (let key in obj) {\n this.assert.equal((0, _metal.get)(obj, key), obj[key], key);\n }\n }\n '@test should retrieve a number key on an object'() {\n class Obj {\n constructor() {\n this[1] = 'first';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, 1, void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, '1'), 'first');\n }\n '@test should retrieve an empty key on an object'() {\n class Obj {\n constructor() {\n this[''] = 'empty';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"\", void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, ''), 'empty');\n }\n '@test should get a @tracked path'() {\n class Key {\n constructor() {\n this.value = 'value';\n }\n }\n __decorate([_metal.tracked], Key.prototype, \"value\", void 0);\n class Path {\n constructor() {\n this.key = new Key();\n }\n }\n __decorate([_metal.tracked], Path.prototype, \"key\", void 0);\n class Obj {\n constructor() {\n this.path = new Path();\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"path\", void 0);\n let obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, 'path.key.value'), 'value');\n }\n '@test should not access a property more than once'() {\n let count = 20;\n class Count {\n get id() {\n return ++count;\n }\n }\n __decorate([_metal.tracked], Count.prototype, \"id\", null);\n let obj = new Count();\n (0, _metal.get)(obj, 'id');\n this.assert.equal(count, 21);\n }\n });\n (0, _internalTestHelpers.moduleFor)('@tracked decorator: getWithDefault', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object']() {\n let obj = createObj();\n for (let key in obj) {\n this.assert.equal((0, _metal.getWithDefault)(obj, key, 'fail'), obj[key], key);\n }\n class Obj {\n constructor() {\n this.undef = undefined;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"undef\", void 0);\n let obj2 = new Obj();\n this.assert.equal((0, _metal.getWithDefault)(obj2, 'undef', 'default'), 'default', 'explicit undefined retrieves the default');\n this.assert.equal((0, _metal.getWithDefault)(obj2, 'not-present', 'default'), 'default', 'non-present key retrieves the default');\n }\n });\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/set_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n\n if (false /* EMBER_METAL_TRACKED_PROPERTIES */) {\n const createObj = () => {\n class Obj {\n constructor() {\n this.string = 'string';\n this.number = 23;\n this.boolTrue = true;\n this.boolFalse = false;\n this.nullValue = null;\n this.undefinedValue = undefined;\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"string\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"number\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolTrue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"boolFalse\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"nullValue\", void 0);\n __decorate([_metal.tracked], Obj.prototype, \"undefinedValue\", void 0);\n return new Obj();\n };\n (0, _internalTestHelpers.moduleFor)('@tracked set', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should set arbitrary properties on an object'](assert) {\n let obj = createObj();\n class Obj {\n constructor() {\n this.undefinedValue = 'emberjs';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, \"undefinedValue\", void 0);\n let newObj = new Obj();\n for (let key in obj) {\n assert.equal((0, _metal.set)(newObj, key, obj[key]), obj[key], 'should return value');\n assert.equal((0, _metal.get)(newObj, key), obj[key], 'should set value');\n }\n }\n ['@test should set a number key on an object'](assert) {\n class Obj {\n constructor() {\n this[1] = 'original';\n }\n }\n __decorate([_metal.tracked], Obj.prototype, 1, void 0);\n let obj = new Obj();\n (0, _metal.set)(obj, '1', 'first');\n assert.equal(obj[1], 'first');\n }\n });\n }\n});","enifed('@ember/-internals/metal/tests/tracked/support', ['exports', '@ember/-internals/metal'], function (exports, _metal) {\n 'use strict';\n\n exports.createTracked = createTracked;\n exports.createWithDescriptors = createWithDescriptors;\n function createTracked(values, proto = {}) {\n function Class() {\n for (let prop in values) {\n this[prop] = values[prop];\n }\n }\n\n for (let prop in values) {\n Object.defineProperty(proto, prop, (0, _metal.tracked)(proto, prop, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: values[prop]\n }));\n }\n\n Class.prototype = proto;\n\n return new Class();\n }\n\n function createWithDescriptors(values) {\n function Class() {}\n\n for (let prop in values) {\n let descriptor = Object.getOwnPropertyDescriptor(values, prop);\n Object.defineProperty(Class.prototype, prop, (0, _metal.tracked)(Class.prototype, prop, descriptor));\n }\n\n return new Class();\n }\n});","enifed(\"@ember/-internals/metal/tests/tracked/validation_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n var __decorate = undefined && undefined.__decorate || function (decorators, target, key, desc) {\n var c = arguments.length,\n r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,\n d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n\n if (false /* EMBER_METAL_TRACKED_PROPERTIES */) {\n (0, _internalTestHelpers.moduleFor)('@tracked get validation', class extends _internalTestHelpers.AbstractTestCase {\n [`@test validators for tracked getters with dependencies should invalidate when the dependencies invalidate`](assert) {\n class Tracked {\n constructor(first, last) {\n this.first = undefined;\n this.last = undefined;\n this.first = first;\n this.last = last;\n }\n get full() {\n return `${this.first} ${this.last}`;\n }\n }\n __decorate([_metal.tracked], Tracked.prototype, \"first\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"last\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"full\", null);\n let obj = new Tracked('Tom', 'Dale');\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = obj.full;\n assert.equal(full, 'Tom Dale', 'The full name starts correct');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n obj.first = 'Thomas';\n assert.equal(tag.validate(snapshot), false);\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n }\n [`@test interaction with Ember object model (tracked property depending on Ember property)`](assert) {\n class Tracked {\n constructor(name) {\n this.name = name;\n }\n get full() {\n return `${(0, _metal.get)(this.name, 'first')} ${(0, _metal.get)(this.name, 'last')}`;\n }\n }\n __decorate([_metal.tracked], Tracked.prototype, \"name\", void 0);\n __decorate([_metal.tracked], Tracked.prototype, \"full\", null);\n let tom = { first: 'Tom', last: 'Dale' };\n let obj = new Tracked(tom);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = obj.full;\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember set');\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n }\n [`@test interaction with Ember object model (Ember computed property depending on tracked property)`](assert) {\n class EmberObject {\n constructor(name) {\n this.name = name;\n }\n }\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('name', function () {\n let name = (0, _metal.get)(this, 'name');\n return `${name.first} ${name.last}`;\n }));\n class Name {\n constructor(first, last) {\n this.first = first;\n this.last = last;\n }\n }\n __decorate([_metal.tracked], Name.prototype, \"first\", void 0);\n __decorate([_metal.tracked], Name.prototype, \"last\", void 0);\n let tom = new Name('Tom', 'Dale');\n let obj = new EmberObject(tom);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n tom.first = 'Thomas';\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with tracked properties');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n }\n ['@test interaction with the Ember object model (paths going through tracked properties)'](assert) {\n let self;\n class EmberObject {\n constructor(contact) {\n this.contact = contact;\n self = this;\n }\n }\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('contact.name.first', 'contact.name.last', function () {\n let contact = (0, _metal.get)(self, 'contact');\n return `${(0, _metal.get)(contact.name, 'first')} ${(0, _metal.get)(contact.name, 'last')}`;\n }));\n class Contact {\n constructor(name) {\n this.name = undefined;\n this.name = name;\n }\n }\n __decorate([_metal.tracked], Contact.prototype, \"name\", void 0);\n class EmberName {\n constructor(first, last) {\n this.first = first;\n this.last = last;\n }\n }\n let tom = new EmberName('Tom', 'Dale');\n let contact = new Contact(tom);\n let obj = new EmberObject(contact);\n let tag = (0, _metal.tagForProperty)(obj, 'full');\n let snapshot = tag.value();\n let full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n assert.equal(tag.validate(snapshot), true);\n snapshot = tag.value();\n assert.equal(tag.validate(snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = tag.value();\n tom = contact.name = new EmberName('T', 'Dale');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'T Dale');\n snapshot = tag.value();\n (0, _metal.set)(tom, 'first', 'Tizzle');\n assert.equal(tag.validate(snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Tizzle Dale');\n }\n });\n }\n});","enifed('@ember/-internals/metal/tests/watching/is_watching_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n function testObserver(assert, setup, teardown, key = 'key') {\n let obj = {};\n\n assert.equal((0, _metal.isWatching)(obj, key), false, 'precond - isWatching is false by default');\n setup(obj, key, 'fn');\n assert.equal((0, _metal.isWatching)(obj, key), true, 'isWatching is true when observers are added');\n teardown(obj, key, 'fn');\n assert.equal((0, _metal.isWatching)(obj, key), false, 'isWatching is false after observers are removed');\n }\n\n (0, _internalTestHelpers.moduleFor)('isWatching', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isWatching is true for regular local observers'](assert) {\n testObserver(assert, (obj, key, fn) => {\n _metal.Mixin.create({\n [fn]: (0, _metal.observer)(key, function () {})\n }).apply(obj);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, key, obj, fn));\n }\n\n ['@test isWatching is true for nonlocal observers'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.addObserver)(obj, key, obj, fn);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, key, obj, fn));\n }\n\n ['@test isWatching is true for chained observers'](assert) {\n testObserver(assert, function (obj, key, fn) {\n (0, _metal.addObserver)(obj, key + '.bar', obj, fn);\n }, function (obj, key, fn) {\n (0, _metal.removeObserver)(obj, key + '.bar', obj, fn);\n });\n }\n\n ['@test isWatching is true for computed properties'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, fn, (0, _metal.computed)(function () {}).property(key));\n (0, _metal.get)(obj, fn);\n }, (obj, key, fn) => (0, _metal.defineProperty)(obj, fn, null));\n }\n\n ['@test isWatching is true for chained computed properties'](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, fn, (0, _metal.computed)(function () {}).property(key + '.bar'));\n (0, _metal.get)(obj, fn);\n }, (obj, key, fn) => (0, _metal.defineProperty)(obj, fn, null));\n }\n\n // can't watch length on Array - it is special...\n // But you should be able to watch a length property of an object\n [\"@test isWatching is true for 'length' property on object\"](assert) {\n testObserver(assert, (obj, key, fn) => {\n (0, _metal.defineProperty)(obj, 'length', null, '26.2 miles');\n (0, _metal.addObserver)(obj, 'length', obj, fn);\n }, (obj, key, fn) => (0, _metal.removeObserver)(obj, 'length', obj, fn), 'length');\n }\n });\n});","enifed('@ember/-internals/metal/tests/watching/unwatch_test', ['@ember/-internals/metal', 'internal-test-helpers'], function (_metal, _internalTestHelpers) {\n 'use strict';\n\n let didCount;\n\n function addListeners(obj, keyPath) {\n (0, _metal.addListener)(obj, keyPath + ':change', () => didCount++);\n }\n\n (0, _internalTestHelpers.moduleFor)('unwatch', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n didCount = 0;\n }\n\n ['@test unwatching a computed property - regular get/set'](assert) {\n let obj = {};\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {\n return this.__foo;\n },\n set(keyName, value) {\n this.__foo = value;\n return this.__foo;\n }\n }));\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching a regular property - regular get/set'](assert) {\n let obj = { foo: 'BIFF' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching should be nested'](assert) {\n let obj = { foo: 'BIFF' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 1, 'should NOT have invoked didCount');\n\n (0, _metal.unwatch)(obj, 'foo');\n didCount = 0;\n (0, _metal.set)(obj, 'foo', 'BAZ');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching \"length\" property on an object'](assert) {\n let obj = { foo: 'RUN' };\n addListeners(obj, 'length');\n\n // Can watch length when it is undefined\n (0, _metal.watch)(obj, 'length');\n (0, _metal.set)(obj, 'length', '10k');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n // Should stop watching despite length now being defined (making object 'array-like')\n (0, _metal.unwatch)(obj, 'length');\n didCount = 0;\n (0, _metal.set)(obj, 'length', '5k');\n assert.equal(didCount, 0, 'should NOT have invoked didCount');\n }\n\n ['@test unwatching should not destroy non MANDATORY_SETTER descriptor'](assert) {\n let obj = {\n get foo() {\n return 'RUN';\n }\n };\n\n assert.equal(obj.foo, 'RUN', 'obj.foo');\n (0, _metal.watch)(obj, 'foo');\n assert.equal(obj.foo, 'RUN', 'obj.foo after watch');\n (0, _metal.unwatch)(obj, 'foo');\n assert.equal(obj.foo, 'RUN', 'obj.foo after unwatch');\n }\n });\n});","enifed('@ember/-internals/metal/tests/watching/watch_test', ['@ember/-internals/environment', '@ember/-internals/metal', '@ember/-internals/meta', 'internal-test-helpers'], function (_environment, _metal, _meta, _internalTestHelpers) {\n 'use strict';\n\n let didCount, didKeys, originalLookup;\n\n function addListeners(obj, keyPath) {\n (0, _metal.addListener)(obj, keyPath + ':change', function () {\n didCount++;\n didKeys.push(keyPath);\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('watch', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n didCount = 0;\n didKeys = [];\n\n originalLookup = _environment.context.lookup;\n _environment.context.lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test watching a computed property'](assert) {\n let obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {\n return this.__foo;\n },\n set(keyName, value) {\n if (value !== undefined) {\n this.__foo = value;\n }\n return this.__foo;\n }\n }));\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n }\n\n ['@test watching a regular defined property'](assert) {\n let obj = { foo: 'baz' };\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'should have original prop');\n\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should get new value');\n assert.equal(obj.foo, 'bar', 'property should be accessible on obj');\n }\n\n ['@test watching a regular undefined property'](assert) {\n let obj = {};\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n\n assert.equal('foo' in obj, false, 'precond undefined');\n\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should get new value');\n assert.equal(obj.foo, 'bar', 'property should be accessible on obj');\n }\n\n ['@test watches should inherit'](assert) {\n let obj = { foo: 'baz' };\n let objB = Object.create(obj);\n\n addListeners(obj, 'foo');\n (0, _metal.watch)(obj, 'foo');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'should have original prop');\n\n (0, _metal.set)(objB, 'foo', 'bar');\n (0, _metal.set)(obj, 'foo', 'baz');\n assert.equal(didCount, 1, 'should have invoked didCount once only');\n }\n\n ['@test watching an object THEN defining it should work also'](assert) {\n let obj = {};\n addListeners(obj, 'foo');\n\n (0, _metal.watch)(obj, 'foo');\n\n (0, _metal.defineProperty)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should have set');\n assert.equal(didCount, 1, 'should have invoked didChange once');\n }\n\n ['@test watching a chain then defining the property'](assert) {\n let obj = {};\n let foo = { bar: 'bar' };\n addListeners(obj, 'foo.bar');\n addListeners(foo, 'bar');\n\n (0, _metal.watch)(obj, 'foo.bar');\n\n (0, _metal.defineProperty)(obj, 'foo', undefined, foo);\n (0, _metal.set)(foo, 'bar', 'baz');\n\n assert.deepEqual(didKeys, ['foo.bar', 'bar'], 'should have invoked didChange with bar, foo.bar');\n assert.equal(didCount, 2, 'should have invoked didChange twice');\n }\n\n ['@test watching a chain then defining the nested property'](assert) {\n let bar = {};\n let obj = { foo: bar };\n let baz = { baz: 'baz' };\n addListeners(obj, 'foo.bar.baz');\n addListeners(baz, 'baz');\n\n (0, _metal.watch)(obj, 'foo.bar.baz');\n\n (0, _metal.defineProperty)(bar, 'bar', undefined, baz);\n (0, _metal.set)(baz, 'baz', 'BOO');\n\n assert.deepEqual(didKeys, ['foo.bar.baz', 'baz'], 'should have invoked didChange with bar, foo.bar');\n assert.equal(didCount, 2, 'should have invoked didChange twice');\n }\n\n ['@test watching an object value then unwatching should restore old value'](assert) {\n let obj = { foo: { bar: { baz: { biff: 'BIFF' } } } };\n addListeners(obj, 'foo.bar.baz.biff');\n\n (0, _metal.watch)(obj, 'foo.bar.baz.biff');\n\n let foo = (0, _metal.get)(obj, 'foo');\n assert.equal((0, _metal.get)((0, _metal.get)((0, _metal.get)(foo, 'bar'), 'baz'), 'biff'), 'BIFF', 'biff should exist');\n\n (0, _metal.unwatch)(obj, 'foo.bar.baz.biff');\n assert.equal((0, _metal.get)((0, _metal.get)((0, _metal.get)(foo, 'bar'), 'baz'), 'biff'), 'BIFF', 'biff should exist');\n }\n\n ['@test when watching another object, destroy should remove chain watchers from the other object'](assert) {\n let objA = {};\n let objB = { foo: 'bar' };\n objA.b = objB;\n addListeners(objA, 'b.foo');\n\n (0, _metal.watch)(objA, 'b.foo');\n\n let meta_objB = (0, _meta.meta)(objB);\n let chainNode = (0, _meta.meta)(objA).readableChains().chains.b.chains.foo;\n\n assert.equal(meta_objB.peekWatching('foo'), 1, 'should be watching foo');\n assert.equal(meta_objB.readableChainWatchers().has('foo', chainNode), true, 'should have chain watcher');\n\n (0, _meta.deleteMeta)(objA);\n\n assert.equal(meta_objB.peekWatching('foo'), 0, 'should not be watching foo');\n assert.equal(meta_objB.readableChainWatchers().has('foo', chainNode), false, 'should not have chain watcher');\n }\n\n // TESTS for length property\n\n ['@test watching \"length\" property on an object'](assert) {\n let obj = { length: '26.2 miles' };\n addListeners(obj, 'length');\n\n (0, _metal.watch)(obj, 'length');\n assert.equal((0, _metal.get)(obj, 'length'), '26.2 miles', 'should have original prop');\n\n (0, _metal.set)(obj, 'length', '10k');\n assert.equal(didCount, 1, 'should have invoked didCount');\n\n assert.equal((0, _metal.get)(obj, 'length'), '10k', 'should get new value');\n assert.equal(obj.length, '10k', 'property should be accessible on obj');\n }\n\n ['@test watching \"length\" property on an array'](assert) {\n let arr = [];\n addListeners(arr, 'length');\n\n (0, _metal.watch)(arr, 'length');\n assert.equal((0, _metal.get)(arr, 'length'), 0, 'should have original prop');\n\n (0, _metal.set)(arr, 'length', '10');\n assert.equal(didCount, 1, 'should NOT have invoked didCount');\n\n assert.equal((0, _metal.get)(arr, 'length'), 10, 'should get new value');\n assert.equal(arr.length, 10, 'property should be accessible on arr');\n }\n\n ['@test watch + ES5 getter'](assert) {\n let parent = { b: 1 };\n let child = {\n get b() {\n return parent.b;\n }\n };\n\n assert.equal(parent.b, 1, 'parent.b should be 1');\n assert.equal(child.b, 1, 'child.b should be 1');\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") should be 1');\n\n (0, _metal.watch)(child, 'b');\n\n assert.equal(parent.b, 1, 'parent.b should be 1 (after watch)');\n assert.equal(child.b, 1, 'child.b should be 1 (after watch)');\n\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") should be 1 (after watch)');\n }\n\n ['@test watch + set + no-descriptor'](assert) {\n let child = {};\n\n assert.equal(child.b, undefined, 'child.b ');\n assert.equal((0, _metal.get)(child, 'b'), undefined, 'get(child, \"b\")');\n\n (0, _metal.watch)(child, 'b');\n (0, _metal.set)(child, 'b', 1);\n\n assert.equal(child.b, 1, 'child.b (after watch)');\n assert.equal((0, _metal.get)(child, 'b'), 1, 'get(child, \"b\") (after watch)');\n }\n });\n});","enifed('@ember/-internals/routing/tests/ext/controller_test', ['@ember/-internals/owner', '@ember/controller', 'internal-test-helpers'], function (_owner, _controller, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/routing/ext/controller', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test transitionToRoute considers an engine's mountPoint\"](assert) {\n let router = {\n transitionTo(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let controller = _controller.default.create({ target: router });\n (0, _owner.setOwner)(controller, engineInstance);\n\n assert.strictEqual(controller.transitionToRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(controller.transitionToRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => controller.transitionToRoute('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(controller.transitionToRoute(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n [\"@test replaceRoute considers an engine's mountPoint\"](assert) {\n let router = {\n replaceWith(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let controller = _controller.default.create({ target: router });\n (0, _owner.setOwner)(controller, engineInstance);\n\n assert.strictEqual(controller.replaceRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(controller.replaceRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => controller.replaceRoute('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(controller.replaceRoute(queryParams), queryParams, 'passes query param only transitions through');\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/auto_location_test', ['@ember/-internals/owner', '@ember/polyfills', '@ember/-internals/browser-environment', '@ember/runloop', '@ember/-internals/metal', '@ember/-internals/routing/lib/location/auto_location', '@ember/-internals/routing/lib/location/history_location', '@ember/-internals/routing/lib/location/hash_location', '@ember/-internals/routing/lib/location/none_location', 'internal-test-helpers'], function (_owner, _polyfills, _browserEnvironment, _runloop, _metal, _auto_location, _history_location, _hash_location, _none_location, _internalTestHelpers) {\n 'use strict';\n\n function mockBrowserLocation(overrides, assert) {\n return (0, _polyfills.assign)({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n }, overrides);\n }\n\n function mockBrowserHistory(overrides, assert) {\n return (0, _polyfills.assign)({\n pushState() {\n assert.ok(false, 'history.pushState should not be called during testing');\n },\n replaceState() {\n assert.ok(false, 'history.replaceState should not be called during testing');\n }\n }, overrides);\n }\n\n function createLocation(location, history) {\n owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('location:history', _history_location.default);\n owner.register('location:hash', _hash_location.default);\n owner.register('location:none', _none_location.default);\n\n let autolocation = _auto_location.default.create({\n [_owner.OWNER]: owner,\n location: location,\n history: history,\n global: {}\n });\n\n return autolocation;\n }\n\n let location, owner;\n\n (0, _internalTestHelpers.moduleFor)('AutoLocation', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n if (owner) {\n (0, _runloop.run)(owner, 'destroy');\n owner = location = undefined;\n }\n }\n\n ['@test AutoLocation should have the `global`'](assert) {\n let location = _auto_location.default.create();\n\n assert.ok(location.global, 'has a global defined');\n assert.strictEqual(location.global, _browserEnvironment.window, 'has the environments window global');\n }\n\n [\"@test AutoLocation should return concrete implementation's value for `getURL`\"](assert) {\n let browserLocation = mockBrowserLocation({}, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n\n let concreteImplementation = (0, _metal.get)(location, 'concreteImplementation');\n\n concreteImplementation.getURL = function () {\n return '/lincoln/park';\n };\n\n assert.equal(location.getURL(), '/lincoln/park');\n }\n\n ['@test AutoLocation should use a HistoryLocation instance when pushStates is supported'](assert) {\n let browserLocation = mockBrowserLocation({}, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _history_location.default);\n }\n\n ['@test AutoLocation should use a HashLocation instance when pushStates are not supported, but hashchange events are and the URL is already in the HashLocation format'](assert) {\n let browserLocation = mockBrowserLocation({\n hash: '#/testd'\n }, assert);\n\n location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n };\n\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _hash_location.default);\n }\n\n ['@test AutoLocation should use a NoneLocation instance when neither history nor hashchange are supported.'](assert) {\n location = createLocation(mockBrowserLocation({}, assert));\n location.detect();\n\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _none_location.default);\n }\n\n [\"@test AutoLocation should use an index path (i.e. '/') without any location.hash as OK for HashLocation\"](assert) {\n let browserLocation = mockBrowserLocation({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called');\n }\n }, assert);\n\n location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n };\n\n location.detect();\n\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _hash_location.default, 'uses a HashLocation');\n }\n\n ['@test AutoLocation should transform the URL for hashchange-only browsers viewing a HistoryLocation-formatted path'](assert) {\n assert.expect(3);\n\n let browserLocation = mockBrowserLocation({\n hash: '',\n hostname: 'test.com',\n href: 'http://test.com/test',\n pathname: '/test',\n protocol: 'http:',\n port: '',\n search: '',\n replace(path) {\n assert.equal(path, 'http://test.com/#/test', 'location.replace should be called with normalized HashLocation path');\n }\n }, assert);\n\n let location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n };\n\n location.detect();\n\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _none_location.default, 'NoneLocation should be used while we attempt to location.replace()');\n assert.equal((0, _metal.get)(location, 'cancelRouterSetup'), true, 'cancelRouterSetup should be set so the router knows.');\n }\n\n ['@test AutoLocation should replace the URL for pushState-supported browsers viewing a HashLocation-formatted url'](assert) {\n assert.expect(2);\n let browserLocation = mockBrowserLocation({\n hash: '#/test',\n hostname: 'test.com',\n href: 'http://test.com/#/test',\n pathname: '/',\n protocol: 'http:',\n port: '',\n search: ''\n }, assert);\n\n let browserHistory = mockBrowserHistory({\n replaceState(state, title, path) {\n assert.equal(path, '/test', 'history.replaceState should be called with normalized HistoryLocation url');\n }\n }, assert);\n\n let location = createLocation(browserLocation, browserHistory);\n location.detect();\n\n assert.ok((0, _metal.get)(location, 'concreteImplementation'), _history_location.default);\n }\n\n ['@test AutoLocation requires any rootURL given to end in a trailing forward slash'](assert) {\n let browserLocation = mockBrowserLocation({}, assert);\n let expectedMsg = /rootURL must end with a trailing forward slash e.g. \"\\/app\\/\"/;\n\n location = createLocation(browserLocation);\n location.rootURL = 'app';\n\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n\n location.rootURL = '/app';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n\n // Note the trailing whitespace\n location.rootURL = '/app/ ';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n }\n\n ['@test AutoLocation provides its rootURL to the concreteImplementation'](assert) {\n let browserLocation = mockBrowserLocation({\n pathname: '/some/subdir/derp'\n }, assert);\n let browserHistory = mockBrowserHistory({}, assert);\n\n location = createLocation(browserLocation, browserHistory);\n location.rootURL = '/some/subdir/';\n\n location.detect();\n\n let concreteLocation = (0, _metal.get)(location, 'concreteImplementation');\n assert.equal(location.rootURL, concreteLocation.rootURL);\n }\n\n ['@test getHistoryPath() should return a normalized, HistoryLocation-supported path'](assert) {\n let browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/about?foo=bar#foo',\n pathname: '/app/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n\n assert.equal((0, _auto_location.getHistoryPath)('/app/', browserLocation), '/app/about?foo=bar#foo', 'URLs already in HistoryLocation form should come out the same');\n\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#/about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#/about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHistoryPath)('/app/', browserLocation), '/app/about?foo=bar#foo', 'HashLocation formed URLs should be normalized');\n\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHistoryPath)('/app', browserLocation), '/app/#about?foo=bar#foo', \"URLs with a hash not following #/ convention shouldn't be normalized as a route\");\n }\n\n ['@test getHashPath() should return a normalized, HashLocation-supported path'](assert) {\n let browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#/about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#/about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/about?foo=bar#foo', 'URLs already in HistoryLocation form should come out the same');\n\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/about?foo=bar#foo',\n pathname: '/app/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/about?foo=bar#foo', 'HistoryLocation formed URLs should be normalized');\n\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#about?foo=bar#foo'\n }, assert);\n\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/#about?foo=bar#foo', \"URLs with a hash not following #/ convention shouldn't be normalized as a route\");\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/hash_location_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/routing/lib/location/hash_location', 'internal-test-helpers'], function (_runloop, _metal, _hash_location, _internalTestHelpers) {\n 'use strict';\n\n let location;\n\n function createLocation(options, assert) {\n let HashTestLocation = _hash_location.default.extend({\n _location: {\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n }\n });\n\n if (!options) {\n options = {};\n }\n location = HashTestLocation.create(options);\n }\n\n function mockBrowserLocation(path) {\n // This is a neat trick to auto-magically extract the hostname from any\n // url by letting the browser do the work ;)\n let tmp = document.createElement('a');\n tmp.href = path;\n\n let protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n let pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n\n return {\n hash: tmp.hash,\n host: tmp.host || 'localhost',\n hostname: tmp.hostname || 'localhost',\n href: tmp.href,\n pathname: pathname,\n port: tmp.port || '',\n protocol: protocol,\n search: tmp.search\n };\n }\n\n function triggerHashchange() {\n var event = document.createEvent('HTMLEvents');\n event.initEvent('hashchange', true, false);\n window.dispatchEvent(event);\n }\n\n (0, _internalTestHelpers.moduleFor)('HashLocation', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _runloop.run)(function () {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test HashLocation.getURL() returns the current url'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#/foo/bar')\n }, assert);\n\n assert.equal(location.getURL(), '/foo/bar');\n }\n\n ['@test HashLocation.getURL() includes extra hashes'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#/foo#bar#car')\n }, assert);\n\n assert.equal(location.getURL(), '/foo#bar#car');\n }\n\n ['@test HashLocation.getURL() assumes location.hash without #/ prefix is not a route path'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#foo#bar')\n }, assert);\n\n assert.equal(location.getURL(), '/#foo#bar');\n }\n\n ['@test HashLocation.getURL() returns a normal forward slash when there is no location.hash'](assert) {\n createLocation({\n _location: mockBrowserLocation('/')\n }, assert);\n\n assert.equal(location.getURL(), '/');\n }\n\n ['@test HashLocation.setURL() correctly sets the url'](assert) {\n createLocation({}, assert);\n\n location.setURL('/bar');\n\n assert.equal((0, _metal.get)(location, 'location.hash'), '/bar');\n assert.equal((0, _metal.get)(location, 'lastSetURL'), '/bar');\n }\n\n ['@test HashLocation.replaceURL() correctly replaces to the path with a page reload'](assert) {\n assert.expect(2);\n\n createLocation({\n _location: {\n replace(path) {\n assert.equal(path, '#/foo');\n }\n }\n }, assert);\n\n location.replaceURL('/foo');\n\n assert.equal((0, _metal.get)(location, 'lastSetURL'), '/foo');\n }\n\n ['@test HashLocation.onUpdateURL callback executes as expected'](assert) {\n assert.expect(1);\n\n createLocation({\n _location: mockBrowserLocation('/#/foo/bar')\n }, assert);\n\n let callback = function (param) {\n assert.equal(param, '/foo/bar', 'path is passed as param');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n }\n\n [\"@test HashLocation.onUpdateURL doesn't execute callback if lastSetURL === path\"](assert) {\n assert.expect(0);\n\n createLocation({\n _location: {\n hash: '#/foo/bar'\n },\n lastSetURL: '/foo/bar'\n }, assert);\n\n let callback = function () {\n assert.ok(false, 'callback should not be called');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n }\n\n ['@test HashLocation.formatURL() prepends a # to the provided string'](assert) {\n createLocation({}, assert);\n\n assert.equal(location.formatURL('/foo#bar'), '#/foo#bar');\n }\n\n ['@test HashLocation.willDestroy() cleans up hashchange event listener'](assert) {\n assert.expect(1);\n\n createLocation({}, assert);\n\n let callback = function () {\n assert.ok(true, 'should invoke callback once');\n };\n\n location.onUpdateURL(callback);\n\n triggerHashchange();\n\n (0, _runloop.run)(location, 'destroy');\n location = null;\n\n triggerHashchange();\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/history_location_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/routing/lib/location/history_location', 'internal-test-helpers'], function (_runloop, _metal, _history_location, _internalTestHelpers) {\n 'use strict';\n\n let FakeHistory, HistoryTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\n }\n location = HistoryTestLocation.create(options);\n }\n\n function mockBrowserLocation(path) {\n // This is a neat trick to auto-magically extract the hostname from any\n // url by letting the browser do the work ;)\n let tmp = document.createElement('a');\n tmp.href = path;\n\n let protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n let pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n\n return {\n hash: tmp.hash,\n host: tmp.host || 'localhost',\n hostname: tmp.hostname || 'localhost',\n href: tmp.href,\n pathname: pathname,\n port: tmp.port || '',\n protocol: protocol,\n search: tmp.search\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('HistoryLocation', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n FakeHistory = {\n state: null,\n _states: [],\n replaceState(state) {\n this.state = state;\n this._states[0] = state;\n },\n pushState(state) {\n this.state = state;\n this._states.unshift(state);\n }\n };\n\n HistoryTestLocation = _history_location.default.extend({\n history: FakeHistory\n });\n }\n\n teardown() {\n (0, _runloop.run)(() => {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test HistoryLocation initState does not get fired on init'](assert) {\n assert.expect(1);\n\n HistoryTestLocation.reopen({\n init() {\n assert.ok(true, 'init was called');\n this._super(...arguments);\n },\n initState() {\n assert.ok(false, 'initState() should not be called automatically');\n }\n });\n\n createLocation();\n }\n\n [\"@test webkit doesn't fire popstate on page load\"](assert) {\n assert.expect(1);\n\n HistoryTestLocation.reopen({\n initState() {\n this._super(...arguments);\n // these two should be equal to be able\n // to successfully detect webkit initial popstate\n assert.equal(this._previousURL, this.getURL());\n }\n });\n\n createLocation();\n location.initState();\n }\n\n ['@test base URL is removed when retrieving the current pathname'](assert) {\n assert.expect(1);\n\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'baseURL', '/base/');\n },\n\n initState() {\n this._super(...arguments);\n\n assert.equal(this.getURL(), '/foo/bar');\n }\n });\n\n createLocation();\n location.initState();\n }\n\n ['@test base URL is preserved when moving around'](assert) {\n assert.expect(2);\n\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'baseURL', '/base/');\n }\n });\n\n createLocation();\n location.initState();\n location.setURL('/one/two');\n\n assert.equal(location._historyState.path, '/base/one/two');\n assert.ok(location._historyState.uuid);\n }\n\n ['@test setURL continues to set even with a null state (iframes may set this)'](assert) {\n createLocation();\n location.initState();\n\n FakeHistory.pushState(null);\n location.setURL('/three/four');\n\n assert.equal(location._historyState.path, '/three/four');\n assert.ok(location._historyState.uuid);\n }\n\n ['@test replaceURL continues to set even with a null state (iframes may set this)'](assert) {\n createLocation();\n location.initState();\n\n FakeHistory.pushState(null);\n location.replaceURL('/three/four');\n\n assert.equal(location._historyState.path, '/three/four');\n assert.ok(location._historyState.uuid);\n }\n\n ['@test HistoryLocation.getURL() returns the current url, excluding both rootURL and baseURL'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'rootURL', '/app/');\n (0, _metal.set)(this, 'baseURL', '/base/');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar');\n }\n\n ['@test HistoryLocation.getURL() returns the current url, does not remove rootURL if its not at start of url'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar/baz'));\n (0, _metal.set)(this, 'rootURL', '/bar/');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test HistoryLocation.getURL() will not remove the rootURL when only a partial match'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'rootURL', '/bar/');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/bars/baz');\n }\n\n ['@test HistoryLocation.getURL() returns the current url, does not remove baseURL if its not at start of url'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar/baz'));\n (0, _metal.set)(this, 'baseURL', '/bar/');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test HistoryLocation.getURL() will not remove the baseURL when only a partial match'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'baseURL', '/bar/');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/bars/baz');\n }\n\n ['@test HistoryLocation.getURL() includes location.search'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin'));\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar?time=morphin');\n }\n\n ['@test HistoryLocation.getURL() includes location.hash'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar#pink-power-ranger'));\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar#pink-power-ranger');\n }\n\n ['@test HistoryLocation.getURL() includes location.hash and location.search'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin#pink-power-ranger'));\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar?time=morphin#pink-power-ranger');\n }\n\n ['@test HistoryLocation.getURL() drops duplicate slashes'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n let location = mockBrowserLocation('//');\n location.pathname = '//'; // mockBrowserLocation does not allow for `//`, so force it\n (0, _metal.set)(this, 'location', location);\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/');\n }\n\n ['@test Existing state is preserved on init'](assert) {\n let existingState = {\n path: '/route/path',\n uuid: 'abcd'\n };\n\n FakeHistory.state = existingState;\n\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'location', mockBrowserLocation('/route/path'));\n }\n });\n\n createLocation();\n location.initState();\n assert.deepEqual(location.getState(), existingState);\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/none_location_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/routing/lib/location/none_location', 'internal-test-helpers'], function (_runloop, _metal, _none_location, _internalTestHelpers) {\n 'use strict';\n\n let NoneTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\n }\n location = NoneTestLocation.create(options);\n }\n\n (0, _internalTestHelpers.moduleFor)('NoneLocation', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n NoneTestLocation = _none_location.default.extend({});\n }\n\n teardown() {\n (0, _runloop.run)(() => {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test NoneLocation.formatURL() returns the current url always appending rootURL'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'rootURL', '/en/');\n }\n });\n\n createLocation();\n\n assert.equal(location.formatURL('/foo/bar'), '/en/foo/bar');\n }\n\n ['@test NoneLocation.getURL() returns the current path minus rootURL'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'rootURL', '/foo/');\n (0, _metal.set)(this, 'path', '/foo/bar');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/bar');\n }\n\n ['@test NoneLocation.getURL() will remove the rootURL only from the beginning of a url'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/foo/bar/baz');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test NoneLocation.getURL() will not remove the rootURL when only a partial match'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/bars/baz');\n }\n });\n\n createLocation();\n\n assert.equal(location.getURL(), '/bars/baz');\n }\n });\n});","enifed('@ember/-internals/routing/tests/location/util_test', ['@ember/polyfills', '@ember/-internals/routing/lib/location/util', 'internal-test-helpers'], function (_polyfills, _util, _internalTestHelpers) {\n 'use strict';\n\n function mockBrowserLocation(overrides, assert) {\n return (0, _polyfills.assign)({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n }, overrides);\n }\n\n (0, _internalTestHelpers.moduleFor)('Location Utilities', class extends _internalTestHelpers.AbstractTestCase {\n ['@test replacePath cannot be used to redirect to a different origin'](assert) {\n assert.expect(1);\n\n let expectedURL;\n\n let location = {\n protocol: 'http:',\n hostname: 'emberjs.com',\n port: '1337',\n\n replace(url) {\n assert.equal(url, expectedURL);\n }\n };\n\n expectedURL = 'http://emberjs.com:1337//google.com';\n (0, _util.replacePath)(location, '//google.com');\n }\n\n ['@test getPath() should normalize location.pathname, making sure it always returns a leading slash'](assert) {\n let location = mockBrowserLocation({ pathname: 'test' }, assert);\n assert.equal((0, _util.getPath)(location), '/test', 'When there is no leading slash, one is added.');\n\n location = mockBrowserLocation({ pathname: '/test' }, assert);\n assert.equal((0, _util.getPath)(location), '/test', \"When a leading slash is already there, it isn't added again\");\n }\n\n ['@test getQuery() should return location.search as-is'](assert) {\n let location = mockBrowserLocation({ search: '?foo=bar' }, assert);\n assert.equal((0, _util.getQuery)(location), '?foo=bar');\n }\n\n ['@test getFullPath() should return full pathname including query and hash'](assert) {\n let location = mockBrowserLocation({\n href: 'http://test.com/about?foo=bar#foo',\n pathname: '/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n\n assert.equal((0, _util.getFullPath)(location), '/about?foo=bar#foo');\n }\n\n ['@test Feature-Detecting onhashchange'](assert) {\n assert.equal((0, _util.supportsHashChange)(undefined, { onhashchange() {} }), true, 'When not in IE, use onhashchange existence as evidence of the feature');\n assert.equal((0, _util.supportsHashChange)(undefined, {}), false, 'When not in IE, use onhashchange absence as evidence of the feature absence');\n assert.equal((0, _util.supportsHashChange)(7, { onhashchange() {} }), false, 'When in IE7 compatibility mode, never report existence of the feature');\n assert.equal((0, _util.supportsHashChange)(8, { onhashchange() {} }), true, 'When in IE8+, use onhashchange existence as evidence of the feature');\n }\n\n ['@test Feature-detecting the history API'](assert) {\n assert.equal((0, _util.supportsHistory)('', { pushState: true }), true, 'returns true if not Android Gingerbread and history.pushState exists');\n assert.equal((0, _util.supportsHistory)('', {}), false, \"returns false if history.pushState doesn't exist\");\n assert.equal((0, _util.supportsHistory)('', undefined), false, \"returns false if history doesn't exist\");\n\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', { pushState: true }), false, 'returns false if Android 2.x stock browser (not Chrome) claiming to support pushState');\n\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-N7000 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', { pushState: true }), false, 'returns false for Android 4.0.x stock browser (not Chrome) claiming to support pushState');\n\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 20.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', { pushState: true }), true, 'returns true if Android version begins with 2, but is greater than 2');\n\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19', { pushState: true }), true, 'returns true for Chrome (not stock browser) on Android 4.0.x');\n\n // Windows Phone UA and History API: https://github.com/Modernizr/Modernizr/issues/1471\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537', { pushState: true }), true, 'returns true for Windows Phone 8.1 with misleading user agent string');\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/cache_test', ['@ember/-internals/routing/lib/system/cache', 'internal-test-helpers'], function (_cache, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('BucketCache', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n this.cache = new _cache.default();\n }\n\n ['@test has - returns false when bucket is not in cache'](assert) {\n assert.strictEqual(this.cache.has('foo'), false);\n assert.strictEqual(this.cache.has('constructor'), false);\n }\n\n ['@test has - returns true when bucket is in cache'](assert) {\n let token = {};\n\n this.cache.stash('foo', 'bar', token);\n this.cache.stash('constructor', 'bar', token);\n\n assert.strictEqual(this.cache.has('foo'), true);\n assert.strictEqual(this.cache.has('constructor'), true);\n }\n\n ['@test lookup - returns stashed value if key does exist in bucket'](assert) {\n let token = {};\n let defaultValue = {};\n\n this.cache.stash('foo', 'bar', token);\n\n assert.strictEqual(this.cache.lookup('foo', 'bar', defaultValue), token);\n }\n\n ['@test lookup - returns default value if key does not exist in bucket'](assert) {\n let token = {};\n let defaultValue = {};\n\n this.cache.stash('foo', 'bar', token);\n\n assert.strictEqual(this.cache.lookup('foo', 'boo', defaultValue), defaultValue);\n assert.strictEqual(this.cache.lookup('foo', 'constructor', defaultValue), defaultValue);\n }\n\n ['@test lookup - returns default value if bucket does not exist'](assert) {\n let defaultValue = {};\n\n assert.strictEqual(this.cache.lookup('boo', 'bar', defaultValue), defaultValue);\n assert.strictEqual(this.cache.lookup('constructor', 'bar', defaultValue), defaultValue);\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/controller_for_test', ['@ember/controller', '@ember/-internals/routing/lib/system/controller_for', '@ember/-internals/routing/lib/system/generate_controller', 'internal-test-helpers', '@ember/debug'], function (_controller, _controller_for, _generate_controller, _internalTestHelpers, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('controllerFor', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test controllerFor should lookup for registered controllers'](assert) {\n this.add('controller:app', _controller.default.extend());\n\n return this.visit('/').then(() => {\n let appInstance = this.applicationInstance;\n let appController = appInstance.lookup('controller:app');\n let controller = (0, _controller_for.default)(appInstance, 'app');\n assert.equal(appController, controller, 'should find app controller');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('generateController', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test generateController should return Controller'](assert) {\n return this.visit('/').then(() => {\n let controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n assert.ok(controller instanceof _controller.default, 'should return controller');\n });\n }\n\n ['@test generateController should return controller:basic if resolved'](assert) {\n let BasicController = _controller.default.extend();\n this.add('controller:basic', BasicController);\n\n return this.visit('/').then(() => {\n let controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n assert.ok(controller instanceof BasicController, 'should return controller');\n });\n }\n\n ['@test generateController should return controller:basic if registered'](assert) {\n let BasicController = _controller.default.extend();\n this.application.register('controller:basic', BasicController);\n\n return this.visit('/').then(() => {\n let controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n\n assert.ok(controller instanceof BasicController, 'should return base class of controller');\n });\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/dsl_test', ['@ember/-internals/owner', '@ember/-internals/routing/lib/system/router', 'internal-test-helpers'], function (_owner, _router, _internalTestHelpers) {\n 'use strict';\n\n let Router;\n\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n Router = _router.default.extend();\n }\n\n teardown() {\n Router = null;\n }\n\n ['@test should fail when using a reserved route name'](assert) {\n let reservedNames = ['basic', 'application'];\n\n assert.expect(reservedNames.length);\n\n reservedNames.forEach(reservedName => {\n expectAssertion(() => {\n Router = _router.default.extend();\n\n Router.map(function () {\n this.route(reservedName);\n });\n\n let router = Router.create();\n router._initRouterJs();\n }, \"'\" + reservedName + \"' cannot be used as a route name.\");\n });\n }\n\n ['@test [GH#16642] better error when using a colon in a route name']() {\n expectAssertion(() => {\n Router = _router.default.extend();\n\n Router.map(function () {\n this.route('resource/:id');\n });\n\n let router = Router.create();\n router._initRouterJs();\n }, \"'resource/:id' is not a valid route name. It cannot contain a ':'. You may want to use the 'path' option instead.\");\n }\n\n ['@test should retain resource namespace if nested with routes'](assert) {\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.route('blork');\n });\n });\n });\n\n let router = Router.create();\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop.blork'], 'parent name was used as base of nested routes');\n }\n\n ['@test should add loading and error routes if _isRouterMapResult is true'](assert) {\n Router.map(function () {\n this.route('blork');\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['blork'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blork_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blork_error'], 'error route was added');\n }\n\n ['@test should not add loading and error routes if _isRouterMapResult is false'](assert) {\n Router.map(function () {\n this.route('blork');\n });\n\n let router = Router.create();\n router._initRouterJs(false);\n\n assert.ok(router._routerMicrolib.recognizer.names['blork'], 'main route was created');\n assert.ok(!router._routerMicrolib.recognizer.names['blork_loading'], 'loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['blork_error'], 'error route was not added');\n }\n\n ['@test should reset namespace of loading and error routes for routes with resetNamespace'](assert) {\n Router.map(function () {\n this.route('blork', function () {\n this.route('blorp');\n this.route('bleep', { resetNamespace: true });\n });\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp'], 'nested route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp_loading'], 'nested loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp_error'], 'nested error route was added');\n\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'reset route was created');\n assert.ok(router._routerMicrolib.recognizer.names['bleep_loading'], 'reset loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['bleep_error'], 'reset error route was added');\n\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep'], 'nested reset route was not created');\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep_loading'], 'nested reset loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep_error'], 'nested reset error route was not added');\n }\n\n ['@test should throw an error when defining a route serializer outside an engine'](assert) {\n Router.map(function () {\n assert.throws(() => {\n this.route('posts', { serialize: function () {} });\n }, /Defining a route serializer on route 'posts' outside an Engine is not allowed/);\n });\n\n Router.create()._initRouterJs();\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL with engines', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n Router = _router.default.extend();\n }\n\n teardown() {\n Router = null;\n }\n\n ['@test should allow mounting of engines'](assert) {\n assert.expect(3);\n\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat');\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop.chat'], 'parent name was used as base of mounted engine');\n }\n\n ['@test should allow mounting of engines at a custom path'](assert) {\n assert.expect(1);\n\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', { path: 'custom-chat' });\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.deepEqual(router._routerMicrolib.recognizer.names['bleep.bloop.chat'].segments.slice(1, 4).map(s => s.value), ['bleep', 'bloop', 'custom-chat'], 'segments are properly associated with mounted engine');\n }\n\n ['@test should allow aliasing of engine names with `as`'](assert) {\n assert.expect(1);\n\n Router = Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', { as: 'blork' });\n });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.deepEqual(router._routerMicrolib.recognizer.names['bleep.bloop.blork'].segments.slice(1, 4).map(s => s.value), ['bleep', 'bloop', 'blork'], 'segments are properly associated with mounted engine with aliased name');\n }\n\n ['@test should add loading and error routes to a mount if _isRouterMapResult is true'](assert) {\n Router.map(function () {\n this.mount('chat');\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['chat'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['chat_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['chat_error'], 'error route was added');\n }\n\n ['@test should add loading and error routes to a mount alias if _isRouterMapResult is true'](assert) {\n Router.map(function () {\n this.mount('chat', { as: 'shoutbox' });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox_error'], 'error route was added');\n }\n\n ['@test should not add loading and error routes to a mount if _isRouterMapResult is false'](assert) {\n Router.map(function () {\n this.mount('chat');\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create();\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs(false);\n\n assert.ok(router._routerMicrolib.recognizer.names['chat'], 'main route was created');\n assert.ok(!router._routerMicrolib.recognizer.names['chat_loading'], 'loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['chat_error'], 'error route was not added');\n }\n\n ['@test should reset namespace of loading and error routes for mounts with resetNamespace'](assert) {\n Router.map(function () {\n this.route('news', function () {\n this.mount('chat');\n this.mount('blog', { resetNamespace: true });\n });\n });\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: { routable: true }\n });\n\n let router = Router.create({\n _hasModuleBasedResolver() {\n return true;\n }\n });\n (0, _owner.setOwner)(router, engineInstance);\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['news.chat'], 'nested route was created');\n assert.ok(router._routerMicrolib.recognizer.names['news.chat_loading'], 'nested loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['news.chat_error'], 'nested error route was added');\n\n assert.ok(router._routerMicrolib.recognizer.names['blog'], 'reset route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blog_loading'], 'reset loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blog_error'], 'reset error route was added');\n\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog'], 'nested reset route was not created');\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog_loading'], 'nested reset loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog_error'], 'nested reset error route was not added');\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/route_test', ['@ember/-internals/owner', 'internal-test-helpers', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/routing/lib/system/route'], function (_owner, _internalTestHelpers, _service, _runtime, _route) {\n 'use strict';\n\n let route, routeOne, routeTwo, lookupHash;\n\n (0, _internalTestHelpers.moduleFor)('Route', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n route = _route.default.create();\n }\n\n teardown() {\n super.teardown();\n (0, _internalTestHelpers.runDestroy)(route);\n route = routeOne = routeTwo = lookupHash = undefined;\n }\n\n ['@test default store utilizes the container to acquire the model factory'](assert) {\n assert.expect(4);\n\n let Post = _runtime.Object.extend();\n let post = {};\n\n Post.reopenClass({\n find() {\n return post;\n }\n });\n\n let ownerOptions = {\n ownerOptions: {\n hasRegistration() {\n return true;\n },\n factoryFor(fullName) {\n assert.equal(fullName, 'model:post', 'correct factory was looked up');\n\n return {\n class: Post,\n create() {\n return Post.create();\n }\n };\n }\n }\n };\n\n let owner = (0, _internalTestHelpers.buildOwner)(ownerOptions);\n (0, _owner.setOwner)(route, owner);\n\n route.set('_qp', null);\n\n assert.equal(route.model({ post_id: 1 }), post);\n assert.equal(route.findModel('post', 1), post, '#findModel returns the correct post');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test 'store' can be injected by data persistence frameworks\"](assert) {\n assert.expect(8);\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n let post = {\n id: 1\n };\n\n let Store = _runtime.Object.extend({\n find(type, value) {\n assert.ok(true, 'injected model was called');\n assert.equal(type, 'post', 'correct type was called');\n assert.equal(value, 1, 'correct value was called');\n return post;\n }\n });\n\n owner.register('route:index', _route.default);\n owner.register('store:main', Store);\n\n owner.inject('route', 'store', 'store:main');\n\n route = owner.lookup('route:index');\n\n assert.equal(route.model({ post_id: 1 }), post, '#model returns the correct post');\n assert.equal(route.findModel('post', 1), post, '#findModel returns the correct post');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test assert if 'store.find' method is not found\"]() {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n let Post = _runtime.Object.extend();\n\n owner.register('route:index', _route.default);\n owner.register('model:post', Post);\n\n route = owner.lookup('route:index');\n\n expectAssertion(function () {\n route.findModel('post', 1);\n }, 'Post has no method `find`.');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n ['@test asserts if model class is not found']() {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('route:index', _route.default);\n\n route = owner.lookup('route:index');\n\n expectAssertion(function () {\n route.model({ post_id: 1 });\n }, /You used the dynamic segment post_id in your route undefined, but .Post did not exist and you did not override your route\\'s `model` hook./);\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test 'store' does not need to be injected\"](assert) {\n (0, _internalTestHelpers.runDestroy)(route);\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('route:index', _route.default);\n\n route = owner.lookup('route:index');\n\n ignoreAssertion(function () {\n route.model({ post_id: 1 });\n });\n\n assert.ok(true, 'no error was raised');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the router\"](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n\n let foo = { name: 'foo' };\n\n let FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n\n assert.strictEqual(route.modelFor('foo'), foo);\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the routerMicrolib\"](assert) {\n let route = _route.default.create({\n _router: { _routerMicrolib: null }\n });\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n\n let foo = { name: 'foo' };\n\n let FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n\n assert.strictEqual(route.modelFor('foo'), foo);\n\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n ['@test .send just calls an action if the router is absent'](assert) {\n assert.expect(7);\n let route = _route.default.extend({\n actions: {\n returnsTrue(foo, bar) {\n assert.equal(foo, 1);\n assert.equal(bar, 2);\n assert.equal(this, route);\n return true;\n },\n\n returnsFalse() {\n assert.ok(true, 'returnsFalse was called');\n return false;\n }\n }\n }).create();\n\n assert.equal(route.send('returnsTrue', 1, 2), true);\n assert.equal(route.send('returnsFalse'), false);\n assert.equal(route.send('nonexistent', 1, 2, 3), undefined);\n\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test .send just calls an action if the routers internal router property is absent'](assert) {\n assert.expect(7);\n let route = _route.default.extend({\n router: {},\n actions: {\n returnsTrue(foo, bar) {\n assert.equal(foo, 1);\n assert.equal(bar, 2);\n assert.equal(this, route);\n return true;\n },\n\n returnsFalse() {\n assert.ok(true, 'returnsFalse was called');\n return false;\n }\n }\n }).create();\n\n assert.equal(true, route.send('returnsTrue', 1, 2));\n assert.equal(false, route.send('returnsFalse'));\n assert.equal(undefined, route.send('nonexistent', 1, 2, 3));\n\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test .send asserts if called on a destroyed route']() {\n route.routeName = 'rip-alley';\n (0, _internalTestHelpers.runDestroy)(route);\n\n expectAssertion(() => {\n route.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed route 'rip-alley'.\");\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Route serialize', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n route = _route.default.create();\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test returns the models properties if params does not include *_id'](assert) {\n let model = { id: 2, firstName: 'Ned', lastName: 'Ryerson' };\n\n assert.deepEqual(route.serialize(model, ['firstName', 'lastName']), { firstName: 'Ned', lastName: 'Ryerson' }, 'serialized correctly');\n }\n\n ['@test returns model.id if params include *_id'](assert) {\n let model = { id: 2 };\n\n assert.deepEqual(route.serialize(model, ['post_id']), { post_id: 2 }, 'serialized correctly');\n }\n\n ['@test returns checks for existence of model.post_id before trying model.id'](assert) {\n let model = { post_id: 3 };\n\n assert.deepEqual(route.serialize(model, ['post_id']), { post_id: 3 }, 'serialized correctly');\n }\n\n ['@test returns undefined if model is not set'](assert) {\n assert.equal(route.serialize(undefined, ['post_id']), undefined, 'serialized correctly');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Route interaction', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n let owner = {\n lookup(fullName) {\n return lookupHash[fullName];\n }\n };\n\n routeOne = _route.default.create({ routeName: 'one' });\n routeTwo = _route.default.create({ routeName: 'two' });\n\n (0, _owner.setOwner)(routeOne, owner);\n (0, _owner.setOwner)(routeTwo, owner);\n\n lookupHash = {\n 'route:one': routeOne,\n 'route:two': routeTwo\n };\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(routeOne);\n (0, _internalTestHelpers.runDestroy)(routeTwo);\n }\n\n ['@test route._qp does not crash if the controller has no QP, or setProperties'](assert) {\n lookupHash['controller:test'] = {};\n\n routeOne.controllerName = 'test';\n let qp = routeOne.get('_qp');\n\n assert.deepEqual(qp.map, {}, 'map should be empty');\n assert.deepEqual(qp.propertyNames, [], 'property names should be empty');\n assert.deepEqual(qp.qps, [], 'qps is should be empty');\n }\n\n [\"@test controllerFor uses route's controllerName if specified\"](assert) {\n let testController = {};\n lookupHash['controller:test'] = testController;\n\n routeOne.controllerName = 'test';\n\n assert.equal(routeTwo.controllerFor('one'), testController);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Route injected properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test services can be injected into routes'](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('route:application', _route.default.extend({\n authService: (0, _service.inject)('auth')\n }));\n\n owner.register('service:auth', _service.default.extend());\n\n let appRoute = owner.lookup('route:application');\n let authService = owner.lookup('service:auth');\n\n assert.equal(authService, appRoute.get('authService'), 'service.auth is injected');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Route with engines', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test paramsFor considers an engine's mountPoint\"](assert) {\n let router = {\n _deserializeQueryParams() {},\n _routerMicrolib: {\n state: {\n routeInfos: [{ name: 'posts' }],\n params: {\n 'foo.bar': { a: 'b' },\n 'foo.bar.posts': { c: 'd' }\n }\n }\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n\n mountPoint: 'foo.bar',\n\n lookup(name) {\n if (name === 'route:posts') {\n return postsRoute;\n } else if (name === 'route:application') {\n return applicationRoute;\n }\n }\n }\n });\n\n let applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application',\n fullRouteName: 'foo.bar'\n });\n let postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts',\n fullRouteName: 'foo.bar.posts'\n });\n let route = _route.default.create({ _router: router });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.deepEqual(route.paramsFor('application'), { a: 'b' }, 'params match for root `application` route in engine');\n assert.deepEqual(route.paramsFor('posts'), { c: 'd' }, 'params match for `posts` route in engine');\n }\n\n [\"@test modelFor considers an engine's mountPoint\"](assert) {\n let applicationModel = { id: '1' };\n let postsModel = { id: '2' };\n\n let router = {\n _routerMicrolib: {\n activeTransition: {\n resolvedModels: {\n 'foo.bar': applicationModel,\n 'foo.bar.posts': postsModel\n }\n }\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n\n mountPoint: 'foo.bar',\n\n lookup(name) {\n if (name === 'route:posts') {\n return postsRoute;\n } else if (name === 'route:application') {\n return applicationRoute;\n }\n }\n }\n });\n\n let applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application'\n });\n let postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts'\n });\n let route = _route.default.create({ _router: router });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.strictEqual(route.modelFor('application'), applicationModel);\n assert.strictEqual(route.modelFor('posts'), postsModel);\n }\n\n [\"@test transitionTo considers an engine's mountPoint\"](assert) {\n let router = {\n transitionTo(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.strictEqual(route.transitionTo('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(route.transitionTo('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => route.transitionTo('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(route.transitionTo(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n [\"@test intermediateTransitionTo considers an engine's mountPoint\"](assert) {\n let lastRoute;\n let router = {\n intermediateTransitionTo(route) {\n lastRoute = route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n route.intermediateTransitionTo('application');\n assert.strictEqual(lastRoute, 'foo.bar.application', 'properly prefixes application route');\n\n route.intermediateTransitionTo('posts');\n assert.strictEqual(lastRoute, 'foo.bar.posts', 'properly prefixes child routes');\n\n assert.throws(() => route.intermediateTransitionTo('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n route.intermediateTransitionTo(queryParams);\n assert.strictEqual(lastRoute, queryParams, 'passes query param only transitions through');\n }\n\n [\"@test replaceWith considers an engine's mountPoint\"](assert) {\n let router = {\n replaceWith(route) {\n return route;\n }\n };\n\n let engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n let route = _route.default.create({ _router: router });\n (0, _owner.setOwner)(route, engineInstance);\n\n assert.strictEqual(route.replaceWith('application'), 'foo.bar.application', 'properly prefixes application route');\n assert.strictEqual(route.replaceWith('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => route.replaceWith('/posts'), 'throws when trying to use a url');\n\n let queryParams = {};\n assert.strictEqual(route.replaceWith(queryParams), queryParams, 'passes query param only transitions through');\n }\n\n ['@test `router` is a deprecated one-way alias to `_router`'](assert) {\n let router = {};\n let route = _route.default.create({ _router: router });\n expectDeprecation(function () {\n return assert.equal(route.router, router);\n }, 'Route#router is an intimate API that has been renamed to Route#_router. However you might want to consider using the router service');\n }\n });\n});","enifed('@ember/-internals/routing/tests/system/router_test', ['@ember/-internals/owner', '@ember/-internals/routing/lib/location/hash_location', '@ember/-internals/routing/lib/location/history_location', '@ember/-internals/routing/lib/location/auto_location', '@ember/-internals/routing/lib/location/none_location', '@ember/-internals/routing/lib/system/router', 'internal-test-helpers'], function (_owner, _hash_location, _history_location, _auto_location, _none_location, _router, _internalTestHelpers) {\n 'use strict';\n\n let owner;\n\n function createRouter(settings, options = {}) {\n let CustomRouter = _router.default.extend();\n let router = CustomRouter.create(settings);\n\n if (!options.skipOwner) {\n (0, _owner.setOwner)(router, owner);\n }\n\n if (!options.disableSetup) {\n router.setupRouter();\n }\n\n return router;\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember Router', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n owner = (0, _internalTestHelpers.buildOwner)();\n\n //register the HashLocation (the default)\n owner.register('location:hash', _hash_location.default);\n owner.register('location:history', _history_location.default);\n owner.register('location:auto', _auto_location.default);\n owner.register('location:none', _none_location.default);\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(owner);\n owner = null;\n }\n\n ['@test can create a router without an owner'](assert) {\n createRouter(undefined, { disableSetup: true, skipOwner: true });\n\n assert.ok(true, 'no errors were thrown when creating without a container');\n }\n\n ['@test [GH#15237] EmberError is imported correctly'](assert) {\n // If we get the right message it means Error is being imported correctly.\n assert.throws(function () {\n (0, _router.triggerEvent)(null, false, []);\n }, /because your app hasn't finished transitioning/);\n }\n\n ['@test should not create a router.js instance upon init'](assert) {\n let router = createRouter(undefined, { disableSetup: true });\n\n assert.ok(!router._routerMicrolib);\n }\n\n ['@test should not reify location until setupRouter is called'](assert) {\n let router = createRouter(undefined, { disableSetup: true });\n assert.equal(typeof router.location, 'string', 'location is specified as a string');\n\n router.setupRouter();\n\n assert.equal(typeof router.location, 'object', 'location is reified into an object');\n }\n\n ['@test should destroy its location upon destroying the routers owner.'](assert) {\n let router = createRouter();\n let location = router.get('location');\n\n (0, _internalTestHelpers.runDestroy)(owner);\n\n assert.ok(location.isDestroyed, 'location should be destroyed');\n }\n\n ['@test should instantiate its location with its `rootURL`'](assert) {\n let router = createRouter({\n rootURL: '/rootdir/'\n });\n let location = router.get('location');\n\n assert.equal(location.get('rootURL'), '/rootdir/');\n }\n\n ['@test replacePath should be called with the right path'](assert) {\n assert.expect(1);\n\n let location = owner.lookup('location:auto');\n\n let browserLocation = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n };\n\n location.location = browserLocation;\n location.global = { onhashchange() {} };\n location.history = null;\n\n createRouter({\n location: 'auto',\n rootURL: '/rootdir/'\n });\n }\n\n ['@test Router._routePath should consume identical prefixes'](assert) {\n createRouter();\n\n function routePath() {\n let routeInfos = Array.prototype.slice.call(arguments).map(function (s) {\n return { name: s };\n });\n routeInfos.unshift({ name: 'ignored' });\n\n return _router.default._routePath(routeInfos);\n }\n\n assert.equal(routePath('foo'), 'foo');\n assert.equal(routePath('foo', 'bar', 'baz'), 'foo.bar.baz');\n assert.equal(routePath('foo', 'foo.bar'), 'foo.bar');\n assert.equal(routePath('foo', 'foo.bar', 'foo.bar.baz'), 'foo.bar.baz');\n assert.equal(routePath('foo', 'foo.bar', 'foo.bar.baz.wow'), 'foo.bar.baz.wow');\n assert.equal(routePath('foo', 'foo.bar.baz.wow'), 'foo.bar.baz.wow');\n assert.equal(routePath('foo.bar', 'bar.baz.wow'), 'foo.bar.baz.wow');\n\n // This makes no sense, not trying to handle it, just\n // making sure it doesn't go boom.\n assert.equal(routePath('foo.bar.baz', 'foo'), 'foo.bar.baz.foo');\n }\n\n ['@test Router should cancel routing setup when the Location class says so via cancelRouterSetup'](assert) {\n assert.expect(0);\n\n let router;\n let FakeLocation = {\n cancelRouterSetup: true,\n create() {\n return this;\n }\n };\n\n owner.register('location:fake', FakeLocation);\n\n router = createRouter({\n location: 'fake',\n\n _setupRouter() {\n assert.ok(false, '_setupRouter should not be called');\n }\n });\n\n router.startRouting();\n }\n\n [\"@test AutoLocation should replace the url when it's not in the preferred format\"](assert) {\n assert.expect(1);\n\n let location = owner.lookup('location:auto');\n\n location.location = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n };\n location.history = null;\n location.global = {\n onhashchange() {}\n };\n\n createRouter({\n location: 'auto',\n rootURL: '/rootdir/'\n });\n }\n\n ['@test Router#handleURL should remove any #hashes before doing URL transition'](assert) {\n assert.expect(2);\n\n let router = createRouter({\n _doURLTransition(routerJsMethod, url) {\n assert.equal(routerJsMethod, 'handleURL');\n assert.equal(url, '/foo/bar?time=morphin');\n }\n });\n\n router.handleURL('/foo/bar?time=morphin#pink-power-ranger');\n }\n\n ['@test Router#triggerEvent allows actions to bubble when returning true'](assert) {\n assert.expect(2);\n\n let routeInfos = [{\n name: 'application',\n route: {\n actions: {\n loading() {\n assert.ok(false, 'loading not handled by application route');\n }\n }\n }\n }, {\n name: 'about',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about route');\n return false;\n }\n }\n }\n }, {\n name: 'about.me',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about.me route');\n return true;\n }\n }\n }\n }];\n\n (0, _router.triggerEvent)(routeInfos, false, ['loading']);\n }\n\n ['@test Router#triggerEvent ignores handlers that have not loaded yet'](assert) {\n assert.expect(1);\n\n let routeInfos = [{\n name: 'about',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about route');\n }\n }\n }\n }, {\n name: 'about.me',\n route: undefined\n }];\n\n (0, _router.triggerEvent)(routeInfos, false, ['loading']);\n }\n\n ['@test transitionTo should throw an error when called after owner is destroyed']() {\n let router = createRouter();\n\n (0, _internalTestHelpers.runDestroy)(router);\n\n router.currentRouteName = 'route-a';\n\n expectAssertion(function () {\n router.transitionTo('route-b');\n }, \"A transition was attempted from 'route-a' to 'route-b' but the application instance has already been destroyed.\");\n\n expectAssertion(function () {\n router.transitionTo('./route-b/1');\n }, \"A transition was attempted from 'route-a' to './route-b/1' but the application instance has already been destroyed.\");\n }\n });\n});","enifed('@ember/-internals/routing/tests/utils_test', ['@ember/-internals/routing/lib/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Routing query parameter utils - normalizeControllerQueryParams', class extends _internalTestHelpers.AbstractTestCase {\n ['@test converts array style into verbose object style'](assert) {\n let paramName = 'foo';\n let params = [paramName];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\n assert.ok(normalized[paramName], 'turns the query param name into key');\n assert.equal(normalized[paramName].as, null, \"includes a blank alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n\n [\"@test converts object style [{foo: 'an_alias'}]\"](assert) {\n let paramName = 'foo';\n let params = [{ foo: 'an_alias' }];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\n assert.ok(normalized[paramName], 'retains the query param name as key');\n assert.equal(normalized[paramName].as, 'an_alias', \"includes the provided alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n\n [\"@test retains maximally verbose object style [{foo: {as: 'foo'}}]\"](assert) {\n let paramName = 'foo';\n let params = [{ foo: { as: 'an_alias' } }];\n let normalized = (0, _utils.normalizeControllerQueryParams)(params);\n\n assert.ok(normalized[paramName], 'retains the query param name as key');\n assert.equal(normalized[paramName].as, 'an_alias', \"includes the provided alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/array/any-test', ['@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_array, _internalTestHelpers, _array2) {\n 'use strict';\n\n class AnyTests extends _internalTestHelpers.AbstractTestCase {\n '@test any should should invoke callback on each item as long as you return false'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\n result = obj.any(function (i) {\n found.push(i);\n return false;\n });\n\n this.assert.equal(result, false, 'return value of obj.any');\n this.assert.deepEqual(found, ary, 'items passed during any() should match');\n }\n\n '@test any should stop invoking when you return true'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\n result = obj.any(function (i) {\n found.push(i);\n return --cnt <= 0;\n });\n this.assert.equal(result, true, 'return value of obj.any');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during any() should match');\n }\n\n '@test any should return true if any object matches the callback'() {\n let obj = (0, _array.A)([0, 1, 2]);\n let result;\n\n result = obj.any(i => !!i);\n this.assert.equal(result, true, 'return value of obj.any');\n }\n\n '@test any should produce correct results even if the matching element is undefined'(assert) {\n let obj = (0, _array.A)([undefined]);\n let result;\n\n result = obj.any(() => true);\n assert.equal(result, true, 'return value of obj.any');\n }\n }\n\n (0, _array2.runArrayTests)('any', AnyTests);\n});","enifed('@ember/-internals/runtime/tests/array/compact-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class CompactTests extends _internalTestHelpers.AbstractTestCase {\n '@test removes null and undefined values from enumerable'() {\n let obj = this.newObject([null, 1, false, '', undefined, 0, null]);\n let ary = obj.compact();\n this.assert.deepEqual(ary, [1, false, '', 0]);\n }\n }\n\n (0, _array.runArrayTests)('compact', CompactTests);\n});","enifed('@ember/-internals/runtime/tests/array/every-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/runtime/lib/system/object'], function (_internalTestHelpers, _array, _object) {\n 'use strict';\n\n class EveryTest extends _internalTestHelpers.AbstractTestCase {\n '@test every should should invoke callback on each item as long as you return true'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\n result = obj.every(function (i) {\n found.push(i);\n return true;\n });\n this.assert.equal(result, true, 'return value of obj.every');\n this.assert.deepEqual(found, ary, 'items passed during every() should match');\n }\n\n '@test every should stop invoking when you return false'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\n result = obj.every(function (i) {\n found.push(i);\n return --cnt > 0;\n });\n this.assert.equal(result, false, 'return value of obj.every');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during every() should match');\n }\n }\n\n class IsEveryTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return true of every property matches'() {\n let obj = this.newObject([{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })]);\n\n this.assert.equal(obj.isEvery('foo', 'foo'), true, 'isEvery(foo)');\n this.assert.equal(obj.isEvery('bar', 'bar'), false, 'isEvery(bar)');\n }\n\n '@test should return true of every property is true'() {\n let obj = this.newObject([{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })]);\n\n // different values - all eval to true\n this.assert.equal(obj.isEvery('foo'), true, 'isEvery(foo)');\n this.assert.equal(obj.isEvery('bar'), false, 'isEvery(bar)');\n }\n\n '@test should return true if every property matches null'() {\n let obj = this.newObject([{ foo: null, bar: 'BAZ' }, _object.default.create({ foo: null, bar: null })]);\n\n this.assert.equal(obj.isEvery('foo', null), true, \"isEvery('foo', null)\");\n this.assert.equal(obj.isEvery('bar', null), false, \"isEvery('bar', null)\");\n }\n\n '@test should return true if every property is undefined'() {\n let obj = this.newObject([{ foo: undefined, bar: 'BAZ' }, _object.default.create({ bar: undefined })]);\n\n this.assert.equal(obj.isEvery('foo', undefined), true, \"isEvery('foo', undefined)\");\n this.assert.equal(obj.isEvery('bar', undefined), false, \"isEvery('bar', undefined)\");\n }\n }\n\n (0, _array.runArrayTests)('every', EveryTest);\n (0, _array.runArrayTests)('isEvery', IsEveryTest);\n});","enifed('@ember/-internals/runtime/tests/array/filter-test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_object, _internalTestHelpers, _array) {\n 'use strict';\n\n class FilterTest extends _internalTestHelpers.AbstractTestCase {\n '@test filter should invoke on each item'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let found = [];\n let result;\n\n // return true on all but the last two\n result = obj.filter(function (i) {\n found.push(i);\n return --cnt >= 0;\n });\n this.assert.deepEqual(found, ary, 'should have invoked on each item');\n this.assert.deepEqual(result, ary.slice(0, -2), 'filtered array should exclude items');\n }\n }\n\n class FilterByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should filter based on object'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', 'foo'), ary, 'filterBy(foo)');\n this.assert.deepEqual(obj.filterBy('bar', 'bar'), [ary[1]], 'filterBy(bar)');\n }\n\n '@test should include in result if property is true'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })];\n\n obj = this.newObject(ary);\n\n // different values - all eval to true\n this.assert.deepEqual(obj.filterBy('foo'), ary, 'filterBy(foo)');\n this.assert.deepEqual(obj.filterBy('bar'), [ary[0]], 'filterBy(bar)');\n }\n\n '@test should filter on second argument if provided'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 }), { name: 'obj3', foo: 2 }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', 3), [ary[0], ary[3]], \"filterBy('foo', 3)')\");\n }\n\n '@test should correctly filter null second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: null }), { name: 'obj3', foo: null }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', null), [ary[1], ary[2]], \"filterBy('foo', 3)')\");\n }\n\n '@test should not return all objects on undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', undefined), [], \"filterBy('foo', 3)')\");\n }\n\n '@test should correctly filter explicit undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo', undefined), ary.slice(2), \"filterBy('foo', 3)')\");\n }\n\n '@test should not match undefined properties without second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.filterBy('foo'), ary.slice(0, 2), \"filterBy('foo', 3)')\");\n }\n }\n\n (0, _array.runArrayTests)('filter', FilterTest);\n (0, _array.runArrayTests)('filter', FilterByTest);\n});","enifed('@ember/-internals/runtime/tests/array/find-test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_object, _internalTestHelpers, _array) {\n 'use strict';\n\n class FindTests extends _internalTestHelpers.AbstractTestCase {\n '@test find should invoke callback on each item as long as you return false'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n let result;\n\n result = obj.find(function (i) {\n found.push(i);\n return false;\n });\n this.assert.equal(result, undefined, 'return value of obj.find');\n this.assert.deepEqual(found, ary, 'items passed during find() should match');\n }\n\n '@test every should stop invoking when you return true'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let cnt = ary.length - 2;\n let exp = cnt;\n let found = [];\n let result;\n\n result = obj.find(function (i) {\n found.push(i);\n return --cnt >= 0;\n });\n this.assert.equal(result, ary[exp - 1], 'return value of obj.find');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during find() should match');\n }\n }\n\n class FindByTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return first object of property matches'() {\n let ary, obj;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\n this.assert.equal(obj.findBy('foo', 'foo'), ary[0], 'findBy(foo)');\n this.assert.equal(obj.findBy('bar', 'bar'), ary[1], 'findBy(bar)');\n }\n\n '@test should return first object with truthy prop'() {\n let ary, obj;\n\n ary = [{ foo: 'foo', bar: false }, _object.default.create({ foo: 'bar', bar: true })];\n\n obj = this.newObject(ary);\n\n // different values - all eval to true\n this.assert.equal(obj.findBy('foo'), ary[0], 'findBy(foo)');\n this.assert.equal(obj.findBy('bar'), ary[1], 'findBy(bar)');\n }\n\n '@test should return first null property match'() {\n let ary, obj;\n\n ary = [{ foo: null, bar: 'BAZ' }, _object.default.create({ foo: null, bar: null })];\n\n obj = this.newObject(ary);\n\n this.assert.equal(obj.findBy('foo', null), ary[0], \"findBy('foo', null)\");\n this.assert.equal(obj.findBy('bar', null), ary[1], \"findBy('bar', null)\");\n }\n\n '@test should return first undefined property match'() {\n let ary, obj;\n\n ary = [{ foo: undefined, bar: 'BAZ' }, _object.default.create({})];\n\n obj = this.newObject(ary);\n\n this.assert.equal(obj.findBy('foo', undefined), ary[0], \"findBy('foo', undefined)\");\n this.assert.equal(obj.findBy('bar', undefined), ary[1], \"findBy('bar', undefined)\");\n }\n }\n\n (0, _array.runArrayTests)('find', FindTests);\n (0, _array.runArrayTests)('findBy', FindByTests);\n});","enifed('@ember/-internals/runtime/tests/array/firstObject-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class FirstObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns first item in enumerable'() {\n let obj = this.newObject();\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), this.toArray(obj)[0]);\n }\n\n '@test returns undefined if enumerable is empty'() {\n let obj = this.newObject([]);\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), undefined);\n }\n\n '@test can not be set'() {\n let obj = this.newObject([]);\n\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), this.toArray(obj)[0]);\n\n this.assert.throws(() => {\n (0, _metal.set)(obj, 'firstObject', 'foo!');\n }, /Cannot set read-only property \"firstObject\" on object/);\n }\n }\n\n (0, _array.runArrayTests)('firstObject', FirstObjectTests);\n});","enifed('@ember/-internals/runtime/tests/array/forEach-test', ['@ember/-internals/utils', '@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_utils, _metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class ForEachTests extends _internalTestHelpers.AbstractTestCase {\n '@test forEach should iterate over list'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test forEach should iterate over list after mutation'() {\n if ((0, _metal.get)(this, 'canTestMutation')) {\n this.assert.expect(0);\n return;\n }\n\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let found = [];\n\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n\n this.mutate(obj);\n ary = this.toArray(obj);\n found = [];\n\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test 2nd target parameter'() {\n let obj = this.newObject();\n let target = this;\n\n obj.forEach(() => {\n // ES6TODO: When transpiled we will end up with \"use strict\" which disables automatically binding to the global context.\n // Therefore, the following test can never pass in strict mode unless we modify the `map` function implementation to\n // use `Ember.lookup` if target is not specified.\n //\n // equal(guidFor(this), guidFor(global), 'should pass the global object as this if no context');\n });\n\n obj.forEach(() => {\n this.assert.equal((0, _utils.guidFor)(this), (0, _utils.guidFor)(target), 'should pass target as this if context');\n }, target);\n }\n\n '@test callback params'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let loc = 0;\n\n obj.forEach((item, idx, enumerable) => {\n this.assert.equal(item, ary[loc], 'item param');\n this.assert.equal(idx, loc, 'idx param');\n this.assert.equal((0, _utils.guidFor)(enumerable), (0, _utils.guidFor)(obj), 'enumerable param');\n loc++;\n });\n }\n }\n\n (0, _array.runArrayTests)('forEach', ForEachTests);\n});","enifed('@ember/-internals/runtime/tests/array/includes-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class IncludesTests extends _internalTestHelpers.AbstractTestCase {\n '@test includes returns correct value if startAt is positive'() {\n let data = (0, _array.newFixture)(3);\n let obj = this.newObject(data);\n\n this.assert.equal(obj.includes(data[1], 1), true, 'should return true if included');\n this.assert.equal(obj.includes(data[0], 1), false, 'should return false if not included');\n }\n\n '@test includes returns correct value if startAt is negative'() {\n let data = (0, _array.newFixture)(3);\n let obj = this.newObject(data);\n\n this.assert.equal(obj.includes(data[1], -2), true, 'should return true if included');\n this.assert.equal(obj.includes(data[0], -2), false, 'should return false if not included');\n }\n\n '@test includes returns true if startAt + length is still negative'() {\n let data = (0, _array.newFixture)(1);\n let obj = this.newObject(data);\n\n this.assert.equal(obj.includes(data[0], -2), true, 'should return true if included');\n this.assert.equal(obj.includes((0, _array.newFixture)(1), -2), false, 'should return false if not included');\n }\n\n '@test includes returns false if startAt out of bounds'() {\n let data = (0, _array.newFixture)(1);\n let obj = this.newObject(data);\n\n this.assert.equal(obj.includes(data[0], 2), false, 'should return false if startAt >= length');\n this.assert.equal(obj.includes((0, _array.newFixture)(1), 2), false, 'should return false if startAt >= length');\n }\n }\n\n (0, _array.runArrayTests)('includes', IncludesTests);\n});","enifed('@ember/-internals/runtime/tests/array/indexOf-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class IndexOfTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return index of object'() {\n let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let idx = 0; idx < len; idx++) {\n this.assert.equal(obj.indexOf(expected[idx]), idx, `obj.indexOf(${expected[idx]}) should match idx`);\n }\n }\n\n '@test should return -1 when requesting object not in index'() {\n let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.indexOf(foo), -1, 'obj.indexOf(foo) should be < 0');\n }\n }\n\n (0, _array.runArrayTests)('indexOf', IndexOfTests);\n});","enifed('@ember/-internals/runtime/tests/array/invoke-test', ['@ember/-internals/runtime/index', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_index, _internalTestHelpers, _array) {\n 'use strict';\n\n class InvokeTests extends _internalTestHelpers.AbstractTestCase {\n '@test invoke should call on each object that implements'() {\n let cnt, ary, obj;\n\n function F(amt) {\n cnt += amt === undefined ? 1 : amt;\n }\n cnt = 0;\n ary = [{ foo: F }, _index.Object.create({ foo: F }),\n\n // NOTE: does not impl foo - invoke should just skip\n _index.Object.create({ bar: F }), { foo: F }];\n\n obj = this.newObject(ary);\n obj.invoke('foo');\n this.assert.equal(cnt, 3, 'should have invoked 3 times');\n\n cnt = 0;\n obj.invoke('foo', 2);\n this.assert.equal(cnt, 6, 'should have invoked 3 times, passing param');\n }\n\n '@test invoke should return an array containing the results of each invoked method'(assert) {\n let obj = this.newObject([{\n foo() {\n return 'one';\n }\n }, {}, // intentionally not including `foo` method\n {\n foo() {\n return 'two';\n }\n }]);\n\n let result = obj.invoke('foo');\n assert.deepEqual(result, ['one', undefined, 'two']);\n }\n\n '@test invoke should return an extended array (aka Ember.A)'(assert) {\n let obj = this.newObject([{ foo() {} }, { foo() {} }]);\n\n let result = obj.invoke('foo');\n\n assert.ok(_index.NativeArray.detect(result), 'NativeArray has been applied');\n }\n }\n\n (0, _array.runArrayTests)('invoke', InvokeTests);\n});","enifed('@ember/-internals/runtime/tests/array/isAny-test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_object, _internalTestHelpers, _array) {\n 'use strict';\n\n class IsAnyTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return true of any property matches'() {\n let obj = this.newObject([{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })]);\n\n this.assert.equal(obj.isAny('foo', 'foo'), true, 'isAny(foo)');\n this.assert.equal(obj.isAny('bar', 'bar'), true, 'isAny(bar)');\n this.assert.equal(obj.isAny('bar', 'BIFF'), false, 'isAny(BIFF)');\n }\n\n '@test should return true of any property is true'() {\n let obj = this.newObject([{ foo: 'foo', bar: true }, _object.default.create({ foo: 'bar', bar: false })]);\n\n // different values - all eval to true\n this.assert.equal(obj.isAny('foo'), true, 'isAny(foo)');\n this.assert.equal(obj.isAny('bar'), true, 'isAny(bar)');\n this.assert.equal(obj.isAny('BIFF'), false, 'isAny(biff)');\n }\n\n '@test should return true if any property matches null'() {\n let obj = this.newObject([{ foo: null, bar: 'bar' }, _object.default.create({ foo: 'foo', bar: null })]);\n\n this.assert.equal(obj.isAny('foo', null), true, \"isAny('foo', null)\");\n this.assert.equal(obj.isAny('bar', null), true, \"isAny('bar', null)\");\n }\n\n '@test should return true if any property is undefined'() {\n let obj = this.newObject([{ foo: undefined, bar: 'bar' }, _object.default.create({ foo: 'foo' })]);\n\n this.assert.equal(obj.isAny('foo', undefined), true, \"isAny('foo', undefined)\");\n this.assert.equal(obj.isAny('bar', undefined), true, \"isAny('bar', undefined)\");\n }\n\n '@test should not match undefined properties without second argument'() {\n let obj = this.newObject([{ foo: undefined }, _object.default.create({})]);\n\n this.assert.equal(obj.isAny('foo'), false, \"isAny('foo', undefined)\");\n }\n }\n\n (0, _array.runArrayTests)('isAny', IsAnyTests);\n});","enifed('@ember/-internals/runtime/tests/array/lastIndexOf-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class LastIndexOfTests extends _internalTestHelpers.AbstractTestCase {\n \"@test should return index of object's last occurrence\"() {\n let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx]), idx, `obj.lastIndexOf(${expected[idx]}) should match idx`);\n }\n }\n\n \"@test should return index of object's last occurrence even startAt search location is equal to length\"() {\n let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx], len), idx, `obj.lastIndexOfs(${expected[idx]}) should match idx`);\n }\n }\n\n \"@test should return index of object's last occurrence even startAt search location is greater than length\"() {\n let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = 3;\n\n for (let idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx], len + 1), idx, `obj.lastIndexOf(${expected[idx]}) should match idx`);\n }\n }\n\n '@test should return -1 when no match is found'() {\n let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.lastIndexOf(foo), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n\n '@test should return -1 when no match is found even startAt search location is equal to length'() {\n let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.lastIndexOf(foo, (0, _metal.get)(obj, 'length')), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n\n '@test should return -1 when no match is found even startAt search location is greater than length'() {\n let obj = this.newObject((0, _array.newFixture)(3));\n let foo = {};\n\n this.assert.equal(obj.lastIndexOf(foo, (0, _metal.get)(obj, 'length') + 1), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n }\n\n (0, _array.runArrayTests)('lastIndexOf', LastIndexOfTests);\n});","enifed('@ember/-internals/runtime/tests/array/lastObject-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/metal'], function (_internalTestHelpers, _array, _metal) {\n 'use strict';\n\n class LastObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns last item in enumerable'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n }\n\n '@test returns undefined if enumerable is empty'() {\n let obj = this.newObject([]);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), undefined);\n }\n\n '@test can not be set'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n\n this.assert.throws(function () {\n (0, _metal.set)(obj, 'lastObject', 'foo!');\n }, /Cannot set read-only property \"lastObject\" on object/);\n }\n }\n\n (0, _array.runArrayTests)('lastObject', LastObjectTests);\n});","enifed('@ember/-internals/runtime/tests/array/map-test', ['@ember/-internals/utils', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/metal'], function (_utils, _internalTestHelpers, _array, _metal) {\n 'use strict';\n\n const mapFunc = item => item ? item.toString() : null;\n\n class MapTests extends _internalTestHelpers.AbstractTestCase {\n '@test map should iterate over list'() {\n let obj = this.newObject();\n let ary = this.toArray(obj).map(mapFunc);\n let found = [];\n\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'mapped arrays should match');\n }\n\n '@test map should iterate over list after mutation'() {\n if ((0, _metal.get)(this, 'canTestMutation')) {\n this.assert.expect(0);\n return;\n }\n\n let obj = this.newObject();\n let ary = this.toArray(obj).map(mapFunc);\n let found;\n\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n\n this.mutate(obj);\n ary = this.toArray(obj).map(mapFunc);\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test 2nd target parameter'() {\n let obj = this.newObject();\n let target = this;\n\n obj.map(() => {\n // ES6TODO: When transpiled we will end up with \"use strict\" which disables automatically binding to the global context.\n // Therefore, the following test can never pass in strict mode unless we modify the `map` function implementation to\n // use `Ember.lookup` if target is not specified.\n //\n // equal(guidFor(this), guidFor(global), 'should pass the global object as this if no context');\n });\n\n obj.map(() => {\n this.assert.equal((0, _utils.guidFor)(this), (0, _utils.guidFor)(target), 'should pass target as this if context');\n }, target);\n }\n\n '@test callback params'() {\n let obj = this.newObject();\n let ary = this.toArray(obj);\n let loc = 0;\n\n obj.map((item, idx, enumerable) => {\n this.assert.equal(item, ary[loc], 'item param');\n this.assert.equal(idx, loc, 'idx param');\n this.assert.equal((0, _utils.guidFor)(enumerable), (0, _utils.guidFor)(obj), 'enumerable param');\n loc++;\n });\n }\n }\n\n (0, _array.runArrayTests)('map', MapTests);\n});","enifed('@ember/-internals/runtime/tests/array/mapBy-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class MapByTests extends _internalTestHelpers.AbstractTestCase {\n '@test get value of each property'() {\n let obj = this.newObject([{ a: 1 }, { a: 2 }]);\n this.assert.equal(obj.mapBy('a').join(''), '12');\n }\n\n '@test should work also through getEach alias'() {\n let obj = this.newObject([{ a: 1 }, { a: 2 }]);\n this.assert.equal(obj.getEach('a').join(''), '12');\n }\n }\n\n (0, _array.runArrayTests)('mapBy', MapByTests);\n});","enifed('@ember/-internals/runtime/tests/array/objectAt-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class ObjectAtTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return object at specified index'() {\n let expected = (0, _array.newFixture)(3);\n let obj = this.newObject(expected);\n let len = expected.length;\n\n for (let idx = 0; idx < len; idx++) {\n this.assert.equal(obj.objectAt(idx), expected[idx], `obj.objectAt(${idx}) should match`);\n }\n }\n\n '@test should return undefined when requesting objects beyond index'() {\n let obj;\n\n obj = this.newObject((0, _array.newFixture)(3));\n this.assert.equal(obj.objectAt(obj, 5), undefined, 'should return undefined for obj.objectAt(5) when len = 3');\n\n obj = this.newObject([]);\n this.assert.equal(obj.objectAt(obj, 0), undefined, 'should return undefined for obj.objectAt(0) when len = 0');\n }\n }\n\n (0, _array.runArrayTests)('objectAt', ObjectAtTests);\n});","enifed('@ember/-internals/runtime/tests/array/reduce-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class ReduceTests extends _internalTestHelpers.AbstractTestCase {\n '@test collects a summary value from an enumeration'() {\n let obj = this.newObject([1, 2, 3]);\n let res = obj.reduce((previousValue, item) => previousValue + item, 0);\n this.assert.equal(res, 6);\n }\n\n '@test passes index of item to callback'() {\n let obj = this.newObject([1, 2, 3]);\n let res = obj.reduce((previousValue, item, index) => previousValue + index, 0);\n this.assert.equal(res, 3);\n }\n\n '@test passes enumerable object to callback'() {\n let obj = this.newObject([1, 2, 3]);\n let res = obj.reduce((previousValue, item, index, enumerable) => enumerable, 0);\n this.assert.equal(res, obj);\n }\n }\n\n (0, _array.runArrayTests)('reduce', ReduceTests);\n});","enifed('@ember/-internals/runtime/tests/array/reject-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/runtime/lib/system/object'], function (_internalTestHelpers, _array, _object) {\n 'use strict';\n\n class RejectTest extends _internalTestHelpers.AbstractTestCase {\n '@test should reject any item that does not meet the condition'() {\n let obj = this.newObject([1, 2, 3, 4]);\n let result;\n\n result = obj.reject(i => i < 3);\n this.assert.deepEqual(result, [3, 4], 'reject the correct items');\n }\n\n '@test should be the inverse of filter'() {\n let obj = this.newObject([1, 2, 3, 4]);\n let isEven = i => i % 2 === 0;\n let filtered, rejected;\n\n filtered = obj.filter(isEven);\n rejected = obj.reject(isEven);\n\n this.assert.deepEqual(filtered, [2, 4], 'filtered evens');\n this.assert.deepEqual(rejected, [1, 3], 'rejected evens');\n }\n }\n\n class RejectByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should reject based on object'() {\n let obj, ary;\n\n ary = [{ foo: 'foo', bar: 'BAZ' }, _object.default.create({ foo: 'foo', bar: 'bar' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo', 'foo'), [], 'rejectBy(foo)');\n this.assert.deepEqual(obj.rejectBy('bar', 'bar'), [ary[0]], 'rejectBy(bar)');\n }\n\n '@test should include in result if property is false'() {\n let obj, ary;\n\n ary = [{ foo: false, bar: true }, _object.default.create({ foo: false, bar: false })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo'), ary, 'rejectBy(foo)');\n this.assert.deepEqual(obj.rejectBy('bar'), [ary[1]], 'rejectBy(bar)');\n }\n\n '@test should reject on second argument if provided'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 }), { name: 'obj3', foo: 2 }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo', 3), [ary[1], ary[2]], \"rejectBy('foo', 3)')\");\n }\n\n '@test should correctly reject null second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: null }), { name: 'obj3', foo: null }, _object.default.create({ name: 'obj4', foo: 3 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo', null), [ary[0], ary[3]], \"rejectBy('foo', null)')\");\n }\n\n '@test should correctly reject undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 2 })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('bar', undefined), [], \"rejectBy('bar', undefined)')\");\n }\n\n '@test should correctly reject explicit undefined second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo', undefined), ary.slice(0, 2), \"rejectBy('foo', undefined)')\");\n }\n\n '@test should match undefined, null, or false properties without second argument'() {\n let obj, ary;\n\n ary = [{ name: 'obj1', foo: 3 }, _object.default.create({ name: 'obj2', foo: 3 }), { name: 'obj3', foo: undefined }, _object.default.create({ name: 'obj4', foo: undefined }), { name: 'obj5' }, _object.default.create({ name: 'obj6' }), { name: 'obj7', foo: null }, _object.default.create({ name: 'obj8', foo: null }), { name: 'obj9', foo: false }, _object.default.create({ name: 'obj10', foo: false })];\n\n obj = this.newObject(ary);\n\n this.assert.deepEqual(obj.rejectBy('foo'), ary.slice(2), \"rejectBy('foo')')\");\n }\n }\n\n (0, _array.runArrayTests)('reject', RejectTest);\n (0, _array.runArrayTests)('rejectBy', RejectByTest);\n});","enifed('@ember/-internals/runtime/tests/array/sortBy-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class SortByTests extends _internalTestHelpers.AbstractTestCase {\n '@test sort by value of property'() {\n let obj = this.newObject([{ a: 2 }, { a: 1 }]);\n let sorted = obj.sortBy('a');\n\n this.assert.equal((0, _metal.get)(sorted[0], 'a'), 1);\n this.assert.equal((0, _metal.get)(sorted[1], 'a'), 2);\n }\n\n '@test supports multiple propertyNames'() {\n let obj = this.newObject([{ a: 1, b: 2 }, { a: 1, b: 1 }]);\n let sorted = obj.sortBy('a', 'b');\n\n this.assert.equal((0, _metal.get)(sorted[0], 'b'), 1);\n this.assert.equal((0, _metal.get)(sorted[1], 'b'), 2);\n }\n }\n\n (0, _array.runArrayTests)('sortBy', SortByTests);\n});","enifed('@ember/-internals/runtime/tests/array/toArray-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class ToArrayTests extends _internalTestHelpers.AbstractTestCase {\n '@test toArray should convert to an array'() {\n let obj = this.newObject();\n this.assert.deepEqual(obj.toArray(), this.toArray(obj));\n }\n }\n\n (0, _array.runArrayTests)('toArray', ToArrayTests);\n});","enifed('@ember/-internals/runtime/tests/array/uniq-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class UniqTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with duplicates removed'() {\n let before, after, obj, ret;\n\n after = (0, _array.newFixture)(3);\n before = [after[0], after[1], after[2], after[1], after[0]];\n obj = this.newObject(before);\n before = obj.toArray(); // in case of set before will be different...\n\n ret = obj.uniq();\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n this.assert.deepEqual(this.toArray(obj), before, 'should not have changed original');\n }\n\n '@test should return duplicate of same content if no duplicates found'() {\n let item, obj, ret;\n obj = this.newObject((0, _array.newFixture)(3));\n ret = obj.uniq(item);\n this.assert.ok(ret !== obj, 'should not be same object');\n this.assert.deepEqual(this.toArray(ret), this.toArray(obj), 'should be the same content');\n }\n }\n\n (0, _array.runArrayTests)('uniq', UniqTests);\n});","enifed('@ember/-internals/runtime/tests/array/uniqBy-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class UniqByTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with duplicates removed'() {\n let numbers = this.newObject([{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 1, value: 'one' }]);\n this.assert.deepEqual(numbers.uniqBy('id'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }]);\n }\n\n '@test supports function as key'() {\n let numbers = this.newObject([{ id: 1, value: 'boom' }, { id: 2, value: 'boom' }, { id: 1, value: 'doom' }]);\n\n let keyFunction = val => {\n this.assert.equal(arguments.length, 1);\n return val.value;\n };\n\n this.assert.deepEqual(numbers.uniqBy(keyFunction), [{ id: 1, value: 'boom' }, { id: 1, value: 'doom' }]);\n }\n }\n\n (0, _array.runArrayTests)('uniqBy', UniqByTests);\n});","enifed('@ember/-internals/runtime/tests/array/without-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class WithoutTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with item removed'() {\n let before, after, obj, ret;\n\n before = (0, _array.newFixture)(3);\n after = [before[0], before[2]];\n obj = this.newObject(before);\n\n ret = obj.without(before[1]);\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n this.assert.deepEqual(this.toArray(obj), before, 'should not have changed original');\n }\n\n '@test should remove NaN value'() {\n let before, after, obj, ret;\n\n before = [...(0, _array.newFixture)(2), NaN];\n after = [before[0], before[1]];\n obj = this.newObject(before);\n\n ret = obj.without(NaN);\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n }\n\n '@test should return same instance if object not found'() {\n let item, obj, ret;\n\n item = (0, _array.newFixture)(1)[0];\n obj = this.newObject((0, _array.newFixture)(3));\n\n ret = obj.without(item);\n this.assert.equal(ret, obj, 'should be same instance');\n }\n }\n\n (0, _array.runArrayTests)('without', WithoutTests);\n});","enifed('@ember/-internals/runtime/tests/copyable-array/copy-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class CopyTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return an equivalent copy'() {\n let obj = this.newObject();\n let copy = obj.copy();\n this.assert.ok(this.isEqual(obj, copy), 'old object and new object should be equivalent');\n }\n }\n\n (0, _array.runArrayTests)('copy', CopyTest, 'CopyableNativeArray', 'CopyableArray');\n});","enifed('@ember/-internals/runtime/tests/core/compare_test', ['@ember/-internals/runtime/lib/type-of', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/compare', '@ember/-internals/runtime/lib/mixins/comparable', 'internal-test-helpers'], function (_typeOf, _object, _compare, _comparable, _internalTestHelpers) {\n 'use strict';\n\n let data = [];\n let Comp = _object.default.extend(_comparable.default);\n\n Comp.reopenClass({\n compare(obj) {\n return obj.get('val');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.compare()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n data[0] = null;\n data[1] = false;\n data[2] = true;\n data[3] = -12;\n data[4] = 3.5;\n data[5] = 'a string';\n data[6] = 'another string';\n data[7] = 'last string';\n data[8] = [1, 2];\n data[9] = [1, 2, 3];\n data[10] = [1, 3];\n data[11] = { a: 'hash' };\n data[12] = _object.default.create();\n data[13] = function (a) {\n return a;\n };\n data[14] = new Date('2012/01/01');\n data[15] = new Date('2012/06/06');\n }\n\n ['@test ordering should work'](assert) {\n let suspect, comparable, failureMessage, suspectIndex, comparableIndex;\n\n for (suspectIndex = 0; suspectIndex < data.length; suspectIndex++) {\n suspect = data[suspectIndex];\n\n assert.equal((0, _compare.default)(suspect, suspect), 0, suspectIndex + ' should equal itself');\n\n for (comparableIndex = suspectIndex + 1; comparableIndex < data.length; comparableIndex++) {\n comparable = data[comparableIndex];\n\n failureMessage = 'data[' + suspectIndex + '] (' + (0, _typeOf.typeOf)(suspect) + ') should be smaller than data[' + comparableIndex + '] (' + (0, _typeOf.typeOf)(comparable) + ')';\n\n assert.equal((0, _compare.default)(suspect, comparable), -1, failureMessage);\n }\n }\n }\n\n ['@test comparables should return values in the range of -1, 0, 1'](assert) {\n let negOne = Comp.create({\n val: -1\n });\n\n let zero = Comp.create({\n val: 0\n });\n\n let one = Comp.create({\n val: 1\n });\n\n assert.equal((0, _compare.default)(negOne, 'a'), -1, 'First item comparable - returns -1 (not negated)');\n assert.equal((0, _compare.default)(zero, 'b'), 0, 'First item comparable - returns 0 (not negated)');\n assert.equal((0, _compare.default)(one, 'c'), 1, 'First item comparable - returns 1 (not negated)');\n\n assert.equal((0, _compare.default)('a', negOne), 1, 'Second item comparable - returns -1 (negated)');\n assert.equal((0, _compare.default)('b', zero), 0, 'Second item comparable - returns 0 (negated)');\n assert.equal((0, _compare.default)('c', one), -1, 'Second item comparable - returns 1 (negated)');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/core/copy_test', ['@ember/-internals/runtime/lib/copy', 'internal-test-helpers'], function (_copy, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember Copy Method', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.copy null'](assert) {\n let obj = { field: null };\n let copied = null;\n expectDeprecation(() => {\n copied = (0, _copy.default)(obj, true);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n assert.equal(copied.field, null, 'null should still be null');\n }\n\n ['@test Ember.copy date'](assert) {\n let date = new Date(2014, 7, 22);\n let dateCopy = null;\n expectDeprecation(() => {\n dateCopy = (0, _copy.default)(date);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n assert.equal(date.getTime(), dateCopy.getTime(), 'dates should be equivalent');\n }\n\n ['@test Ember.copy null prototype object'](assert) {\n let obj = Object.create(null);\n\n obj.foo = 'bar';\n let copied = null;\n expectDeprecation(() => {\n copied = (0, _copy.default)(obj);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.equal(copied.foo, 'bar', 'bar should still be bar');\n }\n\n ['@test Ember.copy Array'](assert) {\n let array = [1, null, new Date(2015, 9, 9), 'four'];\n let arrayCopy = null;\n expectDeprecation(() => {\n arrayCopy = (0, _copy.default)(array);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.deepEqual(array, arrayCopy, 'array content cloned successfully in new array');\n }\n\n ['@test Ember.copy cycle detection'](assert) {\n let obj = {\n foo: {\n bar: 'bar'\n }\n };\n obj.foo.foo = obj.foo;\n let cycleCopy = null;\n expectDeprecation(() => {\n cycleCopy = (0, _copy.default)(obj, true);\n }, 'Use ember-copy addon instead of copy method and Copyable mixin.');\n\n assert.equal(cycleCopy.foo.bar, 'bar');\n assert.notEqual(cycleCopy.foo.foo, obj.foo.foo);\n assert.strictEqual(cycleCopy.foo.foo, cycleCopy.foo.foo);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/core/isEqual_test', ['@ember/-internals/runtime/lib/is-equal', 'internal-test-helpers'], function (_isEqual, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('isEqual', class extends _internalTestHelpers.AbstractTestCase {\n ['@test undefined and null'](assert) {\n assert.ok((0, _isEqual.default)(undefined, undefined), 'undefined is equal to undefined');\n assert.ok(!(0, _isEqual.default)(undefined, null), 'undefined is not equal to null');\n assert.ok((0, _isEqual.default)(null, null), 'null is equal to null');\n assert.ok(!(0, _isEqual.default)(null, undefined), 'null is not equal to undefined');\n }\n\n ['@test strings should be equal'](assert) {\n assert.ok(!(0, _isEqual.default)('Hello', 'Hi'), 'different Strings are unequal');\n assert.ok((0, _isEqual.default)('Hello', 'Hello'), 'same Strings are equal');\n }\n\n ['@test numericals should be equal'](assert) {\n assert.ok((0, _isEqual.default)(24, 24), 'same numbers are equal');\n assert.ok(!(0, _isEqual.default)(24, 21), 'different numbers are inequal');\n }\n\n ['@test dates should be equal'](assert) {\n assert.ok((0, _isEqual.default)(new Date(1985, 7, 22), new Date(1985, 7, 22)), 'same dates are equal');\n assert.ok(!(0, _isEqual.default)(new Date(2014, 7, 22), new Date(1985, 7, 22)), 'different dates are not equal');\n }\n\n ['@test array should be equal'](assert) {\n // NOTE: We don't test for array contents -- that would be too expensive.\n assert.ok(!(0, _isEqual.default)([1, 2], [1, 2]), 'two array instances with the same values should not be equal');\n assert.ok(!(0, _isEqual.default)([1, 2], [1]), 'two array instances with different values should not be equal');\n }\n\n ['@test first object implements isEqual should use it'](assert) {\n assert.ok((0, _isEqual.default)({\n isEqual() {\n return true;\n }\n }, null), 'should return true always');\n\n let obj = {\n isEqual() {\n return false;\n }\n };\n assert.equal((0, _isEqual.default)(obj, obj), false, 'should return false because isEqual returns false');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/core/is_array_test', ['@ember/-internals/runtime/lib/mixins/array', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/browser-environment', 'internal-test-helpers'], function (_array, _array_proxy, _object, _browserEnvironment, _internalTestHelpers) {\n 'use strict';\n\n const global = undefined;\n\n (0, _internalTestHelpers.moduleFor)('Ember Type Checking', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.isArray'](assert) {\n let numarray = [1, 2, 3];\n let number = 23;\n let strarray = ['Hello', 'Hi'];\n let string = 'Hello';\n let object = {};\n let length = { length: 12 };\n let strangeLength = { length: 'yes' };\n let fn = function () {};\n let arrayProxy = _array_proxy.default.create({ content: (0, _array.A)() });\n\n assert.equal((0, _array.isArray)(numarray), true, '[1,2,3]');\n assert.equal((0, _array.isArray)(number), false, '23');\n assert.equal((0, _array.isArray)(strarray), true, '[\"Hello\", \"Hi\"]');\n assert.equal((0, _array.isArray)(string), false, '\"Hello\"');\n assert.equal((0, _array.isArray)(object), false, '{}');\n assert.equal((0, _array.isArray)(length), true, '{ length: 12 }');\n assert.equal((0, _array.isArray)(strangeLength), false, '{ length: \"yes\" }');\n assert.equal((0, _array.isArray)(global), false, 'global');\n assert.equal((0, _array.isArray)(fn), false, 'function() {}');\n assert.equal((0, _array.isArray)(arrayProxy), true, '[]');\n }\n\n '@test Ember.isArray does not trigger proxy assertion when probing for length GH#16495'(assert) {\n let instance = _object.default.extend({\n // intentionally returning non-null / non-undefined\n unknownProperty() {\n return false;\n }\n }).create();\n\n assert.equal((0, _array.isArray)(instance), false);\n }\n\n ['@test Ember.isArray(fileList)'](assert) {\n if (_browserEnvironment.window && typeof _browserEnvironment.window.FileList === 'function') {\n let fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n let fileList = fileListElement.files;\n assert.equal((0, _array.isArray)(fileList), false, 'fileList');\n } else {\n assert.ok(true, 'FileList is not present on window');\n }\n }\n });\n});","enifed('@ember/-internals/runtime/tests/core/is_empty_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.isEmpty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.isEmpty'](assert) {\n let arrayProxy = _array_proxy.default.create({ content: (0, _array.A)() });\n\n assert.equal(true, (0, _metal.isEmpty)(arrayProxy), 'for an ArrayProxy that has empty content');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/core/type_of_test', ['@ember/-internals/runtime/lib/type-of', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/browser-environment', 'internal-test-helpers'], function (_typeOf, _object, _browserEnvironment, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember Type Checking', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.typeOf'](assert) {\n let MockedDate = function () {};\n MockedDate.prototype = new Date();\n\n let mockedDate = new MockedDate();\n let date = new Date();\n let error = new Error('boum');\n let object = { a: 'b' };\n let a = null;\n let arr = [1, 2, 3];\n let obj = {};\n let instance = _object.default.create({ method() {} });\n\n assert.equal((0, _typeOf.typeOf)(), 'undefined', 'undefined');\n assert.equal((0, _typeOf.typeOf)(null), 'null', 'null');\n assert.equal((0, _typeOf.typeOf)('Cyril'), 'string', 'Cyril');\n assert.equal((0, _typeOf.typeOf)(101), 'number', '101');\n assert.equal((0, _typeOf.typeOf)(true), 'boolean', 'true');\n assert.equal((0, _typeOf.typeOf)([1, 2, 90]), 'array', '[1,2,90]');\n assert.equal((0, _typeOf.typeOf)(/abc/), 'regexp', '/abc/');\n assert.equal((0, _typeOf.typeOf)(date), 'date', 'new Date()');\n assert.equal((0, _typeOf.typeOf)(mockedDate), 'date', 'mocked date');\n assert.equal((0, _typeOf.typeOf)(error), 'error', 'error');\n assert.equal((0, _typeOf.typeOf)(object), 'object', 'object');\n assert.equal((0, _typeOf.typeOf)(undefined), 'undefined', 'item of type undefined');\n assert.equal((0, _typeOf.typeOf)(a), 'null', 'item of type null');\n assert.equal((0, _typeOf.typeOf)(arr), 'array', 'item of type array');\n assert.equal((0, _typeOf.typeOf)(obj), 'object', 'item of type object');\n assert.equal((0, _typeOf.typeOf)(instance), 'instance', 'item of type instance');\n assert.equal((0, _typeOf.typeOf)(instance.method), 'function', 'item of type function');\n assert.equal((0, _typeOf.typeOf)(_object.default.extend()), 'class', 'item of type class');\n assert.equal((0, _typeOf.typeOf)(new Error()), 'error', 'item of type error');\n }\n\n ['@test Ember.typeOf(fileList)'](assert) {\n if (_browserEnvironment.window && typeof _browserEnvironment.window.FileList === 'function') {\n let fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n let fileList = fileListElement.files;\n assert.equal((0, _typeOf.typeOf)(fileList), 'filelist', 'item of type filelist');\n } else {\n assert.ok(true, 'FileList is not present on window');\n }\n }\n });\n});","enifed('@ember/-internals/runtime/tests/ext/function_test', ['@ember/-internals/environment', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/evented', 'internal-test-helpers'], function (_environment, _metal, _object, _evented, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.observes() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test global observer helper takes multiple params'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.observes, 'Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.observes('bar', 'baz')\n });\n\n let obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer after change');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.on() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sets up an event listener, and can trigger the function on multiple events'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.on, 'Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.on('bar', 'baz')\n });\n\n let obj = (0, _metal.mixin)({}, _evented.default, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke listener immediately');\n\n obj.trigger('bar');\n obj.trigger('baz');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke listeners when events trigger');\n }\n\n ['@test can be chained with observes'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('Function.prototype helper disabled');\n return;\n }\n\n let MyMixin = _metal.Mixin.create({\n count: 0,\n bay: 'bay',\n foo: function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }.observes('bay').on('bar')\n });\n\n let obj = (0, _metal.mixin)({}, _evented.default, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke listener immediately');\n\n (0, _metal.set)(obj, 'bay', 'BAY');\n obj.trigger('bar');\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer and listener');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Function.prototype.property() helper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sets up a ComputedProperty'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.Function) {\n assert.ok('undefined' === typeof Function.prototype.property, 'Function.prototype helper disabled');\n return;\n }\n\n let MyClass = _object.default.extend({\n firstName: null,\n lastName: null,\n fullName: function () {\n return (0, _metal.get)(this, 'firstName') + ' ' + (0, _metal.get)(this, 'lastName');\n }.property('firstName', 'lastName')\n });\n\n let obj = MyClass.create({ firstName: 'Fred', lastName: 'Flinstone' });\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Fred Flinstone', 'should return the computed value');\n\n (0, _metal.set)(obj, 'firstName', 'Wilma');\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Wilma Flinstone', 'should return the new computed value');\n\n (0, _metal.set)(obj, 'lastName', '');\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Wilma ', 'should return the new computed value');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/ext/rsvp_test', ['@ember/runloop', '@ember/-internals/error-handling', '@ember/-internals/runtime/lib/ext/rsvp', '@ember/debug', 'internal-test-helpers'], function (_runloop, _errorHandling, _rsvp, _debug, _internalTestHelpers) {\n 'use strict';\n\n const ORIGINAL_ONERROR = (0, _errorHandling.getOnerror)();\n\n (0, _internalTestHelpers.moduleFor)('Ember.RSVP', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n (0, _errorHandling.setOnerror)(ORIGINAL_ONERROR);\n }\n\n ['@test Ensure that errors thrown from within a promise are sent to the console'](assert) {\n let error = new Error('Error thrown in a promise for testing purposes.');\n\n try {\n (0, _runloop.run)(function () {\n new _rsvp.default.Promise(function () {\n throw error;\n });\n });\n assert.ok(false, 'expected assertion to be thrown');\n } catch (e) {\n assert.equal(e, error, 'error was re-thrown');\n }\n }\n\n ['@test TransitionAborted errors are not re-thrown'](assert) {\n assert.expect(1);\n let fakeTransitionAbort = { name: 'TransitionAborted' };\n\n (0, _runloop.run)(_rsvp.default, 'reject', fakeTransitionAbort);\n\n assert.ok(true, 'did not throw an error when dealing with TransitionAborted');\n }\n\n ['@test Can reject with non-Error object'](assert) {\n let wasEmberTesting = (0, _debug.isTesting)();\n (0, _debug.setTesting)(false);\n assert.expect(1);\n\n try {\n (0, _runloop.run)(_rsvp.default, 'reject', 'foo');\n } catch (e) {\n assert.equal(e, 'foo', 'should throw with rejection message');\n } finally {\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test Can reject with no arguments'](assert) {\n let wasEmberTesting = (0, _debug.isTesting)();\n (0, _debug.setTesting)(false);\n assert.expect(1);\n\n try {\n (0, _runloop.run)(_rsvp.default, 'reject');\n } catch (e) {\n assert.ok(false, 'should not throw');\n } finally {\n (0, _debug.setTesting)(wasEmberTesting);\n }\n\n assert.ok(true);\n }\n\n ['@test rejections like jqXHR which have errorThrown property work'](assert) {\n assert.expect(2);\n\n let wasEmberTesting = (0, _debug.isTesting)();\n let wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error, actualError, 'expected the real error on the jqXHR');\n assert.equal(error.__reason_with_error_thrown__, jqXHR, 'also retains a helpful reference to the rejection reason');\n });\n\n let actualError = new Error('OMG what really happened');\n let jqXHR = {\n errorThrown: actualError\n };\n\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test rejections where the errorThrown is a string should wrap the sting in an error object'](assert) {\n assert.expect(2);\n\n let wasEmberTesting = (0, _debug.isTesting)();\n let wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error.message, actualError, 'expected the real error on the jqXHR');\n assert.equal(error.__reason_with_error_thrown__, jqXHR, 'also retains a helpful reference to the rejection reason');\n });\n\n let actualError = 'OMG what really happened';\n let jqXHR = {\n errorThrown: actualError\n };\n\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test rejections can be serialized to JSON'](assert) {\n assert.expect(2);\n\n let wasEmberTesting = (0, _debug.isTesting)();\n let wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error.message, 'a fail');\n assert.ok(JSON.stringify(error), 'Error can be serialized');\n });\n\n let jqXHR = {\n errorThrown: new Error('a fail')\n };\n\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n });\n\n const reason = 'i failed';\n function ajax() {\n return new _rsvp.default.Promise(function (resolve) {\n setTimeout(resolve, 0); // fake true / foreign async\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.test: rejection assertions', class extends _internalTestHelpers.AbstractTestCase {\n ['@test unambigiously unhandled rejection'](assert) {\n assert.throws(function () {\n (0, _runloop.run)(function () {\n _rsvp.default.Promise.reject(reason);\n }); // something is funky, we should likely assert\n }, reason);\n }\n\n ['@test sync handled'](assert) {\n (0, _runloop.run)(function () {\n _rsvp.default.Promise.reject(reason).catch(function () {});\n }); // handled, we shouldn't need to assert.\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled within the same micro-task (via Ember.RVP.Promise)'](assert) {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n _rsvp.default.Promise.resolve(1).then(() => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled within the same micro-task (via direct run-loop)'](assert) {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n (0, _runloop.schedule)('afterRender', () => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled in the next microTask queue flush (next)'](assert) {\n assert.expect(2);\n let done = assert.async();\n\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n\n (0, _runloop.next)(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n\n // a promise rejection survived a full flush of the run-loop without being handled\n // this is very likely an issue.\n }\n\n ['@test handled in the same microTask Queue flush do to data locality'](assert) {\n // an ambiguous scenario, this may or may not assert\n // it depends on the locality of `user#1`\n let store = {\n find() {\n return _rsvp.default.Promise.resolve(1);\n }\n };\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n store.find('user', 1).then(() => rejection.catch(function () {}));\n });\n\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled in a different microTask Queue flush do to data locality'](assert) {\n let done = assert.async();\n // an ambiguous scenario, this may or may not assert\n // it depends on the locality of `user#1`\n let store = {\n find() {\n return ajax();\n }\n };\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n store.find('user', 1).then(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n }\n\n ['@test handled in the next microTask queue flush (ajax example)'](assert) {\n let done = assert.async();\n\n assert.throws(function () {\n (0, _runloop.run)(function () {\n let rejection = _rsvp.default.Promise.reject(reason);\n ajax().then(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/helpers/array', ['exports', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', '@ember/-internals/utils', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/copyable', 'internal-test-helpers'], function (exports, _array_proxy, _array, _utils, _metal, _object, _copyable, _internalTestHelpers) {\n 'use strict';\n\n exports.newFixture = newFixture;\n exports.newObjectsFixture = newObjectsFixture;\n exports.runArrayTests = runArrayTests;\n function newFixture(cnt) {\n let ret = [];\n while (--cnt >= 0) {\n ret.push((0, _utils.generateGuid)());\n }\n\n return ret;\n }\n\n function newObjectsFixture(cnt) {\n let ret = [];\n let item;\n while (--cnt >= 0) {\n item = {};\n (0, _utils.guidFor)(item);\n ret.push(item);\n }\n return ret;\n }\n\n const ArrayTestsObserverClass = _object.default.extend({\n init() {\n this._super(...arguments);\n this.isEnabled = true;\n this.reset();\n },\n\n reset() {\n this._keys = {};\n this._values = {};\n this._before = null;\n this._after = null;\n return this;\n },\n\n observe(obj, ...keys) {\n if (obj.addObserver) {\n let loc = keys.length;\n\n while (--loc >= 0) {\n obj.addObserver(keys[loc], this, 'propertyDidChange');\n }\n } else {\n this.isEnabled = false;\n }\n return this;\n },\n\n observeArray(obj) {\n (0, _metal.addArrayObserver)(obj, this);\n return this;\n },\n\n stopObserveArray(obj) {\n (0, _metal.removeArrayObserver)(obj, this);\n return this;\n },\n\n propertyDidChange(target, key, value) {\n if (this._keys[key] === undefined) {\n this._keys[key] = 0;\n }\n this._keys[key]++;\n this._values[key] = value;\n },\n\n arrayWillChange() {\n this.assert.equal(this._before, null, 'should only call once');\n this._before = Array.prototype.slice.call(arguments);\n },\n\n arrayDidChange() {\n this.assert.equal(this._after, null, 'should only call once');\n this._after = Array.prototype.slice.call(arguments);\n },\n\n validate(key, value) {\n if (!this.isEnabled) {\n return true;\n }\n\n if (!this._keys[key]) {\n return false;\n }\n\n if (arguments.length > 1) {\n return this._values[key] === value;\n } else {\n return true;\n }\n },\n\n timesCalled(key) {\n return this._keys[key] || 0;\n }\n });\n\n class AbstractArrayHelper {\n beforeEach(assert) {\n this.assert = assert;\n }\n\n newObject(ary) {\n return ary ? ary.slice() : newFixture(3);\n }\n\n toArray(obj) {\n return obj.slice();\n }\n\n newObserver() {\n let ret = ArrayTestsObserverClass.create({\n assert: this.assert\n });\n\n if (arguments.length > 0) {\n ret.observe.apply(ret, arguments);\n }\n\n return ret;\n }\n }\n\n class NativeArrayHelpers extends AbstractArrayHelper {\n newObject(ary) {\n return (0, _array.A)(super.newObject(ary));\n }\n\n mutate(obj) {\n obj.pushObject(obj.length + 1);\n }\n }\n\n class CopyableNativeArray extends AbstractArrayHelper {\n newObject() {\n return (0, _array.A)([(0, _utils.generateGuid)()]);\n }\n\n isEqual(a, b) {\n if (!(a instanceof Array)) {\n return false;\n }\n\n if (!(b instanceof Array)) {\n return false;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n return a[0] === b[0];\n }\n }\n\n class CopyableArray extends AbstractArrayHelper {\n newObject() {\n return CopyableObject.create();\n }\n\n isEqual(a, b) {\n if (!(a instanceof CopyableObject) || !(b instanceof CopyableObject)) {\n return false;\n }\n\n return (0, _metal.get)(a, 'id') === (0, _metal.get)(b, 'id');\n }\n }\n\n class ArrayProxyHelpers extends AbstractArrayHelper {\n newObject(ary) {\n return _array_proxy.default.create({ content: (0, _array.A)(super.newObject(ary)) });\n }\n\n mutate(obj) {\n obj.pushObject((0, _metal.get)(obj, 'length') + 1);\n }\n\n toArray(obj) {\n return obj.toArray ? obj.toArray() : obj.slice();\n }\n }\n\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n const TestArray = _object.default.extend(_array.default, {\n _content: null,\n\n init() {\n this._content = this._content || [];\n },\n\n // some methods to modify the array so we can test changes. Note that\n // arrays can be modified even if they don't implement MutableArray. The\n // MutableArray is just a standard API for mutation but not required.\n addObject(obj) {\n let idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n this._content.push(obj);\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n this._content.shift();\n (0, _metal.arrayContentDidChange)(this, 0, 1, 0);\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n })\n });\n\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n const TestMutableArray = _object.default.extend(_array.MutableArray, {\n _content: null,\n\n init(ary = []) {\n this._content = (0, _array.A)(ary);\n },\n\n replace(idx, amt, objects) {\n let args = objects ? objects.slice() : [];\n let removeAmt = amt;\n let addAmt = args.length;\n\n (0, _metal.arrayContentWillChange)(this, idx, removeAmt, addAmt);\n\n args.unshift(amt);\n args.unshift(idx);\n this._content.splice.apply(this._content, args);\n (0, _metal.arrayContentDidChange)(this, idx, removeAmt, addAmt);\n return this;\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n }),\n\n slice() {\n return this._content.slice();\n }\n });\n\n const CopyableObject = _object.default.extend(_copyable.default, {\n id: null,\n\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'id', (0, _utils.generateGuid)());\n },\n\n copy() {\n let ret = CopyableObject.create();\n (0, _metal.set)(ret, 'id', (0, _metal.get)(this, 'id'));\n return ret;\n }\n });\n\n class MutableArrayHelpers extends NativeArrayHelpers {\n newObject(ary) {\n return TestMutableArray.create(super.newObject(ary));\n }\n\n // allows for testing of the basic enumerable after an internal mutation\n mutate(obj) {\n obj.addObject(this.getFixture(1)[0]);\n }\n }\n\n class EmberArrayHelpers extends MutableArrayHelpers {\n newObject(ary) {\n return TestArray.create(super.newObject(ary));\n }\n }\n\n function runArrayTests(name, Tests, ...types) {\n if (types.length > 0) {\n types.forEach(type => {\n switch (type) {\n case 'ArrayProxy':\n (0, _internalTestHelpers.moduleFor)(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);\n break;\n case 'EmberArray':\n (0, _internalTestHelpers.moduleFor)(`EmberArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n case 'MutableArray':\n (0, _internalTestHelpers.moduleFor)(`MutableArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n case 'CopyableArray':\n (0, _internalTestHelpers.moduleFor)(`CopyableArray: ${name}`, Tests, CopyableArray);\n break;\n case 'CopyableNativeArray':\n (0, _internalTestHelpers.moduleFor)(`CopyableNativeArray: ${name}`, Tests, CopyableNativeArray);\n break;\n case 'NativeArray':\n (0, _internalTestHelpers.moduleFor)(`NativeArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n }\n });\n } else {\n (0, _internalTestHelpers.moduleFor)(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);\n (0, _internalTestHelpers.moduleFor)(`EmberArray: ${name}`, Tests, EmberArrayHelpers);\n (0, _internalTestHelpers.moduleFor)(`MutableArray: ${name}`, Tests, MutableArrayHelpers);\n (0, _internalTestHelpers.moduleFor)(`NativeArray: ${name}`, Tests, NativeArrayHelpers);\n }\n }\n});","enifed('@ember/-internals/runtime/tests/inject_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('inject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test attempting to inject a nonexistent container key should error']() {\n let owner = (0, _internalTestHelpers.buildOwner)();\n let AnObject = _object.default.extend({\n foo: new _metal.InjectedProperty('bar', 'baz')\n });\n\n owner.register('foo:main', AnObject);\n\n expectAssertion(() => {\n owner.lookup('foo:main');\n }, /Attempting to inject an unknown injection: 'bar:baz'/);\n }\n\n ['@test factories should return a list of lazy injection full names'](assert) {\n if (true /* DEBUG */) {\n let AnObject = _object.default.extend({\n foo: new _metal.InjectedProperty('foo', 'bar'),\n bar: new _metal.InjectedProperty('quux')\n });\n\n assert.deepEqual(AnObject._lazyInjections(), {\n foo: {\n specifier: 'foo:bar',\n source: undefined,\n namespace: undefined\n },\n bar: {\n specifier: 'quux:bar',\n source: undefined,\n namespace: undefined\n }\n }, 'should return injected container keys');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/mixins/observable/chained_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_runloop, _metal, _object, _array, _internalTestHelpers) {\n 'use strict';\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * changed obj.set() and obj.get() to Ember.set() and Ember.get()\n * changed obj.addObserver() to addObserver()\n */\n\n (0, _internalTestHelpers.moduleFor)('Ember.Observable - Observing with @each', class extends _internalTestHelpers.AbstractTestCase {\n ['@test chained observers on enumerable properties are triggered when the observed property of any item changes'](assert) {\n let family = _object.default.create({ momma: null });\n let momma = _object.default.create({ children: [] });\n\n let child1 = _object.default.create({ name: 'Bartholomew' });\n let child2 = _object.default.create({ name: 'Agnes' });\n let child3 = _object.default.create({ name: 'Dan' });\n let child4 = _object.default.create({ name: 'Nancy' });\n\n (0, _metal.set)(family, 'momma', momma);\n (0, _metal.set)(momma, 'children', (0, _array.A)([child1, child2, child3]));\n\n let observerFiredCount = 0;\n (0, _metal.addObserver)(family, 'momma.children.@each.name', this, function () {\n observerFiredCount++;\n });\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.get)(momma, 'children').setEach('name', 'Juan'));\n assert.equal(observerFiredCount, 3, 'observer fired after changing child names');\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.get)(momma, 'children').pushObject(child4));\n assert.equal(observerFiredCount, 1, 'observer fired after adding a new item');\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.set)(child4, 'name', 'Herbert'));\n assert.equal(observerFiredCount, 1, 'observer fired after changing property on new object');\n\n (0, _metal.set)(momma, 'children', []);\n\n observerFiredCount = 0;\n (0, _runloop.run)(() => (0, _metal.set)(child1, 'name', 'Hanna'));\n assert.equal(observerFiredCount, 0, 'observer did not fire after removing changing property on a removed object');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/mixins/observable/observable_test', ['@ember/-internals/environment', '@ember/runloop', '@ember/-internals/metal', '@ember/string', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/observable', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_environment, _runloop, _metal, _string, _object, _observable, _array, _internalTestHelpers) {\n 'use strict';\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * Added ObservableObject which applies the Ember.Observable mixin.\n * Changed reference to Ember.T_FUNCTION to 'function'\n * Changed all references to sc_super to this._super(...arguments)\n * Changed Ember.objectForPropertyPath() to Ember.getPath()\n * Removed allPropertiesDidChange test - no longer supported\n * Changed test that uses 'ObjectE' as path to 'objectE' to reflect new\n rule on using capital letters for property paths.\n * Removed test passing context to addObserver. context param is no longer\n supported.\n * removed test in observer around line 862 that expected key/value to be\n the last item in the chained path. Should be root and chained path\n \n */\n\n // ========================================================================\n // Ember.Observable Tests\n // ========================================================================\n\n var object, ObjectC, ObjectD, objectA, objectB, lookup;\n\n var ObservableObject = _object.default.extend(_observable.default);\n var originalLookup = _environment.context.lookup;\n\n // ..........................................................\n // GET()\n //\n\n (0, _internalTestHelpers.moduleFor)('object.get()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend(_observable.default, {\n computed: (0, _metal.computed)(function () {\n return 'value';\n }).volatile(),\n method() {\n return 'value';\n },\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\n }\n }).create({\n normal: 'value',\n numberVal: 24,\n toggleVal: true,\n nullProperty: null\n });\n }\n\n ['@test should get normal properties'](assert) {\n assert.equal(object.get('normal'), 'value');\n }\n\n ['@test should call computed properties and return their result'](assert) {\n assert.equal(object.get('computed'), 'value');\n }\n\n ['@test should return the function for a non-computed property'](assert) {\n var value = object.get('method');\n assert.equal(typeof value, 'function');\n }\n\n ['@test should return null when property value is null'](assert) {\n assert.equal(object.get('nullProperty'), null);\n }\n\n ['@test should call unknownProperty when value is undefined'](assert) {\n assert.equal(object.get('unknown'), 'unknown');\n assert.equal(object.lastUnknownProperty, 'unknown');\n }\n });\n // ..........................................................\n // Ember.GET()\n //\n (0, _internalTestHelpers.moduleFor)('Ember.get()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n objectA = ObservableObject.extend({\n computed: (0, _metal.computed)(function () {\n return 'value';\n }).volatile(),\n method() {\n return 'value';\n },\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\n }\n }).create({\n normal: 'value',\n numberVal: 24,\n toggleVal: true,\n nullProperty: null\n });\n\n objectB = {\n normal: 'value',\n nullProperty: null\n };\n }\n\n ['@test should get normal properties on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'normal'), 'value');\n }\n\n ['@test should call computed properties on Ember.Observable and return their result'](assert) {\n assert.equal((0, _metal.get)(objectA, 'computed'), 'value');\n }\n\n ['@test should return the function for a non-computed property on Ember.Observable'](assert) {\n var value = (0, _metal.get)(objectA, 'method');\n assert.equal(typeof value, 'function');\n }\n\n ['@test should return null when property value is null on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'nullProperty'), null);\n }\n\n ['@test should call unknownProperty when value is undefined on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'unknown'), 'unknown');\n assert.equal(objectA.lastUnknownProperty, 'unknown');\n }\n\n ['@test should get normal properties on standard objects'](assert) {\n assert.equal((0, _metal.get)(objectB, 'normal'), 'value');\n }\n\n ['@test should return null when property is null on standard objects'](assert) {\n assert.equal((0, _metal.get)(objectB, 'nullProperty'), null);\n }\n\n ['@test raise if the provided object is undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'key');\n }, /Cannot call get with 'key' on an undefined object/i);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.get() with paths', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should return a property at a given path relative to the passed object'](assert) {\n var foo = ObservableObject.create({\n bar: ObservableObject.extend({\n baz: (0, _metal.computed)(function () {\n return 'blargh';\n }).volatile()\n }).create()\n });\n\n assert.equal((0, _metal.get)(foo, 'bar.baz'), 'blargh');\n }\n\n ['@test should return a property at a given path relative to the passed object - JavaScript hash'](assert) {\n var foo = {\n bar: {\n baz: 'blargh'\n }\n };\n\n assert.equal((0, _metal.get)(foo, 'bar.baz'), 'blargh');\n }\n });\n\n // ..........................................................\n // SET()\n //\n\n (0, _internalTestHelpers.moduleFor)('object.set()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n return this._computed;\n },\n set(key, value) {\n this._computed = value;\n return this._computed;\n }\n }).volatile(),\n\n method(key, value) {\n if (value !== undefined) {\n this._method = value;\n }\n return this._method;\n },\n\n unknownProperty() {\n return this._unknown;\n },\n\n setUnknownProperty(key, value) {\n this._unknown = value;\n return this._unknown;\n },\n\n // normal property\n normal: 'value',\n\n // computed property\n _computed: 'computed',\n // method, but not a property\n _method: 'method',\n // null property\n nullProperty: null,\n\n // unknown property\n _unknown: 'unknown'\n }).create();\n }\n\n ['@test should change normal properties and return the value'](assert) {\n var ret = object.set('normal', 'changed');\n assert.equal(object.get('normal'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should call computed properties passing value and return the value'](assert) {\n var ret = object.set('computed', 'changed');\n assert.equal(object.get('_computed'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should change normal properties when passing undefined'](assert) {\n var ret = object.set('normal', undefined);\n assert.equal(object.get('normal'), undefined);\n assert.equal(ret, undefined);\n }\n\n ['@test should replace the function for a non-computed property and return the value'](assert) {\n var ret = object.set('method', 'changed');\n assert.equal(object.get('_method'), 'method'); // make sure this was NOT run\n assert.ok(typeof object.get('method') !== 'function');\n assert.equal(ret, 'changed');\n }\n\n ['@test should replace prover when property value is null'](assert) {\n var ret = object.set('nullProperty', 'changed');\n assert.equal(object.get('nullProperty'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should call unknownProperty with value when property is undefined'](assert) {\n var ret = object.set('unknown', 'changed');\n assert.equal(object.get('_unknown'), 'changed');\n assert.equal(ret, 'changed');\n }\n });\n\n // ..........................................................\n // COMPUTED PROPERTIES\n //\n\n (0, _internalTestHelpers.moduleFor)('Computed properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n lookup = _environment.context.lookup = {};\n\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n this.computedCalls.push('getter-called');\n return 'computed';\n },\n set(key, value) {\n this.computedCalls.push(value);\n }\n }).volatile(),\n\n computedCached: (0, _metal.computed)({\n get() {\n this.computedCachedCalls.push('getter-called');\n return 'computedCached';\n },\n set: function (key, value) {\n this.computedCachedCalls.push(value);\n }\n }),\n\n dependent: (0, _metal.computed)({\n get() {\n this.dependentCalls.push('getter-called');\n return 'dependent';\n },\n set(key, value) {\n this.dependentCalls.push(value);\n }\n }).property('changer').volatile(),\n dependentFront: (0, _metal.computed)('changer', {\n get() {\n this.dependentFrontCalls.push('getter-called');\n return 'dependentFront';\n },\n set(key, value) {\n this.dependentFrontCalls.push(value);\n }\n }).volatile(),\n dependentCached: (0, _metal.computed)({\n get() {\n this.dependentCachedCalls.push('getter-called!');\n return 'dependentCached';\n },\n set(key, value) {\n this.dependentCachedCalls.push(value);\n }\n }).property('changer'),\n\n inc: (0, _metal.computed)('changer', function () {\n return this.incCallCount++;\n }),\n\n nestedInc: (0, _metal.computed)(function () {\n (0, _metal.get)(this, 'inc');\n return this.nestedIncCallCount++;\n }).property('inc'),\n\n isOn: (0, _metal.computed)({\n get() {\n return this.get('state') === 'on';\n },\n set() {\n this.set('state', 'on');\n return this.get('state') === 'on';\n }\n }).property('state').volatile(),\n\n isOff: (0, _metal.computed)({\n get() {\n return this.get('state') === 'off';\n },\n set() {\n this.set('state', 'off');\n return this.get('state') === 'off';\n }\n }).property('state').volatile()\n }).create({\n computedCalls: [],\n computedCachedCalls: [],\n changer: 'foo',\n dependentCalls: [],\n dependentFrontCalls: [],\n dependentCachedCalls: [],\n incCallCount: 0,\n nestedIncCallCount: 0,\n state: 'on'\n });\n }\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test getting values should call function return value'](assert) {\n // get each property twice. Verify return.\n var keys = (0, _string.w)('computed computedCached dependent dependentFront dependentCached');\n\n keys.forEach(function (key) {\n assert.equal(object.get(key), key, `Try #1: object.get(${key}) should run function`);\n assert.equal(object.get(key), key, `Try #2: object.get(${key}) should run function`);\n });\n\n // verify each call count. cached should only be called once\n (0, _string.w)('computedCalls dependentFrontCalls dependentCalls').forEach(key => {\n assert.equal(object[key].length, 2, `non-cached property ${key} should be called 2x`);\n });\n\n (0, _string.w)('computedCachedCalls dependentCachedCalls').forEach(key => {\n assert.equal(object[key].length, 1, `non-cached property ${key} should be called 1x`);\n });\n }\n\n ['@test setting values should call function return value'](assert) {\n // get each property twice. Verify return.\n var keys = (0, _string.w)('computed dependent dependentFront computedCached dependentCached');\n var values = (0, _string.w)('value1 value2');\n\n keys.forEach(key => {\n assert.equal(object.set(key, values[0]), values[0], `Try #1: object.set(${key}, ${values[0]}) should run function`);\n\n assert.equal(object.set(key, values[1]), values[1], `Try #2: object.set(${key}, ${values[1]}) should run function`);\n\n assert.equal(object.set(key, values[1]), values[1], `Try #3: object.set(${key}, ${values[1]}) should not run function since it is setting same value as before`);\n });\n\n // verify each call count. cached should only be called once\n keys.forEach(key => {\n var calls = object[key + 'Calls'];\n var idx, expectedLength;\n\n // Cached properties first check their cached value before setting the\n // property. Other properties blindly call set.\n expectedLength = 3;\n assert.equal(calls.length, expectedLength, `set(${key}) should be called the right amount of times`);\n for (idx = 0; idx < 2; idx++) {\n assert.equal(calls[idx], values[idx], `call #${idx + 1} to set(${key}) should have passed value ${values[idx]}`);\n }\n });\n }\n\n ['@test notify change should clear cache'](assert) {\n // call get several times to collect call count\n object.get('computedCached'); // should run func\n object.get('computedCached'); // should not run func\n\n object.notifyPropertyChange('computedCached');\n\n object.get('computedCached'); // should run again\n assert.equal(object.computedCachedCalls.length, 2, 'should have invoked method 2x');\n }\n\n ['@test change dependent should clear cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n object.set('changer', 'bar');\n\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test just notifying change of dependent should clear cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n object.notifyPropertyChange('changer');\n\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test changing dependent should clear nested cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('nestedInc'); // should run func\n assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n\n object.set('changer', 'bar');\n\n assert.equal(object.get('nestedInc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test just notifying change of dependent should clear nested cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('nestedInc'); // should run func\n assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n\n object.notifyPropertyChange('changer');\n\n assert.equal(object.get('nestedInc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n // This verifies a specific bug encountered where observers for computed\n // properties would fire before their prop caches were cleared.\n ['@test change dependent should clear cache when observers of dependent are called'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n\n // add observer to verify change...\n object.addObserver('inc', this, function () {\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n });\n\n // now run\n object.set('changer', 'bar');\n }\n\n ['@test setting one of two computed properties that depend on a third property should clear the kvo cache'](assert) {\n // we have to call set twice to fill up the cache\n object.set('isOff', true);\n object.set('isOn', true);\n\n // setting isOff to true should clear the kvo cache\n object.set('isOff', true);\n assert.equal(object.get('isOff'), true, 'object.isOff should be true');\n assert.equal(object.get('isOn'), false, 'object.isOn should be false');\n }\n\n ['@test dependent keys should be able to be specified as property paths'](assert) {\n var depObj = ObservableObject.extend({\n menuPrice: (0, _metal.computed)(function () {\n return this.get('menu.price');\n }).property('menu.price')\n }).create({\n menu: ObservableObject.create({\n price: 5\n })\n });\n\n assert.equal(depObj.get('menuPrice'), 5, 'precond - initial value returns 5');\n\n depObj.set('menu.price', 6);\n\n assert.equal(depObj.get('menuPrice'), 6, 'cache is properly invalidated after nested property changes');\n }\n\n ['@test cacheable nested dependent keys should clear after their dependencies update'](assert) {\n assert.ok(true);\n\n var DepObj;\n\n (0, _runloop.run)(function () {\n lookup.DepObj = DepObj = ObservableObject.extend({\n price: (0, _metal.computed)('restaurant.menu.price', function () {\n return this.get('restaurant.menu.price');\n })\n }).create({\n restaurant: ObservableObject.create({\n menu: ObservableObject.create({\n price: 5\n })\n })\n });\n });\n\n assert.equal(DepObj.get('price'), 5, 'precond - computed property is correct');\n\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu.price', 10);\n });\n assert.equal(DepObj.get('price'), 10, 'cacheable computed properties are invalidated even if no run loop occurred');\n\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu.price', 20);\n });\n assert.equal(DepObj.get('price'), 20, 'cacheable computed properties are invalidated after a second get before a run loop');\n assert.equal(DepObj.get('price'), 20, 'precond - computed properties remain correct after a run loop');\n\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 15\n }));\n });\n\n assert.equal(DepObj.get('price'), 15, 'cacheable computed properties are invalidated after a middle property changes');\n\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 25\n }));\n });\n\n assert.equal(DepObj.get('price'), 25, 'cacheable computed properties are invalidated after a middle property changes again, before a run loop');\n }\n });\n\n // ..........................................................\n // OBSERVABLE OBJECTS\n //\n\n (0, _internalTestHelpers.moduleFor)('Observable objects & object properties ', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n getEach() {\n var keys = ['normal', 'abnormal'];\n var ret = [];\n for (var idx = 0; idx < keys.length; idx++) {\n ret[ret.length] = this.get(keys[idx]);\n }\n return ret;\n },\n\n newObserver() {\n this.abnormal = 'changedValueObserved';\n },\n\n testObserver: (0, _metal.observer)('normal', function () {\n this.abnormal = 'removedObserver';\n }),\n\n testArrayObserver: (0, _metal.observer)('normalArray.[]', function () {\n this.abnormal = 'notifiedObserver';\n })\n }).create({\n normal: 'value',\n abnormal: 'zeroValue',\n numberVal: 24,\n toggleVal: true,\n observedProperty: 'beingWatched',\n testRemove: 'observerToBeRemoved',\n normalArray: (0, _array.A)([1, 2, 3, 4, 5])\n });\n }\n\n ['@test incrementProperty and decrementProperty'](assert) {\n var newValue = object.incrementProperty('numberVal');\n\n assert.equal(25, newValue, 'numerical value incremented');\n object.numberVal = 24;\n newValue = object.decrementProperty('numberVal');\n assert.equal(23, newValue, 'numerical value decremented');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', 5);\n assert.equal(30, newValue, 'numerical value incremented by specified increment');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', -5);\n assert.equal(20, newValue, 'minus numerical value incremented by specified increment');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', 0);\n assert.equal(25, newValue, 'zero numerical value incremented by specified increment');\n\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 0 - void 0); // Increment by NaN\n }, /Must pass a numeric value to incrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 'Ember'); // Increment by non-numeric String\n }, /Must pass a numeric value to incrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 1 / 0); // Increment by Infinity\n }, /Must pass a numeric value to incrementProperty/i);\n\n assert.equal(25, newValue, 'Attempting to increment by non-numeric values should not increment value');\n\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', 5);\n assert.equal(20, newValue, 'numerical value decremented by specified increment');\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', -5);\n assert.equal(30, newValue, 'minus numerical value decremented by specified increment');\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', 0);\n assert.equal(25, newValue, 'zero numerical value decremented by specified increment');\n\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 0 - void 0); // Decrement by NaN\n }, /Must pass a numeric value to decrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 'Ember'); // Decrement by non-numeric String\n }, /Must pass a numeric value to decrementProperty/i);\n\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 1 / 0); // Decrement by Infinity\n }, /Must pass a numeric value to decrementProperty/i);\n\n assert.equal(25, newValue, 'Attempting to decrement by non-numeric values should not decrement value');\n }\n\n ['@test toggle function, should be boolean'](assert) {\n assert.equal(object.toggleProperty('toggleVal', true, false), object.get('toggleVal'));\n assert.equal(object.toggleProperty('toggleVal', true, false), object.get('toggleVal'));\n assert.equal(object.toggleProperty('toggleVal', undefined, undefined), object.get('toggleVal'));\n }\n\n ['@test should notify array observer when array changes'](assert) {\n (0, _metal.get)(object, 'normalArray').replace(0, 0, [6]);\n assert.equal(object.abnormal, 'notifiedObserver', 'observer should be notified');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('object.addObserver()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectC = ObservableObject.create({\n objectE: ObservableObject.create({\n propertyVal: 'chainedProperty'\n }),\n\n normal: 'value',\n normal1: 'zeroValue',\n normal2: 'dependentValue',\n incrementor: 10,\n\n action() {\n this.normal1 = 'newZeroValue';\n },\n\n observeOnceAction() {\n this.incrementor = this.incrementor + 1;\n },\n\n chainedObserver() {\n this.normal2 = 'chainedPropertyObserved';\n }\n });\n }\n\n ['@test should register an observer for a property'](assert) {\n ObjectC.addObserver('normal', ObjectC, 'action');\n ObjectC.set('normal', 'newValue');\n assert.equal(ObjectC.normal1, 'newZeroValue');\n }\n\n ['@test should register an observer for a property - Special case of chained property'](assert) {\n ObjectC.addObserver('objectE.propertyVal', ObjectC, 'chainedObserver');\n ObjectC.objectE.set('propertyVal', 'chainedPropertyValue');\n assert.equal('chainedPropertyObserved', ObjectC.normal2);\n ObjectC.normal2 = 'dependentValue';\n ObjectC.set('objectE', '');\n assert.equal('chainedPropertyObserved', ObjectC.normal2);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('object.removeObserver()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectD = ObservableObject.create({\n objectF: ObservableObject.create({\n propertyVal: 'chainedProperty'\n }),\n\n normal: 'value',\n normal1: 'zeroValue',\n normal2: 'dependentValue',\n ArrayKeys: ['normal', 'normal1'],\n\n addAction() {\n this.normal1 = 'newZeroValue';\n },\n removeAction() {\n this.normal2 = 'newDependentValue';\n },\n removeChainedObserver() {\n this.normal2 = 'chainedPropertyObserved';\n },\n\n observableValue: 'hello world',\n\n observer1() {\n // Just an observer\n },\n observer2() {\n this.removeObserver('observableValue', null, 'observer1');\n this.removeObserver('observableValue', null, 'observer2');\n this.hasObserverFor('observableValue'); // Tickle 'getMembers()'\n this.removeObserver('observableValue', null, 'observer3');\n },\n observer3() {\n // Just an observer\n }\n });\n }\n\n ['@test should unregister an observer for a property'](assert) {\n ObjectD.addObserver('normal', ObjectD, 'addAction');\n ObjectD.set('normal', 'newValue');\n assert.equal(ObjectD.normal1, 'newZeroValue');\n\n ObjectD.set('normal1', 'zeroValue');\n\n ObjectD.removeObserver('normal', ObjectD, 'addAction');\n ObjectD.set('normal', 'newValue');\n assert.equal(ObjectD.normal1, 'zeroValue');\n }\n\n [\"@test should unregister an observer for a property - special case when key has a '.' in it.\"](assert) {\n ObjectD.addObserver('objectF.propertyVal', ObjectD, 'removeChainedObserver');\n ObjectD.objectF.set('propertyVal', 'chainedPropertyValue');\n ObjectD.removeObserver('objectF.propertyVal', ObjectD, 'removeChainedObserver');\n ObjectD.normal2 = 'dependentValue';\n ObjectD.objectF.set('propertyVal', 'removedPropertyValue');\n assert.equal('dependentValue', ObjectD.normal2);\n ObjectD.set('objectF', '');\n assert.equal('dependentValue', ObjectD.normal2);\n }\n\n ['@test removing an observer inside of an observer shouldn’t cause any problems'](assert) {\n // The observable system should be protected against clients removing\n // observers in the middle of observer notification.\n var encounteredError = false;\n try {\n ObjectD.addObserver('observableValue', null, 'observer1');\n ObjectD.addObserver('observableValue', null, 'observer2');\n ObjectD.addObserver('observableValue', null, 'observer3');\n (0, _runloop.run)(function () {\n ObjectD.set('observableValue', 'hi world');\n });\n } catch (e) {\n encounteredError = true;\n }\n assert.equal(encounteredError, false);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/mixins/observable/propertyChanges_test', ['@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/observable', '@ember/-internals/metal', 'internal-test-helpers'], function (_object, _observable, _metal, _internalTestHelpers) {\n 'use strict';\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * Create ObservableObject which includes Ember.Observable\n * Remove test that tests internal _kvo_changeLevel property. This is an\n implementation detail.\n * Remove test for allPropertiesDidChange\n * Removed star observer test. no longer supported\n * Removed property revision test. no longer supported\n */\n\n // ========================================================================\n // Ember.Observable Tests\n // ========================================================================\n\n const ObservableObject = _object.default.extend(_observable.default);\n\n let ObjectA;\n\n (0, _internalTestHelpers.moduleFor)('object.propertyChanges', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectA = ObservableObject.extend({\n action: (0, _metal.observer)('foo', function () {\n this.set('prop', 'changedPropValue');\n }),\n notifyAction: (0, _metal.observer)('newFoo', function () {\n this.set('newProp', 'changedNewPropValue');\n }),\n\n notifyAllAction: (0, _metal.observer)('prop', function () {\n this.set('newFoo', 'changedNewFooValue');\n }),\n\n starObserver(target, key) {\n this.starProp = key;\n }\n }).create({\n starProp: null,\n\n foo: 'fooValue',\n prop: 'propValue',\n\n newFoo: 'newFooValue',\n newProp: 'newPropValue'\n });\n }\n\n ['@test should observe the changes within the nested begin / end property changes'](assert) {\n //start the outer nest\n ObjectA.beginPropertyChanges();\n\n // Inner nest\n ObjectA.beginPropertyChanges();\n ObjectA.set('foo', 'changeFooValue');\n\n assert.equal(ObjectA.prop, 'propValue');\n ObjectA.endPropertyChanges();\n\n //end inner nest\n ObjectA.set('prop', 'changePropValue');\n assert.equal(ObjectA.newFoo, 'newFooValue');\n\n //close the outer nest\n ObjectA.endPropertyChanges();\n\n assert.equal(ObjectA.prop, 'changedPropValue');\n assert.equal(ObjectA.newFoo, 'changedNewFooValue');\n }\n\n ['@test should observe the changes within the begin and end property changes'](assert) {\n ObjectA.beginPropertyChanges();\n ObjectA.set('foo', 'changeFooValue');\n\n assert.equal(ObjectA.prop, 'propValue');\n ObjectA.endPropertyChanges();\n\n assert.equal(ObjectA.prop, 'changedPropValue');\n }\n\n ['@test should indicate that the property of an object has just changed'](assert) {\n //change the value of foo.\n ObjectA.set('foo', 'changeFooValue');\n\n // Indicate the subscribers of foo that the value has just changed\n ObjectA.notifyPropertyChange('foo', null);\n\n // Values of prop has just changed\n assert.equal(ObjectA.prop, 'changedPropValue');\n }\n\n ['@test should notify that the property of an object has changed'](assert) {\n // Notify to its subscriber that the values of 'newFoo' will be changed. In this\n // case the observer is \"newProp\". Therefore this will call the notifyAction function\n // and value of \"newProp\" will be changed.\n ObjectA.notifyPropertyChange('newFoo', 'fooValue');\n\n //value of newProp changed.\n assert.equal(ObjectA.newProp, 'changedNewPropValue');\n }\n\n ['@test should invalidate function property cache when notifyPropertyChange is called'](assert) {\n let a = ObservableObject.extend({\n b: (0, _metal.computed)({\n get() {\n return this._b;\n },\n set(key, value) {\n this._b = value;\n return this;\n }\n }).volatile()\n }).create({\n _b: null\n });\n\n a.set('b', 'foo');\n assert.equal(a.get('b'), 'foo', 'should have set the correct value for property b');\n\n a._b = 'bar';\n a.notifyPropertyChange('b');\n a.set('b', 'foo');\n assert.equal(a.get('b'), 'foo', 'should have invalidated the cache so that the newly set value is actually set');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/system/object/base_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * Changed get(obj, ) and set(obj, ) to Ember.get() and Ember.set()\n * Removed obj.instanceOf() and obj.kindOf() tests. use obj instanceof Foo\n instead\n * Removed respondsTo() and tryToPerform() tests. Can be brought back in a\n utils package.\n * Removed destroy() test. You can impl yourself but not built in\n * Changed Class.subclassOf() test to Class.detect()\n * Remove broken test for 'superclass' property.\n * Removed obj.didChangeFor()\n */\n\n // ========================================================================\n // EmberObject Base Tests\n // ========================================================================\n\n let obj, obj1; // global variables\n\n (0, _internalTestHelpers.moduleFor)('A new EmberObject instance', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _object.default.create({\n foo: 'bar',\n total: 12345,\n aMethodThatExists() {},\n aMethodThatReturnsTrue() {\n return true;\n },\n aMethodThatReturnsFoobar() {\n return 'Foobar';\n },\n aMethodThatReturnsFalse() {\n return false;\n }\n });\n }\n\n afterEach() {\n obj = undefined;\n }\n\n ['@test Should return its properties when requested using EmberObject#get'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n assert.equal((0, _metal.get)(obj, 'total'), 12345);\n }\n\n ['@test Should allow changing of those properties by calling EmberObject#set'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n assert.equal((0, _metal.get)(obj, 'total'), 12345);\n\n (0, _metal.set)(obj, 'foo', 'Chunky Bacon');\n (0, _metal.set)(obj, 'total', 12);\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'Chunky Bacon');\n assert.equal((0, _metal.get)(obj, 'total'), 12);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('EmberObject superclass and subclasses', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _object.default.extend({\n method1() {\n return 'hello';\n }\n });\n obj1 = obj.extend();\n }\n\n afterEach() {\n obj = undefined;\n obj1 = undefined;\n }\n\n ['@test Checking the detect() function on an object and its subclass'](assert) {\n assert.equal(obj.detect(obj1), true);\n assert.equal(obj1.detect(obj), false);\n }\n\n ['@test Checking the detectInstance() function on an object and its subclass'](assert) {\n assert.ok(_object.default.detectInstance(obj.create()));\n assert.ok(obj.detectInstance(obj.create()));\n }\n });\n});","enifed('@ember/-internals/runtime/tests/legacy_1x/system/object/concatenated_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * changed get(obj, ) and set(obj, ) to Ember.get() and Ember.set()\n * converted uses of obj.isEqual() to use deepEqual() test since isEqual is not\n always defined\n */\n\n function K() {\n return this;\n }\n\n let klass;\n\n (0, _internalTestHelpers.moduleFor)('EmberObject Concatenated Properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n klass = _object.default.extend({\n concatenatedProperties: ['values', 'functions'],\n values: ['a', 'b', 'c'],\n functions: [K]\n });\n }\n\n ['@test concatenates instances'](assert) {\n let obj = klass.create({\n values: ['d', 'e', 'f']\n });\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates subclasses'](assert) {\n let subKlass = klass.extend({\n values: ['d', 'e', 'f']\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates reopen'](assert) {\n klass.reopen({\n values: ['d', 'e', 'f']\n });\n let obj = klass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates mixin'](assert) {\n let mixin = {\n values: ['d', 'e']\n };\n let subKlass = klass.extend(mixin, {\n values: ['f']\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates reopen, subclass, and instance'](assert) {\n klass.reopen({ values: ['d'] });\n let subKlass = klass.extend({ values: ['e'] });\n let obj = subKlass.create({ values: ['f'] });\n\n let values = (0, _metal.get)(obj, 'values');\n let expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates subclasses when the values are functions'](assert) {\n let subKlass = klass.extend({\n functions: K\n });\n let obj = subKlass.create();\n\n let values = (0, _metal.get)(obj, 'functions');\n let expected = [K, K];\n\n assert.deepEqual(values, expected, `should concatenate functions property (expected: ${expected}, got: ${values})`);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/array_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_metal, _object, _array, _internalTestHelpers) {\n 'use strict';\n\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n const TestArray = _object.default.extend(_array.default, {\n _content: null,\n\n init() {\n this._content = this._content || [];\n },\n\n // some methods to modify the array so we can test changes. Note that\n // arrays can be modified even if they don't implement MutableArray. The\n // MutableArray is just a standard API for mutation but not required.\n addObject(obj) {\n let idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n this._content.push(obj);\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n this._content.shift();\n (0, _metal.arrayContentDidChange)(this, 0, 1, 0);\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n })\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.Array', class extends _internalTestHelpers.AbstractTestCase {\n ['@test the return value of slice has Ember.Array applied'](assert) {\n let x = _object.default.extend(_array.default).create({\n length: 0\n });\n let y = x.slice(1);\n assert.equal(_array.default.detect(y), true, 'mixin should be applied');\n }\n\n ['@test slice supports negative index arguments'](assert) {\n let testArray = TestArray.create({ _content: [1, 2, 3, 4] });\n\n assert.deepEqual(testArray.slice(-2), [3, 4], 'slice(-2)');\n assert.deepEqual(testArray.slice(-2, -1), [3], 'slice(-2, -1');\n assert.deepEqual(testArray.slice(-2, -2), [], 'slice(-2, -2)');\n assert.deepEqual(testArray.slice(-1, -2), [], 'slice(-1, -2)');\n\n assert.deepEqual(testArray.slice(-4, 1), [1], 'slice(-4, 1)');\n assert.deepEqual(testArray.slice(-4, 5), [1, 2, 3, 4], 'slice(-4, 5)');\n assert.deepEqual(testArray.slice(-4), [1, 2, 3, 4], 'slice(-4)');\n\n assert.deepEqual(testArray.slice(0, -1), [1, 2, 3], 'slice(0, -1)');\n assert.deepEqual(testArray.slice(0, -4), [], 'slice(0, -4)');\n assert.deepEqual(testArray.slice(0, -3), [1], 'slice(0, -3)');\n }\n });\n\n // ..........................................................\n // CONTENT DID CHANGE\n //\n\n const DummyArray = _object.default.extend(_array.default, {\n length: 0,\n objectAt(idx) {\n return 'ITEM-' + idx;\n }\n });\n\n let obj, observer;\n\n // ..........................................................\n // NOTIFY ARRAY OBSERVERS\n //\n\n (0, _internalTestHelpers.moduleFor)('mixins/array/arrayContent[Will|Did]Change', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should notify observers of []'](assert) {\n obj = DummyArray.extend({\n enumerablePropertyDidChange: (0, _metal.observer)('[]', function () {\n this._count++;\n })\n }).create({\n _count: 0\n });\n\n assert.equal(obj._count, 0, 'should not have invoked yet');\n\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n\n assert.equal(obj._count, 1, 'should have invoked');\n }\n });\n\n // ..........................................................\n // NOTIFY CHANGES TO LENGTH\n //\n\n (0, _internalTestHelpers.moduleFor)('notify observers of length', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach(assert) {\n obj = DummyArray.extend({\n lengthDidChange: (0, _metal.observer)('length', function () {\n this._after++;\n })\n }).create({\n _after: 0\n });\n\n assert.equal(obj._after, 0, 'should not have fired yet');\n }\n\n afterEach() {\n obj = null;\n }\n\n ['@test should notify observers when call with no params'](assert) {\n (0, _metal.arrayContentWillChange)(obj);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj);\n assert.equal(obj._after, 1);\n }\n\n // API variation that included items only\n ['@test should not notify when passed lengths are same'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n assert.equal(obj._after, 0);\n }\n\n ['@test should notify when passed lengths are different'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 2);\n assert.equal(obj._after, 0);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 2);\n assert.equal(obj._after, 1);\n }\n });\n\n // ..........................................................\n // NOTIFY ARRAY OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('notify array observers', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach(assert) {\n obj = DummyArray.create();\n\n observer = _object.default.extend({\n arrayWillChange() {\n assert.equal(this._before, null); // should only call once\n this._before = Array.prototype.slice.call(arguments);\n },\n\n arrayDidChange() {\n assert.equal(this._after, null); // should only call once\n this._after = Array.prototype.slice.call(arguments);\n }\n }).create({\n _before: null,\n _after: null\n });\n\n (0, _metal.addArrayObserver)(obj, observer);\n }\n\n afterEach() {\n obj = observer = null;\n }\n\n ['@test should notify array observers when called with no params'](assert) {\n (0, _metal.arrayContentWillChange)(obj);\n assert.deepEqual(observer._before, [obj, 0, -1, -1]);\n\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, [obj, 0, -1, -1]);\n }\n\n // API variation that included items only\n ['@test should notify when called with same length items'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n assert.deepEqual(observer._before, [obj, 0, 1, 1]);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n assert.deepEqual(observer._after, [obj, 0, 1, 1]);\n }\n\n ['@test should notify when called with diff length items'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 2, 1);\n assert.deepEqual(observer._before, [obj, 0, 2, 1]);\n\n (0, _metal.arrayContentDidChange)(obj, 0, 2, 1);\n assert.deepEqual(observer._after, [obj, 0, 2, 1]);\n }\n\n ['@test removing array observer should disable'](assert) {\n (0, _metal.removeArrayObserver)(obj, observer);\n (0, _metal.arrayContentWillChange)(obj);\n assert.deepEqual(observer._before, null);\n\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, null);\n }\n });\n\n // ..........................................................\n // @each\n //\n\n let ary;\n\n (0, _internalTestHelpers.moduleFor)('EmberArray.@each support', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ary = TestArray.create({\n _content: [{ isDone: true, desc: 'Todo 1' }, { isDone: false, desc: 'Todo 2' }, { isDone: true, desc: 'Todo 3' }, { isDone: false, desc: 'Todo 4' }]\n });\n }\n\n afterEach() {\n ary = null;\n }\n\n ['@test adding an object should notify (@each.isDone)'](assert) {\n let called = 0;\n\n let observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n });\n\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n\n ary.addObject(_object.default.create({\n desc: 'foo',\n isDone: false\n }));\n\n assert.equal(called, 1, 'calls observer when object is pushed');\n }\n\n ['@test getting @each is deprecated'](assert) {\n assert.expect(1);\n\n expectDeprecation(() => {\n (0, _metal.get)(ary, '@each');\n }, /Getting the '@each' property on object .* is deprecated/);\n }\n\n ['@test @each is readOnly'](assert) {\n assert.expect(1);\n\n assert.throws(function () {\n (0, _metal.set)(ary, '@each', 'foo');\n }, /Cannot set read-only property \"@each\"/);\n }\n\n ['@test using @each to observe arrays that does not return objects raise error'](assert) {\n let called = 0;\n\n let observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n });\n\n ary = TestArray.create({\n objectAt(idx) {\n return (0, _metal.get)(this._content[idx], 'desc');\n }\n });\n\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n\n expectAssertion(() => {\n ary.addObject(_object.default.create({\n desc: 'foo',\n isDone: false\n }));\n }, /When using @each to observe the array/);\n\n assert.equal(called, 0, 'not calls observer when object is pushed');\n }\n\n ['@test modifying the array should also indicate the isDone prop itself has changed'](assert) {\n // NOTE: we never actually get the '@each.isDone' property here. This is\n // important because it tests the case where we don't have an isDone\n // EachArray materialized but just want to know when the property has\n // changed.\n let each;\n expectDeprecation(() => {\n each = (0, _metal.get)(ary, '@each');\n });\n let count = 0;\n\n (0, _metal.addObserver)(each, 'isDone', () => count++);\n\n count = 0;\n let item = (0, _metal.objectAt)(ary, 2);\n (0, _metal.set)(item, 'isDone', !(0, _metal.get)(item, 'isDone'));\n assert.equal(count, 1, '@each.isDone should have notified');\n }\n\n ['@test `objectAt` returns correct object'](assert) {\n let arr = ['first', 'second', 'third', 'fourth'];\n assert.equal((0, _metal.objectAt)(arr, 2), 'third');\n assert.equal((0, _metal.objectAt)(arr, 4), undefined);\n }\n\n ['@test should be clear caches for computed properties that have dependent keys on arrays that are changed after object initialization'](assert) {\n let obj = _object.default.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'resources', (0, _array.A)());\n },\n\n common: (0, _metal.computed)('resources.@each.common', function () {\n return (0, _metal.get)((0, _metal.objectAt)((0, _metal.get)(this, 'resources'), 0), 'common');\n })\n }).create();\n\n (0, _metal.get)(obj, 'resources').pushObject(_object.default.create({ common: 'HI!' }));\n assert.equal('HI!', (0, _metal.get)(obj, 'common'));\n\n (0, _metal.set)((0, _metal.objectAt)((0, _metal.get)(obj, 'resources'), 0), 'common', 'BYE!');\n assert.equal('BYE!', (0, _metal.get)(obj, 'common'));\n }\n\n ['@test observers that contain @each in the path should fire only once the first time they are accessed'](assert) {\n let count = 0;\n\n let obj = _object.default.extend({\n init() {\n this._super(...arguments);\n // Observer does not fire on init\n (0, _metal.set)(this, 'resources', (0, _array.A)());\n },\n\n commonDidChange: (0, _metal.observer)('resources.@each.common', () => count++)\n }).create();\n\n // Observer fires second time when new object is added\n (0, _metal.get)(obj, 'resources').pushObject(_object.default.create({ common: 'HI!' }));\n // Observer fires third time when property on an object is changed\n (0, _metal.set)((0, _metal.objectAt)((0, _metal.get)(obj, 'resources'), 0), 'common', 'BYE!');\n\n assert.equal(count, 2, 'observers should only be called once');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/comparable_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/compare', '@ember/-internals/runtime/lib/mixins/comparable', 'internal-test-helpers'], function (_metal, _object, _compare, _comparable, _internalTestHelpers) {\n 'use strict';\n\n const Rectangle = _object.default.extend(_comparable.default, {\n length: 0,\n width: 0,\n\n area() {\n return (0, _metal.get)(this, 'length') * (0, _metal.get)(this, 'width');\n },\n\n compare(a, b) {\n return (0, _compare.default)(a.area(), b.area());\n }\n });\n\n let r1, r2;\n\n (0, _internalTestHelpers.moduleFor)('Comparable', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n r1 = Rectangle.create({ length: 6, width: 12 });\n r2 = Rectangle.create({ length: 6, width: 13 });\n }\n\n ['@test should be comparable and return the correct result'](assert) {\n assert.equal(_comparable.default.detect(r1), true);\n assert.equal((0, _compare.default)(r1, r1), 0);\n assert.equal((0, _compare.default)(r1, r2), -1);\n assert.equal((0, _compare.default)(r2, r1), 1);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/container_proxy_test', ['@ember/-internals/owner', '@ember/-internals/container', '@ember/-internals/runtime/lib/mixins/container_proxy', '@ember/-internals/runtime/lib/system/object', '@ember/runloop', 'internal-test-helpers'], function (_owner, _container, _container_proxy, _object, _runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/runtime/mixins/container_proxy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n this.Owner = _object.default.extend(_container_proxy.default);\n this.instance = this.Owner.create();\n\n this.registry = new _container.Registry();\n\n this.instance.__container__ = new _container.Container(this.registry, {\n owner: this.instance\n });\n }\n\n ['@test provides ownerInjection helper method'](assert) {\n let result = this.instance.ownerInjection();\n\n assert.equal(result[_owner.OWNER], this.instance, 'returns an object with the OWNER symbol');\n }\n\n ['@test actions queue completes before destruction'](assert) {\n assert.expect(1);\n\n this.registry.register('service:auth', _object.default.extend({\n willDestroy() {\n assert.ok((0, _owner.getOwner)(this).lookup('service:auth'), 'can still lookup');\n }\n }));\n\n let service = this.instance.lookup('service:auth');\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', service, 'destroy');\n this.instance.destroy();\n });\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/enumerable_test', ['@ember/-internals/runtime/lib/mixins/enumerable', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_enumerable, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Enumerable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be mixed into A()'](assert) {\n assert.ok(_enumerable.default.detect((0, _array.A)()));\n }\n\n ['@test should be mixed into ArrayProxy'](assert) {\n assert.ok(_enumerable.default.detect(_array_proxy.default.create()));\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/evented_test', ['@ember/-internals/runtime/lib/mixins/evented', '@ember/-internals/runtime/lib/system/core_object', 'internal-test-helpers'], function (_evented, _core_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.Evented', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works properly on proxy-ish objects'](assert) {\n let eventedProxyObj = _core_object.default.extend(_evented.default, {\n unknownProperty() {\n return true;\n }\n }).create();\n\n let noop = function () {};\n\n eventedProxyObj.on('foo', noop);\n eventedProxyObj.off('foo', noop);\n\n assert.ok(true, 'An assertion was triggered');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/mutable_enumerable_test', ['@ember/-internals/runtime/lib/mixins/mutable_enumerable', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_mutable_enumerable, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('MutableEnumerable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be mixed into A()'](assert) {\n assert.ok(_mutable_enumerable.default.detect((0, _array.A)()));\n }\n\n ['@test should be mixed into ArrayProxy'](assert) {\n assert.ok(_mutable_enumerable.default.detect(_array_proxy.default.create()));\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/observable_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('mixins/observable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be able to use getProperties to get a POJO of provided keys'](assert) {\n let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n let pojo = obj.getProperties('firstName', 'lastName');\n assert.equal('Steve', pojo.firstName);\n assert.equal('Jobs', pojo.lastName);\n }\n\n ['@test should be able to use getProperties with array parameter to get a POJO of provided keys'](assert) {\n let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n let pojo = obj.getProperties(['firstName', 'lastName']);\n assert.equal('Steve', pojo.firstName);\n assert.equal('Jobs', pojo.lastName);\n }\n\n ['@test should be able to use setProperties to set multiple properties at once'](assert) {\n let obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n obj.setProperties({ firstName: 'Tim', lastName: 'Cook' });\n assert.equal('Tim', obj.get('firstName'));\n assert.equal('Cook', obj.get('lastName'));\n }\n\n ['@test calling setProperties completes safely despite exceptions'](assert) {\n let exc = new Error('Something unexpected happened!');\n let obj = _object.default.extend({\n companyName: (0, _metal.computed)({\n get() {\n return 'Apple, Inc.';\n },\n set() {\n throw exc;\n }\n })\n }).create({\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n\n let firstNameChangedCount = 0;\n\n (0, _metal.addObserver)(obj, 'firstName', () => firstNameChangedCount++);\n\n try {\n obj.setProperties({\n firstName: 'Tim',\n lastName: 'Cook',\n companyName: 'Fruit Co., Inc.'\n });\n } catch (err) {\n if (err !== exc) {\n throw err;\n }\n }\n\n assert.equal(firstNameChangedCount, 1, 'firstName should have fired once');\n }\n\n ['@test should be able to retrieve cached values of computed properties without invoking the computed property'](assert) {\n let obj = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'foo';\n })\n }).create({\n bar: 'bar'\n });\n\n assert.equal(obj.cacheFor('foo'), undefined, 'should return undefined if no value has been cached');\n (0, _metal.get)(obj, 'foo');\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo', 'precond - should cache the value');\n assert.equal(obj.cacheFor('foo'), 'foo', 'should return the cached value after it is invoked');\n\n assert.equal(obj.cacheFor('bar'), undefined, 'returns undefined if the value is not a computed property');\n }\n\n ['@test incrementProperty should work even if value is number in string'](assert) {\n let obj = _object.default.create({\n age: '24'\n });\n obj.incrementProperty('age');\n assert.equal(25, obj.get('age'));\n }\n\n ['@test propertyWillChange triggers a deprecation warning']() {\n let obj = _object.default.create();\n\n expectDeprecation(() => {\n obj.propertyWillChange('foo');\n }, /'propertyWillChange' is deprecated and has no effect. It is safe to remove this call./);\n }\n\n ['@test propertyDidChange triggers a deprecation warning']() {\n let obj = _object.default.create();\n\n expectDeprecation(() => {\n obj.propertyDidChange('foo');\n }, /'propertyDidChange' is deprecated in favor of 'notifyPropertyChange'. It is safe to change this call to 'notifyPropertyChange'./);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/promise_proxy_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object_proxy', '@ember/-internals/runtime/lib/mixins/promise_proxy', '@ember/-internals/runtime/lib/ext/rsvp', 'rsvp', 'internal-test-helpers'], function (_runloop, _metal, _object_proxy, _promise_proxy, _rsvp, _rsvp2, _internalTestHelpers) {\n 'use strict';\n\n let ObjectPromiseProxy;\n\n (0, _internalTestHelpers.moduleFor)('Ember.PromiseProxy - ObjectProxy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectPromiseProxy = _object_proxy.default.extend(_promise_proxy.default);\n }\n\n afterEach() {\n _rsvp2.on('error', _rsvp.onerrorDefault);\n }\n\n ['@test present on ember namespace'](assert) {\n assert.ok(_promise_proxy.default, 'expected PromiseProxyMixin to exist');\n }\n\n ['@test no promise, invoking then should raise'](assert) {\n let proxy = ObjectPromiseProxy.create();\n\n assert.throws(function () {\n proxy.then(function () {\n return this;\n }, function () {\n return this;\n });\n }, new RegExp(\"PromiseProxy's promise must be set\"));\n }\n\n ['@test fulfillment'](assert) {\n let value = {\n firstName: 'stef',\n lastName: 'penner'\n };\n\n let deferred = _rsvp2.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'resolve', value);\n\n assert.equal(didFulfillCount, 1, 'should have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not have been rejected');\n\n assert.equal((0, _metal.get)(proxy, 'content'), value, 'expects the proxy to have content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to still have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled');\n\n (0, _runloop.run)(deferred, 'resolve', value);\n\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n\n (0, _runloop.run)(deferred, 'reject', value);\n\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n\n assert.equal((0, _metal.get)(proxy, 'content'), value, 'expects the proxy to have still have same content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy still to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled');\n\n // rest of the promise semantics are tested in directly in RSVP\n }\n\n ['@test rejection'](assert) {\n let reason = new Error('failure');\n let deferred = _rsvp2.defer();\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'reject', reason);\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), reason, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n (0, _runloop.run)(deferred, 'reject', reason);\n\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n\n (0, _runloop.run)(deferred, 'resolve', 1);\n\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), reason, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n }\n\n // https://github.com/emberjs/ember.js/issues/15694\n ['@test rejection without specifying reason'](assert) {\n let deferred = _rsvp2.defer();\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n let didFulfillCount = 0;\n let didRejectCount = 0;\n\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n\n (0, _runloop.run)(deferred, 'reject');\n\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n }\n\n [\"@test unhandled rejects still propagate to RSVP.on('error', ...) \"](assert) {\n assert.expect(1);\n\n _rsvp2.on('error', onerror);\n _rsvp2.off('error', _rsvp.onerrorDefault);\n\n let expectedReason = new Error('failure');\n let deferred = _rsvp2.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.get('promise');\n\n function onerror(reason) {\n assert.equal(reason, expectedReason, 'expected reason');\n }\n\n _rsvp2.on('error', onerror);\n _rsvp2.off('error', _rsvp.onerrorDefault);\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\n _rsvp2.on('error', _rsvp.onerrorDefault);\n _rsvp2.off('error', onerror);\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\n _rsvp2.on('error', _rsvp.onerrorDefault);\n _rsvp2.off('error', onerror);\n }\n\n ['@test should work with promise inheritance'](assert) {\n class PromiseSubclass extends _rsvp2.Promise {}\n\n let proxy = ObjectPromiseProxy.create({\n promise: new PromiseSubclass(() => {})\n });\n\n assert.ok(proxy.then() instanceof PromiseSubclass, 'promise proxy respected inheritance');\n }\n\n ['@test should reset isFulfilled and isRejected when promise is reset'](assert) {\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n (0, _runloop.run)(deferred, 'resolve');\n\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled');\n\n let anotherDeferred = _rsvp.default.defer();\n proxy.set('promise', anotherDeferred.promise);\n\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n\n (0, _runloop.run)(anotherDeferred, 'reject');\n\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n }\n\n ['@test should have content when isFulfilled is set'](assert) {\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.addObserver('isFulfilled', () => assert.equal((0, _metal.get)(proxy, 'content'), true));\n\n (0, _runloop.run)(deferred, 'resolve', true);\n }\n\n ['@test should have reason when isRejected is set'](assert) {\n let error = new Error('Y U REJECT?!?');\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.addObserver('isRejected', () => assert.equal((0, _metal.get)(proxy, 'reason'), error));\n\n try {\n (0, _runloop.run)(deferred, 'reject', error);\n } catch (e) {\n assert.equal(e, error);\n }\n }\n\n ['@test should not error if promise is resolved after proxy has been destroyed'](assert) {\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'resolve', true);\n\n assert.ok(true, 'resolving the promise after the proxy has been destroyed does not raise an error');\n }\n\n ['@test should not error if promise is rejected after proxy has been destroyed'](assert) {\n let deferred = _rsvp.default.defer();\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'reject', 'some reason');\n\n assert.ok(true, 'rejecting the promise after the proxy has been destroyed does not raise an error');\n }\n\n ['@test promise chain is not broken if promised is resolved after proxy has been destroyed'](assert) {\n let deferred = _rsvp.default.defer();\n let expectedValue = {};\n let receivedValue;\n let didResolveCount = 0;\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(value => {\n receivedValue = value;\n didResolveCount++;\n }, () => {});\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'resolve', expectedValue);\n\n assert.equal(didResolveCount, 1, 'callback called');\n assert.equal(receivedValue, expectedValue, 'passed value is the value the promise was resolved with');\n }\n\n ['@test promise chain is not broken if promised is rejected after proxy has been destroyed'](assert) {\n let deferred = _rsvp.default.defer();\n let expectedReason = 'some reason';\n let receivedReason;\n let didRejectCount = 0;\n\n let proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n\n proxy.then(() => {}, reason => {\n receivedReason = reason;\n didRejectCount++;\n });\n\n (0, _runloop.run)(proxy, 'destroy');\n\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n\n assert.equal(didRejectCount, 1, 'callback called');\n assert.equal(receivedReason, expectedReason, 'passed reason is the reason the promise was rejected for');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mixins/target_action_support_test', ['@ember/-internals/environment', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/target_action_support', 'internal-test-helpers'], function (_environment, _object, _target_action_support, _internalTestHelpers) {\n 'use strict';\n\n let originalLookup = _environment.context.lookup;\n let lookup;\n\n (0, _internalTestHelpers.moduleFor)('TargetActionSupport', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n _environment.context.lookup = lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test it should return false if no target or action are specified'](assert) {\n assert.expect(1);\n\n let obj = _object.default.extend(_target_action_support.default).create();\n\n assert.ok(false === obj.triggerAction(), 'no target or action was specified');\n }\n\n ['@test it should support actions specified as strings'](assert) {\n assert.expect(2);\n\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n }),\n\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should invoke the send() method on objects that implement it'](assert) {\n assert.expect(3);\n\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n send(evt, context) {\n assert.equal(evt, 'anEvent', 'send() method was invoked with correct event name');\n assert.equal(context, obj, 'send() method was invoked with correct context');\n }\n }),\n\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should find targets specified using a property path'](assert) {\n assert.expect(2);\n\n let Test = {};\n lookup.Test = Test;\n\n Test.targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called on global object');\n }\n });\n\n let myObj = _object.default.extend(_target_action_support.default).create({\n target: 'Test.targetObj',\n action: 'anEvent'\n });\n\n assert.ok(true === myObj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should use an actionContext object specified as a property on the object'](assert) {\n assert.expect(2);\n let obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: {},\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(obj.actionContext === ctx, 'anEvent method was called with the expected context');\n }\n })\n });\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should raise a deprecation warning when targetObject is specified and used'](assert) {\n assert.expect(4);\n let obj;\n expectDeprecation(() => {\n obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: {},\n targetObject: _object.default.create({\n anEvent(ctx) {\n assert.ok(obj.actionContext === ctx, 'anEvent method was called with the expected context');\n }\n })\n });\n }, /Usage of `targetObject` is deprecated. Please use `target` instead./);\n assert.ok(true === obj.triggerAction(), 'a valid targetObject and action were specified');\n expectDeprecation(() => obj.get('targetObject'), /Usage of `targetObject` is deprecated. Please use `target` instead./);\n }\n\n ['@test it should find an actionContext specified as a property path'](assert) {\n assert.expect(2);\n\n let Test = {};\n lookup.Test = Test;\n Test.aContext = {};\n\n let obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: 'Test.aContext',\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(Test.aContext === ctx, 'anEvent method was called with the expected context');\n }\n })\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should use the target specified in the argument'](assert) {\n assert.expect(2);\n let targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n });\n let obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ target: targetObj }), 'a valid target and action were specified');\n }\n\n ['@test it should use the action specified in the argument'](assert) {\n assert.expect(2);\n\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n })\n });\n assert.ok(true === obj.triggerAction({ action: 'anEvent' }), 'a valid target and action were specified');\n }\n\n ['@test it should use the actionContext specified in the argument'](assert) {\n assert.expect(2);\n let context = {};\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(context === ctx, 'anEvent method was called with the expected context');\n }\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ actionContext: context }), 'a valid target and action were specified');\n }\n\n ['@test it should allow multiple arguments from actionContext'](assert) {\n assert.expect(3);\n let param1 = 'someParam';\n let param2 = 'someOtherParam';\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(first, second) {\n assert.ok(first === param1, 'anEvent method was called with the expected first argument');\n assert.ok(second === param2, 'anEvent method was called with the expected second argument');\n }\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({ actionContext: [param1, param2] }), 'a valid target and action were specified');\n }\n\n ['@test it should use a null value specified in the actionContext argument'](assert) {\n assert.expect(2);\n let obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(null === ctx, 'anEvent method was called with the expected context (null)');\n }\n }),\n action: 'anEvent'\n });\n assert.ok(true === obj.triggerAction({ actionContext: null }), 'a valid target and action were specified');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/mutable-array/addObject-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class AddObjectTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n let before = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n this.assert.equal(obj.addObject(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B].addObject(C) => [A,B,C] + notify'() {\n let before = (0, _array.newFixture)(2);\n let item = (0, _array.newFixture)(1)[0];\n let after = [before[0], before[1], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.addObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n }\n\n '@test [A,B,C].addObject(A) => [A,B,C] + NO notify'() {\n let before = (0, _array.newFixture)(3);\n let after = before;\n let item = before[0];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.addObject(item); // note: item in set\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n }\n\n (0, _array.runArrayTests)('addObject', AddObjectTest, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/clear-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class ClearTests extends _internalTestHelpers.AbstractTestCase {\n '@test [].clear() => [] + notify'() {\n let before = [];\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified [] once');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each once');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [X].clear() => [] + notify'() {\n var obj, before, after, observer;\n\n before = (0, _array.newFixture)(1);\n after = [];\n obj = this.newObject(before);\n observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('clear', ClearTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/insertAt-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class InsertAtTests extends _internalTestHelpers.AbstractTestCase {\n '@test [].insertAt(0, X) => [X] + notify'() {\n let after = (0, _array.newFixture)(1);\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, after[0]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] did change once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each did change once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length did change once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject did change once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject did change once');\n }\n\n '@test [].insertAt(200,X) => OUT_OF_RANGE_EXCEPTION exception'() {\n let obj = this.newObject([]);\n let that = this;\n\n this.assert.throws(() => obj.insertAt(200, that.newFixture(1)[0]), Error);\n }\n\n '@test [A].insertAt(0, X) => [X,A] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(1);\n let after = [item, before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A].insertAt(1, X) => [A,X] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(1);\n let after = [before[0], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(1, item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n\n '@test [A].insertAt(200,X) => OUT_OF_RANGE exception'() {\n let obj = this.newObject((0, _array.newFixture)(1));\n let that = this;\n\n this.assert.throws(() => obj.insertAt(200, that.newFixture(1)[0]), Error);\n }\n\n '@test [A,B,C].insertAt(0,X) => [X,A,B,C] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(0, item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].insertAt(1,X) => [A,X,B,C] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [before[0], item, before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n let objectAtCalls = [];\n\n let objectAt = obj.objectAt;\n obj.objectAt = ix => {\n objectAtCalls.push(ix);\n return objectAt.call(obj, ix);\n };\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n objectAtCalls.splice(0, objectAtCalls.length);\n\n obj.insertAt(1, item);\n this.assert.deepEqual(objectAtCalls, [], 'objectAt is not called when only inserting items');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].insertAt(3,X) => [A,B,C,X] + notify'() {\n let item = (0, _array.newFixture)(1)[0];\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.insertAt(3, item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n }\n\n (0, _array.runArrayTests)('instertAt', InsertAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/popObject-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class PopObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test [].popObject() => [] + returns undefined + NO notify'() {\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.popObject(), undefined, 'popObject results');\n\n this.assert.deepEqual(this.toArray(obj), [], 'post item results');\n\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [X].popObject() => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n let ret = obj.popObject();\n\n this.assert.equal(ret, before[0], 'return object');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].popObject() => [A,B] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[1]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n let ret = obj.popObject();\n\n this.assert.equal(ret, before[2], 'return object');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n }\n\n (0, _array.runArrayTests)('popObject', PopObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/pushObject-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class PushObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns pushed object'() {\n let exp = (0, _array.newFixture)(1)[0];\n let obj = this.newObject([]);\n\n this.assert.equal(obj.pushObject(exp), exp, 'should return pushed object');\n }\n\n '@test [].pushObject(X) => [X] + notify'() {\n let before = [];\n let after = (0, _array.newFixture)(1);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(after[0]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].pushObject(X) => [A,B,C,X] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = (0, _array.newFixture)(1)[0];\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n }\n\n '@test [A,B,C,C].pushObject(A) => [A,B,C,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = before[2]; // note same object as current tail. should end up twice\n let after = [before[0], before[1], before[2], item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.pushObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), true, 'should have notified lastObject');\n }\n }\n\n (0, _array.runArrayTests)('pushObject', PushObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/pushObjects-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class PushObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test should raise exception if not Ember.Enumerable is passed to pushObjects'() {\n let obj = this.newObject([]);\n\n expectAssertion(() => obj.pushObjects('string'));\n }\n }\n\n (0, _array.runArrayTests)('pushObjects', PushObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/removeAt-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/runtime/lib/mixins/array', '@ember/-internals/metal'], function (_internalTestHelpers, _array, _array2, _metal) {\n 'use strict';\n\n class RemoveAtTests extends _internalTestHelpers.AbstractTestCase {\n '@test removeAt([X], 0) => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test removeAt([], 200) => OUT_OF_RANGE_EXCEPTION exception'() {\n let obj = this.newObject([]);\n this.assert.throws(() => (0, _array2.removeAt)(obj, 200), Error);\n }\n\n '@test removeAt([A,B], 0) => [B] + notify'() {\n let before = (0, _array.newFixture)(2);\n let after = [before[1]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test removeAt([A,B], 1) => [A] + notify'() {\n let before = (0, _array.newFixture)(2);\n let after = [before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test removeAt([A,B,C], 1) => [A,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test removeAt([A,B,C,D], 1,2) => [A,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[3]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1, 2), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [A,B,C,D].removeAt(1,2) => [A,D] + notify'() {\n var obj, before, after, observer;\n\n before = (0, _array.newFixture)(4);\n after = [before[0], before[3]];\n obj = this.newObject(before);\n observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.removeAt(1, 2), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('removeAt', RemoveAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/removeObject-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_metal, _internalTestHelpers, _array) {\n 'use strict';\n\n class RemoveObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n let before = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n\n this.assert.equal(obj.removeObject(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B,C].removeObject(B) => [A,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[0], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.removeObject(before[1]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n\n '@test [A,B,C].removeObject(D) => [A,B,C]'() {\n let before = (0, _array.newFixture)(3);\n let after = before;\n let item = (0, _array.newFixture)(1)[0];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.removeObject(item); // note: item not in set\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n }\n\n (0, _array.runArrayTests)('removeObject', RemoveObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/removeObjects-test', ['@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/runtime/lib/mixins/array'], function (_metal, _internalTestHelpers, _array, _array2) {\n 'use strict';\n\n class RemoveObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let obj = before;\n\n this.assert.equal(obj.removeObjects(before[1]), obj, 'should return receiver');\n }\n\n '@test [A,B,C].removeObjects([B]) => [A,C] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [before[0], before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n '@test [{A},{B},{C}].removeObjects([{B}]) => [{A},{C}] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [before[0], before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n '@test [A,B,C].removeObjects([A,B]) => [C] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n '@test [{A},{B},{C}].removeObjects([{A},{B}]) => [{C}] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [before[2]];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n '@test [A,B,C].removeObjects([A,B,C]) => [] + notify'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = [];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1], before[2]]);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject');\n }\n }\n\n '@test [{A},{B},{C}].removeObjects([{A},{B},{C}]) => [] + notify'() {\n let before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n let after = [];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects(before);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), 1, 'should have notified lastObject');\n }\n }\n\n '@test [A,B,C].removeObjects([D]) => [A,B,C]'() {\n let before = (0, _array2.A)((0, _array.newFixture)(3));\n let after = before;\n let item = (0, _array.newFixture)(1)[0];\n let obj = before;\n let observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([item]); // Note: item not in set\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n }\n\n (0, _array.runArrayTests)('removeObjects', RemoveObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/replace-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _array) {\n 'use strict';\n\n class ReplaceTests extends _internalTestHelpers.AbstractTestCase {\n \"@test [].replace(0,0,'X') => ['X'] + notify\"() {\n let exp = (0, _array.newFixture)(1);\n let obj = this.newObject([]);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(0, 0, exp);\n\n this.assert.deepEqual(this.toArray(obj), exp, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [].replace(0,0,\"X\") => [\"X\"] + avoid calling objectAt and notifying fistObject/lastObject when not in cache'() {\n var obj, exp, observer;\n var called = 0;\n exp = (0, _array.newFixture)(1);\n obj = this.newObject([]);\n obj.objectAt = function () {\n called++;\n };\n observer = this.newObserver(obj, 'firstObject', 'lastObject');\n\n obj.replace(0, 0, exp);\n\n this.assert.equal(called, 0, 'should NOT have called objectAt upon replace when firstObject/lastObject are not cached');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject since not cached');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject since not cached');\n }\n\n '@test [A,B,C,D].replace(1,2,X) => [A,X,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let replace = (0, _array.newFixture)(1);\n let after = [before[0], replace[0], before[3]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 2, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [A,B,C,D].replace(1,2,[X,Y]) => [A,X,Y,D] + notify'() {\n let before = (0, _array.newFixture)(4);\n let replace = (0, _array.newFixture)(2);\n let after = [before[0], replace[0], replace[1], before[3]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 2, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [A,B].replace(1,0,[X,Y]) => [A,X,Y,B] + notify'() {\n let before = (0, _array.newFixture)(2);\n let replace = (0, _array.newFixture)(2);\n let after = [before[0], replace[0], replace[1], before[1]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(1, 0, replace);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [A,B,C,D].replace(2,2) => [A,B] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[1]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(2, 2);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test [A,B,C,D].replace(-1,1) => [A,B,C] + notify'() {\n let before = (0, _array.newFixture)(4);\n let after = [before[0], before[1], before[2]];\n\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.replace(-1, 1);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n '@test Adding object should notify array observer'() {\n let fixtures = (0, _array.newFixture)(4);\n let obj = this.newObject(fixtures);\n let observer = this.newObserver(obj).observeArray(obj);\n let item = (0, _array.newFixture)(1)[0];\n\n obj.replace(2, 2, [item]);\n\n this.assert.deepEqual(observer._before, [obj, 2, 2, 1], 'before');\n this.assert.deepEqual(observer._after, [obj, 2, 2, 1], 'after');\n }\n }\n\n (0, _array.runArrayTests)('replace', ReplaceTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/reverseObjects-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/metal'], function (_internalTestHelpers, _array, _metal) {\n 'use strict';\n\n class ReverseObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test [A,B,C].reverseObjects() => [] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[2], before[1], before[0]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.reverseObjects(), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 0, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('reverseObjects', ReverseObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/setObjects-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/metal'], function (_internalTestHelpers, _array, _metal) {\n 'use strict';\n\n class SetObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test [A,B,C].setObjects([]) = > [] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].setObjects([D, E, F, G]) = > [D, E, F, G] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = (0, _array.newFixture)(4);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('setObjects', SetObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/shiftObject-test', ['internal-test-helpers', '@ember/-internals/runtime/tests/helpers/array', '@ember/-internals/metal'], function (_internalTestHelpers, _array, _metal) {\n 'use strict';\n\n class ShiftObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test [].shiftObject() => [] + returns undefined + NO notify'() {\n let before = [];\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), undefined);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.validate('[]', undefined, 1), false, 'should NOT have notified [] once');\n this.assert.equal(observer.validate('@each', undefined, 1), false, 'should NOT have notified @each once');\n this.assert.equal(observer.validate('length', undefined, 1), false, 'should NOT have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n '@test [X].shiftObject() => [] + notify'() {\n let before = (0, _array.newFixture)(1);\n let after = [];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].shiftObject() => [B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let after = [before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object');\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n }\n\n (0, _array.runArrayTests)('shiftObject', ShiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/unshiftObject-test', ['internal-test-helpers', '@ember/-internals/metal', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _metal, _array) {\n 'use strict';\n\n class UnshiftObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns unshifted object'() {\n let obj = this.newObject([]);\n let item = (0, _array.newFixture)(1)[0];\n\n this.assert.equal(obj.unshiftObject(item), item, 'should return unshifted object');\n }\n\n '@test [].unshiftObject(X) => [X] + notify'() {\n let before = [];\n let item = (0, _array.newFixture)(1)[0];\n let after = [item];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].unshiftObject(X) => [X,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = (0, _array.newFixture)(1)[0];\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].unshiftObject(A) => [A,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let item = before[0]; // note same object as current head. should end up twice\n let after = [item, before[0], before[1], before[2]];\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObject(item);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), true, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n (0, _array.runArrayTests)('unshiftObject', UnshiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test', ['internal-test-helpers', '@ember/-internals/metal', '@ember/-internals/runtime/tests/helpers/array'], function (_internalTestHelpers, _metal, _array) {\n 'use strict';\n\n class UnshiftObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns receiver'() {\n let obj = this.newObject([]);\n let items = (0, _array.newFixture)(3);\n\n this.assert.equal(obj.unshiftObjects(items), obj, 'should return receiver');\n }\n\n '@test [].unshiftObjects([A,B,C]) => [A,B,C] + notify'() {\n let before = [];\n let items = (0, _array.newFixture)(3);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\n this.assert.deepEqual(this.toArray(obj), items, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), items.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n }\n\n '@test [A,B,C].unshiftObjects([X,Y]) => [X,Y,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let items = (0, _array.newFixture)(2);\n let after = items.concat(before);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n '@test [A,B,C].unshiftObjects([A,B]) => [A,B,A,B,C] + notify'() {\n let before = (0, _array.newFixture)(3);\n let items = [before[0], before[1]]; // note same object as current head. should end up twice\n let after = items.concat(before);\n let obj = this.newObject(before);\n let observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n\n obj.getProperties('firstObject', 'lastObject'); /* Prime the cache */\n\n obj.unshiftObjects(items);\n\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n\n this.assert.equal(observer.validate('firstObject'), true, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n }\n\n (0, _array.runArrayTests)('unshiftObjects', UnshiftObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_runloop, _metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n let array;\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(() => {\n array = _array_proxy.default.extend({\n arrangedContent: (0, _metal.computed)('content.[]', function () {\n let content = this.get('content');\n return content && (0, _array.A)(content.slice().sort((a, b) => {\n if (a == null) {\n a = -1;\n }\n if (b == null) {\n b = -1;\n }\n return b - a;\n }));\n })\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(() => array.destroy());\n }\n\n ['@test compact - returns arrangedContent without nulls and undefined'](assert) {\n (0, _runloop.run)(() => array.set('content', (0, _array.A)([1, 3, null, 2, undefined])));\n\n assert.deepEqual(array.compact(), [3, 2, 1]);\n }\n\n ['@test indexOf - returns index of object in arrangedContent'](assert) {\n assert.equal(array.indexOf(4), 1, 'returns arranged index');\n }\n\n ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {\n array.get('content').pushObject(4);\n assert.equal(array.lastIndexOf(4), 2, 'returns last arranged index');\n }\n\n ['@test objectAt - returns object at index in arrangedContent'](assert) {\n assert.equal((0, _metal.objectAt)(array, 1), 4, 'returns object at index');\n }\n\n // Not sure if we need a specific test for it, since it's internal\n ['@test objectAtContent - returns object at index in arrangedContent'](assert) {\n assert.equal(array.objectAtContent(1), 4, 'returns object at index');\n }\n\n ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {\n assert.deepEqual(array.objectsAt([0, 2, 4]), [5, 2, undefined], 'returns objects at indices');\n }\n\n ['@test replace - mutating an arranged ArrayProxy is not allowed']() {\n expectAssertion(() => {\n array.replace(0, 0, [3]);\n }, /Mutating an arranged ArrayProxy is not allowed/);\n }\n\n ['@test replaceContent - does a standard array replace on content'](assert) {\n (0, _runloop.run)(() => array.replaceContent(1, 2, [3]));\n assert.deepEqual(array.get('content'), [1, 3, 5]);\n }\n\n ['@test slice - returns a slice of the arrangedContent'](assert) {\n assert.deepEqual(array.slice(1, 3), [4, 2], 'returns sliced arrangedContent');\n }\n\n ['@test toArray - returns copy of arrangedContent'](assert) {\n assert.deepEqual(array.toArray(), [5, 4, 2, 1]);\n }\n\n ['@test without - returns arrangedContent without object'](assert) {\n assert.deepEqual(array.without(2), [5, 4, 1], 'returns arranged without object');\n }\n\n ['@test lastObject - returns last arranged object'](assert) {\n assert.equal(array.get('lastObject'), 1, 'returns last arranged object');\n }\n\n ['@test firstObject - returns first arranged object'](assert) {\n assert.equal(array.get('firstObject'), 5, 'returns first arranged object');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent matching content', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test insertAt - inserts object at specified index'](assert) {\n (0, _runloop.run)(function () {\n array.insertAt(2, 3);\n });\n assert.deepEqual(array.get('content'), [1, 2, 3, 4, 5]);\n }\n\n ['@test replace - does a standard array replace'](assert) {\n (0, _runloop.run)(function () {\n array.replace(1, 2, [3]);\n });\n assert.deepEqual(array.get('content'), [1, 3, 5]);\n }\n\n ['@test reverseObjects - reverses content'](assert) {\n (0, _runloop.run)(function () {\n array.reverseObjects();\n });\n assert.deepEqual(array.get('content'), [5, 4, 2, 1]);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent with transforms', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.extend({\n arrangedContent: (0, _metal.computed)(function () {\n let content = this.get('content');\n return content && (0, _array.A)(content.slice().sort(function (a, b) {\n if (a == null) {\n a = -1;\n }\n if (b == null) {\n b = -1;\n }\n return b - a;\n }));\n }).property('content.[]'),\n\n objectAtContent(idx) {\n let obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\n }\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test indexOf - returns index of object in arrangedContent'](assert) {\n assert.equal(array.indexOf('4'), 1, 'returns arranged index');\n }\n\n ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {\n array.get('content').pushObject(4);\n assert.equal(array.lastIndexOf('4'), 2, 'returns last arranged index');\n }\n\n ['@test objectAt - returns object at index in arrangedContent'](assert) {\n assert.equal((0, _metal.objectAt)(array, 1), '4', 'returns object at index');\n }\n\n // Not sure if we need a specific test for it, since it's internal\n ['@test objectAtContent - returns object at index in arrangedContent'](assert) {\n assert.equal(array.objectAtContent(1), '4', 'returns object at index');\n }\n\n ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {\n assert.deepEqual(array.objectsAt([0, 2, 4]), ['5', '2', undefined], 'returns objects at indices');\n }\n\n ['@test slice - returns a slice of the arrangedContent'](assert) {\n assert.deepEqual(array.slice(1, 3), ['4', '2'], 'returns sliced arrangedContent');\n }\n\n ['@test toArray - returns copy of arrangedContent'](assert) {\n assert.deepEqual(array.toArray(), ['5', '4', '2', '1']);\n }\n\n ['@test without - returns arrangedContent without object'](assert) {\n assert.deepEqual(array.without('2'), ['5', '4', '1'], 'returns arranged without object');\n }\n\n ['@test lastObject - returns last arranged object'](assert) {\n assert.equal(array.get('lastObject'), '1', 'returns last arranged object');\n }\n\n ['@test firstObject - returns first arranged object'](assert) {\n assert.equal(array.get('firstObject'), '5', 'returns first arranged object');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - with transforms', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.extend({\n objectAtContent(idx) {\n let obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\n }\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test popObject - removes last object in arrangedContent'](assert) {\n let popped = array.popObject();\n assert.equal(popped, '5', 'returns last object');\n assert.deepEqual(array.toArray(), ['1', '2', '4'], 'removes from content');\n }\n\n ['@test removeObject - removes object from content'](assert) {\n array.removeObject('2');\n assert.deepEqual(array.toArray(), ['1', '4', '5']);\n }\n\n ['@test removeObjects - removes objects from content'](assert) {\n array.removeObjects(['2', '4', '6']);\n assert.deepEqual(array.toArray(), ['1', '5']);\n }\n\n ['@test shiftObject - removes from start of arrangedContent'](assert) {\n let shifted = array.shiftObject();\n assert.equal(shifted, '1', 'returns first object');\n assert.deepEqual(array.toArray(), ['2', '4', '5'], 'removes object from content');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/array_observer_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - array observers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test mutating content'](assert) {\n assert.expect(4);\n\n let content = (0, _array.A)(['x', 'y', 'z']);\n let proxy = _array_proxy.default.create({ content });\n\n proxy.addArrayObserver({\n arrayWillChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [1, 1, 3]);\n assert.deepEqual(proxy.toArray(), ['x', 'y', 'z']);\n },\n arrayDidChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [1, 1, 3]);\n assert.deepEqual(proxy.toArray(), ['x', 'a', 'b', 'c', 'z']);\n }\n });\n\n proxy.toArray();\n content.replace(1, 1, ['a', 'b', 'c']);\n }\n\n ['@test assigning content'](assert) {\n assert.expect(4);\n\n let content = (0, _array.A)(['x', 'y', 'z']);\n let proxy = _array_proxy.default.create({ content });\n\n proxy.addArrayObserver({\n arrayWillChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [0, 3, 5]);\n assert.deepEqual(proxy.toArray(), ['x', 'y', 'z']);\n },\n arrayDidChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [0, 3, 5]);\n assert.deepEqual(proxy.toArray(), ['a', 'b', 'c', 'd', 'e']);\n }\n });\n\n proxy.toArray();\n (0, _metal.set)(proxy, 'content', (0, _array.A)(['a', 'b', 'c', 'd', 'e']));\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/content_change_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_runloop, _metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - content change', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test The ArrayProxy doesn't explode when assigned a destroyed object\"](assert) {\n let proxy1 = _array_proxy.default.create();\n let proxy2 = _array_proxy.default.create();\n\n (0, _runloop.run)(() => proxy1.destroy());\n\n (0, _metal.set)(proxy2, 'content', proxy1);\n\n assert.ok(true, 'No exception was raised');\n }\n\n ['@test should update if content changes while change events are deferred'](assert) {\n let proxy = _array_proxy.default.create();\n\n assert.deepEqual(proxy.toArray(), []);\n\n (0, _metal.changeProperties)(() => {\n proxy.set('content', (0, _array.A)([1, 2, 3]));\n assert.deepEqual(proxy.toArray(), [1, 2, 3]);\n });\n }\n\n ['@test objectAt recomputes the object cache correctly'](assert) {\n let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(indexes, []);\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(indexes, [0, 1, 2, 3, 4]);\n\n indexes.length = 0;\n proxy.set('content', (0, _array.A)([1, 2, 3]));\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(indexes, [0, 1, 2]);\n\n indexes.length = 0;\n proxy.content.replace(2, 0, [4, 5]);\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(proxy.objectAt(1), 2);\n assert.deepEqual(indexes, []);\n assert.deepEqual(proxy.objectAt(2), 4);\n assert.deepEqual(indexes, [2, 3, 4]);\n }\n\n ['@test negative indexes are handled correctly'](assert) {\n let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 5]);\n\n indexes.length = 0;\n\n proxy.content.replace(-1, 0, [7]);\n proxy.content.replace(-2, 0, [6]);\n\n assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 6, 7, 5]);\n assert.deepEqual(indexes, [4, 5, 6]);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/length_test', ['@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/metal', '@ember/object/computed', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_array_proxy, _object, _metal, _computed, _array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.ArrayProxy - content change (length)', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should update length for null content'](assert) {\n let proxy = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n assert.equal(proxy.get('length'), 3, 'precond - length is 3');\n\n proxy.set('content', null);\n\n assert.equal(proxy.get('length'), 0, 'length updates');\n }\n\n ['@test should update length for null content when there is a computed property watching length'](assert) {\n let proxy = _array_proxy.default.extend({\n isEmpty: (0, _computed.not)('length')\n }).create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n assert.equal(proxy.get('length'), 3, 'precond - length is 3');\n\n // Consume computed property that depends on length\n proxy.get('isEmpty');\n\n // update content\n proxy.set('content', null);\n\n assert.equal(proxy.get('length'), 0, 'length updates');\n }\n\n ['@test getting length does not recompute the object cache'](assert) {\n let indexes = [];\n\n let proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.equal((0, _metal.get)(proxy, 'length'), 5);\n assert.deepEqual(indexes, []);\n\n indexes.length = 0;\n proxy.set('content', (0, _array.A)([6, 7, 8]));\n assert.equal((0, _metal.get)(proxy, 'length'), 3);\n assert.deepEqual(indexes, []);\n\n indexes.length = 0;\n proxy.content.replace(1, 0, [1, 2, 3]);\n assert.equal((0, _metal.get)(proxy, 'length'), 6);\n assert.deepEqual(indexes, []);\n }\n\n '@test accessing length after content set to null'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'content', null);\n\n assert.equal(obj.length, 0, 'length is 0 without content');\n assert.deepEqual(obj.content, null, 'content was updated');\n }\n\n '@test accessing length after content set to null in willDestroy'(assert) {\n let obj = _array_proxy.default.extend({\n willDestroy() {\n this.set('content', null);\n this._super(...arguments);\n }\n }).create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n\n this.runTask(() => obj.destroy());\n\n assert.equal(obj.length, 0, 'length is 0 without content');\n assert.deepEqual(obj.content, null, 'content was updated');\n }\n\n '@test setting length to 0'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 0);\n\n assert.equal(obj.length, 0, 'length was updated');\n assert.deepEqual(obj.content, [], 'content length was truncated');\n }\n\n '@test setting length to smaller value'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 1);\n\n assert.equal(obj.length, 1, 'length was updated');\n assert.deepEqual(obj.content, ['foo'], 'content length was truncated');\n }\n\n '@test setting length to larger value'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 3);\n\n assert.equal(obj.length, 3, 'length was updated');\n assert.deepEqual(obj.content, ['foo', 'bar', undefined], 'content length was updated');\n }\n\n '@test setting length after content set to null'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'content', null);\n assert.equal(obj.length, 0, 'length was updated');\n\n (0, _metal.set)(obj, 'length', 0);\n assert.equal(obj.length, 0, 'length is still updated');\n }\n\n '@test setting length to greater than zero'(assert) {\n let obj = _array_proxy.default.create({ content: ['foo', 'bar'] });\n\n assert.equal(obj.length, 2, 'precond');\n\n (0, _metal.set)(obj, 'length', 1);\n\n assert.equal(obj.length, 1, 'length was updated');\n assert.deepEqual(obj.content, ['foo'], 'content length was truncated');\n }\n\n ['@test array proxy + aliasedProperty complex test'](assert) {\n let aCalled, bCalled, cCalled, dCalled, eCalled;\n\n aCalled = bCalled = cCalled = dCalled = eCalled = 0;\n\n let obj = _object.default.extend({\n colors: (0, _computed.oneWay)('model'),\n length: (0, _computed.oneWay)('colors.length'),\n\n a: (0, _metal.observer)('length', () => aCalled++),\n b: (0, _metal.observer)('colors.length', () => bCalled++),\n c: (0, _metal.observer)('colors.content.length', () => cCalled++),\n d: (0, _metal.observer)('colors.[]', () => dCalled++),\n e: (0, _metal.observer)('colors.content.[]', () => eCalled++)\n }).create();\n\n obj.set('model', _array_proxy.default.create({\n content: (0, _array.A)(['red', 'yellow', 'blue'])\n }));\n\n assert.equal(obj.get('colors.content.length'), 3);\n assert.equal(obj.get('colors.length'), 3);\n assert.equal(obj.get('length'), 3);\n\n assert.equal(aCalled, 1, 'expected observer `length` to be called ONCE');\n assert.equal(bCalled, 1, 'expected observer `colors.length` to be called ONCE');\n assert.equal(cCalled, 1, 'expected observer `colors.content.length` to be called ONCE');\n assert.equal(dCalled, 1, 'expected observer `colors.[]` to be called ONCE');\n assert.equal(eCalled, 1, 'expected observer `colors.content.[]` to be called ONCE');\n\n obj.get('colors').pushObjects(['green', 'red']);\n\n assert.equal(obj.get('colors.content.length'), 5);\n assert.equal(obj.get('colors.length'), 5);\n assert.equal(obj.get('length'), 5);\n\n assert.equal(aCalled, 2, 'expected observer `length` to be called TWICE');\n assert.equal(bCalled, 2, 'expected observer `colors.length` to be called TWICE');\n assert.equal(cCalled, 2, 'expected observer `colors.content.length` to be called TWICE');\n assert.equal(dCalled, 2, 'expected observer `colors.[]` to be called TWICE');\n assert.equal(eCalled, 2, 'expected observer `colors.content.[]` to be called TWICE');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test', ['@ember/-internals/meta', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/array_proxy', '@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_meta, _metal, _array_proxy, _array, _internalTestHelpers) {\n 'use strict';\n\n function sortedListenersFor(obj, eventName) {\n let listeners = (0, _meta.peekMeta)(obj).matchingListeners(eventName) || [];\n\n let keys = [];\n for (let i = 0; i < listeners.length; i += 3) {\n keys.push(listeners[i + 1]);\n }\n return keys.sort();\n }\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - watching and listening', class extends _internalTestHelpers.AbstractTestCase {\n [`@test setting 'content' adds listeners correctly`](assert) {\n let content = (0, _array.A)();\n let proxy = _array_proxy.default.create();\n\n assert.deepEqual(sortedListenersFor(content, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content, '@array:change'), []);\n\n proxy.set('content', content);\n\n assert.deepEqual(sortedListenersFor(content, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content, '@array:change'), ['_arrangedContentArrayDidChange']);\n }\n\n [`@test changing 'content' adds and removes listeners correctly`](assert) {\n let content1 = (0, _array.A)();\n let content2 = (0, _array.A)();\n let proxy = _array_proxy.default.create({ content: content1 });\n\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), ['_arrangedContentArrayDidChange']);\n\n proxy.set('content', content2);\n\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), []);\n assert.deepEqual(sortedListenersFor(content2, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content2, '@array:change'), ['_arrangedContentArrayDidChange']);\n }\n\n [`@test regression test for https://github.com/emberjs/ember.js/issues/12475`](assert) {\n let item1a = { id: 1 };\n let item1b = { id: 2 };\n let item1c = { id: 3 };\n let content1 = (0, _array.A)([item1a, item1b, item1c]);\n\n let proxy = _array_proxy.default.create({ content: content1 });\n let obj = { proxy };\n\n (0, _metal.defineProperty)(obj, 'ids', (0, _metal.computed)('proxy.@each.id', function () {\n return (0, _metal.get)(this, 'proxy').mapBy('id');\n }));\n\n // These manually added observers are to simulate the observers added by the\n // rendering process in a template like:\n //\n // {{#each items as |item|}}\n // {{item.id}}\n // {{/each}}\n (0, _metal.addObserver)(item1a, 'id', function () {});\n (0, _metal.addObserver)(item1b, 'id', function () {});\n (0, _metal.addObserver)(item1c, 'id', function () {});\n\n // The EachProxy has not yet been consumed. Only the manually added\n // observers are watching.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 1);\n\n // Consume the each proxy. This causes the EachProxy to add two observers\n // per item: one for \"before\" events and one for \"after\" events.\n assert.deepEqual((0, _metal.get)(obj, 'ids'), [1, 2, 3]);\n\n // For each item, the two each proxy observers and one manual added observer\n // are watching.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // This should be a no-op because observers do not fire if the value\n // 1. is an object and 2. is the same as the old value.\n proxy.set('content', content1);\n\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // This is repeated to catch the regression. It should still be a no-op.\n proxy.set('content', content1);\n\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 2);\n\n // Set the content to a new array with completely different items and\n // repeat the process.\n let item2a = { id: 4 };\n let item2b = { id: 5 };\n let item2c = { id: 6 };\n let content2 = (0, _array.A)([item2a, item2b, item2c]);\n\n (0, _metal.addObserver)(item2a, 'id', function () {});\n (0, _metal.addObserver)(item2b, 'id', function () {});\n (0, _metal.addObserver)(item2c, 'id', function () {});\n\n proxy.set('content', content2);\n\n assert.deepEqual((0, _metal.get)(obj, 'ids'), [4, 5, 6]);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n\n // Ensure that the observers added by the EachProxy on all items in the\n // first content array have been torn down.\n assert.equal((0, _metal.watcherCount)(item1a, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1b, 'id'), 1);\n assert.equal((0, _metal.watcherCount)(item1c, 'id'), 1);\n\n proxy.set('content', content2);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n\n proxy.set('content', content2);\n\n assert.equal((0, _metal.watcherCount)(item2a, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2b, 'id'), 2);\n assert.equal((0, _metal.watcherCount)(item2c, 'id'), 2);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/core_object_test', ['@ember/-internals/owner', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/core_object', 'internal-test-helpers'], function (_owner, _metal, _core_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.CoreObject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test throws deprecation with new (one arg)']() {\n expectDeprecation(() => {\n new _core_object.default({\n firstName: 'Stef',\n lastName: 'Penner'\n });\n }, /using `new` with EmberObject has been deprecated/);\n }\n\n ['@test throws deprecation with new (> 1 arg)']() {\n expectDeprecation(() => {\n new _core_object.default({\n firstName: 'Stef',\n lastName: 'Penner'\n }, {\n other: 'name'\n });\n }, /using `new` with EmberObject has been deprecated/);\n }\n\n ['@test toString should be not be added as a property when calling toString()'](assert) {\n let obj = _core_object.default.create({\n firstName: 'Foo',\n lastName: 'Bar'\n });\n\n obj.toString();\n\n assert.notOk(obj.hasOwnProperty('toString'), 'Calling toString() should not create a toString class property');\n }\n\n ['@test should not trigger proxy assertion when retrieving a proxy with (GH#16263)'](assert) {\n let someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n let obj = _core_object.default.create({\n someProxyishThing\n });\n\n let proxy = (0, _metal.get)(obj, 'someProxyishThing');\n assert.equal((0, _metal.get)(proxy, 'lolol'), true, 'should be able to get data from a proxy');\n }\n\n ['@test should not trigger proxy assertion when retrieving a re-registered proxy (GH#16610)'](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n let someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n // emulates ember-engines's process of registering services provided\n // by the host app down to the engine\n owner.register('thing:one', someProxyishThing, { instantiate: false });\n\n assert.equal(owner.lookup('thing:one'), someProxyishThing);\n }\n\n ['@test should not trigger proxy assertion when probing for a \"symbol\"'](assert) {\n let proxy = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n }).create();\n\n assert.equal((0, _metal.get)(proxy, 'lolol'), true, 'should be able to get data from a proxy');\n\n // should not trigger an assertion\n (0, _owner.getOwner)(proxy);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n let owner = {};\n let options = {};\n (0, _owner.setOwner)(options, owner);\n\n _core_object.default.extend({\n init() {\n this._super(...arguments);\n let localOwner = (0, _owner.getOwner)(this);\n\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n unknownProperty() {\n return undefined;\n }\n }).create(options);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/namespace/base_test', ['@ember/-internals/environment', '@ember/runloop', '@ember/-internals/metal', '@ember/-internals/utils', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/system/namespace', 'internal-test-helpers'], function (_environment, _runloop, _metal, _utils, _object, _namespace, _internalTestHelpers) {\n 'use strict';\n\n const originalLookup = _environment.context.lookup;\n let lookup;\n\n (0, _internalTestHelpers.moduleFor)('Namespace', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n\n lookup = _environment.context.lookup = {};\n }\n\n afterEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n\n for (let prop in lookup) {\n if (lookup[prop]) {\n (0, _runloop.run)(lookup[prop], 'destroy');\n }\n }\n\n _environment.context.lookup = originalLookup;\n }\n\n ['@test Namespace should be a subclass of EmberObject'](assert) {\n assert.ok(_object.default.detect(_namespace.default));\n }\n\n ['@test Namespace should be duck typed'](assert) {\n let namespace = _namespace.default.create();\n try {\n assert.ok((0, _metal.get)(namespace, 'isNamespace'), 'isNamespace property is true');\n } finally {\n (0, _runloop.run)(namespace, 'destroy');\n }\n }\n\n ['@test Namespace is found and named'](assert) {\n let nsA = lookup.NamespaceA = _namespace.default.create();\n assert.equal(nsA.toString(), 'NamespaceA', 'namespaces should have a name if they are on lookup');\n\n let nsB = lookup.NamespaceB = _namespace.default.create();\n assert.equal(nsB.toString(), 'NamespaceB', 'namespaces work if created after the first namespace processing pass');\n }\n\n ['@test Classes under an Namespace are properly named'](assert) {\n let nsA = lookup.NamespaceA = _namespace.default.create();\n nsA.Foo = _object.default.extend();\n assert.equal(nsA.Foo.toString(), 'NamespaceA.Foo', 'Classes pick up their parent namespace');\n\n nsA.Bar = _object.default.extend();\n assert.equal(nsA.Bar.toString(), 'NamespaceA.Bar', 'New Classes get the naming treatment too');\n\n let nsB = lookup.NamespaceB = _namespace.default.create();\n nsB.Foo = _object.default.extend();\n assert.equal(nsB.Foo.toString(), 'NamespaceB.Foo', 'Classes in new namespaces get the naming treatment');\n }\n\n //test(\"Classes under Ember are properly named\", function() {\n // // ES6TODO: This test does not work reliably when running independent package build with Broccoli config.\n // Ember.TestObject = EmberObject.extend({});\n // equal(Ember.TestObject.toString(), \"Ember.TestObject\", \"class under Ember is given a string representation\");\n //});\n\n ['@test Lowercase namespaces are no longer supported'](assert) {\n let nsC = lookup.namespaceC = _namespace.default.create();\n assert.equal(nsC.toString(), (0, _utils.guidFor)(nsC));\n }\n\n ['@test A namespace can be assigned a custom name'](assert) {\n let nsA = _namespace.default.create({\n name: 'NamespaceA'\n });\n\n try {\n let nsB = lookup.NamespaceB = _namespace.default.create({\n name: 'CustomNamespaceB'\n });\n\n nsA.Foo = _object.default.extend();\n nsB.Foo = _object.default.extend();\n\n assert.equal(nsA.Foo.toString(), 'NamespaceA.Foo', \"The namespace's name is used when the namespace is not in the lookup object\");\n assert.equal(nsB.Foo.toString(), 'CustomNamespaceB.Foo', \"The namespace's name is used when the namespace is in the lookup object\");\n } finally {\n (0, _runloop.run)(nsA, 'destroy');\n }\n }\n\n ['@test Calling namespace.nameClasses() eagerly names all classes'](assert) {\n (0, _metal.setNamespaceSearchDisabled)(true);\n\n let namespace = lookup.NS = _namespace.default.create();\n\n namespace.ClassA = _object.default.extend();\n namespace.ClassB = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal(namespace.ClassA.toString(), 'NS.ClassA');\n assert.equal(namespace.ClassB.toString(), 'NS.ClassB');\n }\n\n ['@test A namespace can be looked up by its name'](assert) {\n let NS = lookup.NS = _namespace.default.create();\n let UI = lookup.UI = _namespace.default.create();\n let CF = lookup.CF = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('NS'), NS);\n assert.equal(_namespace.default.byName('UI'), UI);\n assert.equal(_namespace.default.byName('CF'), CF);\n }\n\n ['@test A nested namespace can be looked up by its name'](assert) {\n let UI = lookup.UI = _namespace.default.create();\n UI.Nav = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('UI.Nav'), UI.Nav);\n\n (0, _runloop.run)(UI.Nav, 'destroy');\n }\n\n ['@test Destroying a namespace before caching lookup removes it from the list of namespaces'](assert) {\n let CF = lookup.CF = _namespace.default.create();\n\n (0, _runloop.run)(CF, 'destroy');\n assert.equal(_namespace.default.byName('CF'), undefined, 'namespace can not be found after destroyed');\n }\n\n ['@test Destroying a namespace after looking up removes it from the list of namespaces'](assert) {\n let CF = lookup.CF = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('CF'), CF, 'precondition - namespace can be looked up by name');\n\n (0, _runloop.run)(CF, 'destroy');\n assert.equal(_namespace.default.byName('CF'), undefined, 'namespace can not be found after destroyed');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/native_array/a_test', ['@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.A', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.A'](assert) {\n assert.deepEqual((0, _array.A)([1, 2]), [1, 2], 'array values were not be modified');\n assert.deepEqual((0, _array.A)(), [], 'returned an array with no arguments');\n assert.deepEqual((0, _array.A)(null), [], 'returned an array with a null argument');\n assert.ok(_array.default.detect((0, _array.A)()), 'returned an ember array');\n assert.ok(_array.default.detect((0, _array.A)([1, 2])), 'returned an ember array');\n }\n\n ['@test new Ember.A'](assert) {\n expectDeprecation(() => {\n assert.deepEqual(new _array.A([1, 2]), [1, 2], 'array values were not be modified');\n assert.deepEqual(new _array.A(), [], 'returned an array with no arguments');\n assert.deepEqual(new _array.A(null), [], 'returned an array with a null argument');\n assert.ok(_array.default.detect(new _array.A()), 'returned an ember array');\n assert.ok(_array.default.detect(new _array.A([1, 2])), 'returned an ember array');\n });\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/native_array/copyable_suite_test', ['@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('NativeArray Copyable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test deep copy is respected'](assert) {\n let array = (0, _array.A)([{ id: 1 }, { id: 2 }, { id: 3 }]);\n let copiedArray;\n\n expectDeprecation(() => {\n copiedArray = array.copy(true);\n }, `Using \\`NativeArray#copy\\` is deprecated`);\n\n assert.deepEqual(copiedArray, array, 'copied array is equivalent');\n assert.ok(copiedArray[0] !== array[0], 'objects inside should be unique');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/native_array/replace_test', ['@ember/-internals/runtime/lib/mixins/array', 'internal-test-helpers'], function (_array, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('NativeArray.replace', class extends _internalTestHelpers.AbstractTestCase {\n ['@test raises assertion if third argument is not an array']() {\n expectAssertion(function () {\n (0, _array.A)([1, 2, 3]).replace(1, 1, '');\n }, 'The third argument to replace needs to be an array.');\n }\n\n ['@test it does not raise an assertion if third parameter is not passed'](assert) {\n assert.deepEqual((0, _array.A)([1, 2, 3]).replace(1, 2), (0, _array.A)([1]), 'no assertion raised');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/computed_test', ['@ember/-internals/metal', '@ember/object/computed', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _computed, _object, _internalTestHelpers) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n function testWithDefault(assert, expect, x, y, z) {\n assert.equal((0, _metal.get)(x, y), expect);\n assert.equal((0, _metal.getWithDefault)(x, y, z), expect);\n assert.equal(x.getWithDefault(y, z), expect);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberObject computed property', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property on instance'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n testWithDefault(assert, 'FOO', MyClass.create(), 'foo');\n }\n\n ['@test computed property on subclass'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let Subclass = MyClass.extend({\n foo: (0, _metal.computed)(function () {\n return 'BAR';\n })\n });\n\n testWithDefault(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test replacing computed property with regular val'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let Subclass = MyClass.extend({\n foo: 'BAR'\n });\n\n testWithDefault(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test complex depndent keys'](assert) {\n let MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar', { baz: 'BIFF' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n }).property('bar.baz')\n });\n\n let Subclass = MyClass.extend({\n count: 20\n });\n\n let obj1 = MyClass.create();\n let obj2 = Subclass.create();\n\n testWithDefault(assert, 'BIFF 1', obj1, 'foo');\n testWithDefault(assert, 'BIFF 21', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BLARG');\n\n testWithDefault(assert, 'BLARG 2', obj1, 'foo');\n testWithDefault(assert, 'BIFF 21', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BOOM');\n\n testWithDefault(assert, 'BLARG 2', obj1, 'foo');\n testWithDefault(assert, 'BOOM 22', obj2, 'foo');\n }\n\n ['@test complex dependent keys changing complex dependent keys'](assert) {\n let MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar', { baz: 'BIFF' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n }).property('bar.baz')\n });\n\n let Subclass = MyClass.extend({\n init() {\n this._super(...arguments);\n (0, _metal.set)(this, 'bar2', { baz: 'BIFF2' });\n },\n\n count: 0,\n\n foo: (0, _metal.computed)(function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar2'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n }).property('bar2.baz')\n });\n\n let obj2 = Subclass.create();\n\n testWithDefault(assert, 'BIFF2 1', obj2, 'foo');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BLARG');\n testWithDefault(assert, 'BIFF2 1', obj2, 'foo'); // should not invalidate property\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BLARG');\n testWithDefault(assert, 'BLARG 2', obj2, 'foo'); // should not invalidate property\n }\n\n ['@test can retrieve metadata for a computed property'](assert) {\n let MyClass = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}).meta({ key: 'keyValue' })\n });\n\n assert.equal((0, _metal.get)(MyClass.metaForProperty('computedProperty'), 'key'), 'keyValue', 'metadata saved on the computed property can be retrieved');\n\n let ClassWithNoMetadata = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}).volatile(),\n\n staticProperty: 12\n });\n\n assert.equal(typeof ClassWithNoMetadata.metaForProperty('computedProperty'), 'object', 'returns empty hash if no metadata has been saved');\n\n expectAssertion(function () {\n ClassWithNoMetadata.metaForProperty('nonexistentProperty');\n }, \"metaForProperty() could not find a computed property with key 'nonexistentProperty'.\");\n\n expectAssertion(function () {\n ClassWithNoMetadata.metaForProperty('staticProperty');\n }, \"metaForProperty() could not find a computed property with key 'staticProperty'.\");\n }\n\n ['@test overriding a computed property with null removes it from eachComputedProperty iteration'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(function () {})\n });\n\n let SubClass = MyClass.extend({\n foo: null\n });\n\n let list = [];\n\n SubClass.eachComputedProperty(name => list.push(name));\n\n assert.deepEqual(list.sort(), ['bar'], 'overridding with null removes from eachComputedProperty listing');\n }\n\n ['@test can iterate over a list of computed properties for a class'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(function () {}),\n\n qux: (0, _metal.alias)('foo')\n });\n\n let SubClass = MyClass.extend({\n baz: (0, _metal.computed)(function () {})\n });\n\n SubClass.reopen({\n bat: (0, _metal.computed)(function () {}).meta({ iAmBat: true })\n });\n\n let list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo', 'qux'], 'watched and unwatched computed properties are iterated');\n\n list = [];\n\n SubClass.eachComputedProperty(function (name, meta) {\n list.push(name);\n\n if (name === 'bat') {\n assert.deepEqual(meta, { iAmBat: true });\n } else {\n assert.deepEqual(meta, {});\n }\n });\n\n assert.deepEqual(list.sort(), ['bar', 'bat', 'baz', 'foo', 'qux'], 'all inherited properties are included');\n }\n\n ['@test list of properties updates when an additional property is added (such cache busting)'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(K),\n\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n\n bar: (0, _metal.computed)(K)\n });\n\n let list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo'].sort(), 'expected two computed properties');\n\n MyClass.reopen({\n baz: (0, _metal.computed)(K)\n });\n\n MyClass.create(); // force apply mixins\n\n list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo', 'baz'].sort(), 'expected three computed properties');\n\n (0, _metal.defineProperty)(MyClass.prototype, 'qux', (0, _metal.computed)(K));\n\n list = [];\n\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n\n assert.deepEqual(list.sort(), ['bar', 'foo', 'baz', 'qux'].sort(), 'expected four computed properties');\n }\n\n ['@test Calling _super in call outside the immediate function of a CP getter works'](assert) {\n function macro(callback) {\n return (0, _metal.computed)(function () {\n return callback.call(this);\n });\n }\n\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\n });\n\n assert.ok((0, _metal.get)(SubClass.create(), 'foo'), 'FOO', 'super value is fetched');\n }\n\n ['@test Calling _super in apply outside the immediate function of a CP getter works'](assert) {\n function macro(callback) {\n return (0, _metal.computed)(function () {\n return callback.apply(this);\n });\n }\n\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\n });\n\n assert.ok((0, _metal.get)(SubClass.create(), 'foo'), 'FOO', 'super value is fetched');\n }\n\n ['@test observing computed.reads prop and overriding it in create() works'](assert) {\n let Obj = _object.default.extend({\n name: (0, _computed.oneWay)('model.name'),\n nameDidChange: (0, _metal.observer)('name', function () {})\n });\n\n let obj1 = Obj.create({ name: '1' });\n let obj2 = Obj.create({ name: '2' });\n\n assert.equal(obj1.get('name'), '1');\n assert.equal(obj2.get('name'), '2');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/create_test', ['@ember/-internals/owner', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_owner, _metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EmberObject.create', class extends _internalTestHelpers.AbstractTestCase {\n ['@test simple properties are set'](assert) {\n let o = _object.default.create({ ohai: 'there' });\n assert.equal(o.get('ohai'), 'there');\n }\n\n ['@test calls computed property setters'](assert) {\n let MyClass = _object.default.extend({\n foo: (0, _metal.computed)({\n get() {\n return \"this is not the value you're looking for\";\n },\n set(key, value) {\n return value;\n }\n })\n });\n\n let o = MyClass.create({ foo: 'bar' });\n assert.equal(o.get('foo'), 'bar');\n }\n\n ['@test sets up mandatory setters for watched simple properties'](assert) {\n if (true /* DEBUG */) {\n let MyClass = _object.default.extend({\n foo: null,\n bar: null,\n fooDidChange: (0, _metal.observer)('foo', function () {})\n });\n\n let o = MyClass.create({ foo: 'bar', bar: 'baz' });\n assert.equal(o.get('foo'), 'bar');\n\n let descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(descriptor.set, 'Mandatory setter was setup');\n\n descriptor = Object.getOwnPropertyDescriptor(o, 'bar');\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test calls setUnknownProperty if defined'](assert) {\n let setUnknownPropertyCalled = false;\n\n let MyClass = _object.default.extend({\n setUnknownProperty() /* key, value */{\n setUnknownPropertyCalled = true;\n }\n });\n\n MyClass.create({ foo: 'bar' });\n assert.ok(setUnknownPropertyCalled, 'setUnknownProperty was called');\n }\n\n ['@test throws if you try to define a computed property']() {\n expectAssertion(function () {\n _object.default.create({\n foo: (0, _metal.computed)(function () {})\n });\n }, 'EmberObject.create no longer supports defining computed properties. Define computed properties using extend() or reopen() before calling create().');\n }\n\n ['@test throws if you try to call _super in a method']() {\n expectAssertion(function () {\n _object.default.create({\n foo() {\n this._super(...arguments);\n }\n });\n }, 'EmberObject.create no longer supports defining methods that call _super.');\n }\n\n [\"@test throws if you try to 'mixin' a definition\"]() {\n let myMixin = _metal.Mixin.create({\n adder(arg1, arg2) {\n return arg1 + arg2;\n }\n });\n\n expectAssertion(function () {\n _object.default.create(myMixin);\n }, 'EmberObject.create no longer supports mixing in other definitions, use .extend & .create separately instead.');\n }\n\n ['@test inherits properties from passed in EmberObject'](assert) {\n let baseObj = _object.default.create({ foo: 'bar' });\n let secondaryObj = _object.default.create(baseObj);\n\n assert.equal(secondaryObj.foo, baseObj.foo, 'Em.O.create inherits properties from EmberObject parameter');\n }\n\n ['@test throws if you try to pass anything a string as a parameter']() {\n let expected = 'EmberObject.create only accepts objects.';\n\n expectAssertion(() => _object.default.create('some-string'), expected);\n }\n\n ['@test EmberObject.create can take undefined as a parameter'](assert) {\n let o = _object.default.create(undefined);\n assert.deepEqual(_object.default.create(), o);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n let owner = {};\n let options = {};\n (0, _owner.setOwner)(options, owner);\n\n _object.default.extend({\n init() {\n this._super(...arguments);\n let localOwner = (0, _owner.getOwner)(this);\n\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n unknownProperty() {\n return undefined;\n }\n }).create(options);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/destroy_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/meta', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_runloop, _metal, _meta, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/runtime/system/object/destroy_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should schedule objects to be destroyed at the end of the run loop'](assert) {\n let obj = _object.default.create();\n let meta;\n\n (0, _runloop.run)(() => {\n obj.destroy();\n meta = (0, _meta.peekMeta)(obj);\n assert.ok(meta, 'meta is not destroyed immediately');\n assert.ok((0, _metal.get)(obj, 'isDestroying'), 'object is marked as destroying immediately');\n assert.ok(!(0, _metal.get)(obj, 'isDestroyed'), 'object is not destroyed immediately');\n });\n\n meta = (0, _meta.peekMeta)(obj);\n assert.ok((0, _metal.get)(obj, 'isDestroyed'), 'object is destroyed after run loop finishes');\n }\n\n // MANDATORY_SETTER moves value to meta.values\n // a destroyed object removes meta but leaves the accessor\n // that looks it up\n ['@test should raise an exception when modifying watched properties on a destroyed object'](assert) {\n if (true /* DEBUG */) {\n let obj = _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {})\n }).create({\n foo: 'bar'\n });\n\n (0, _runloop.run)(() => obj.destroy());\n\n assert.throws(() => (0, _metal.set)(obj, 'foo', 'baz'), Error, 'raises an exception');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test observers should not fire after an object has been destroyed'](assert) {\n let count = 0;\n let obj = _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n count++;\n })\n }).create();\n\n obj.set('foo', 'bar');\n\n assert.equal(count, 1, 'observer was fired once');\n\n (0, _runloop.run)(() => {\n (0, _metal.beginPropertyChanges)();\n obj.set('foo', 'quux');\n obj.destroy();\n (0, _metal.endPropertyChanges)();\n });\n\n assert.equal(count, 1, 'observer was not called after object was destroyed');\n }\n\n ['@test destroyed objects should not see each others changes during teardown but a long lived object should'](assert) {\n let shouldChange = 0;\n let shouldNotChange = 0;\n\n let objs = {};\n\n let A = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\n },\n bDidChange: (0, _metal.observer)('objs.b.isAlive', function () {\n shouldNotChange++;\n }),\n cDidChange: (0, _metal.observer)('objs.c.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n let B = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\n },\n aDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldNotChange++;\n }),\n cDidChange: (0, _metal.observer)('objs.c.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n let C = _object.default.extend({\n objs: objs,\n isAlive: true,\n willDestroy() {\n this.set('isAlive', false);\n },\n aDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldNotChange++;\n }),\n bDidChange: (0, _metal.observer)('objs.b.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n let LongLivedObject = _object.default.extend({\n objs: objs,\n isAliveDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldChange++;\n })\n });\n\n objs.a = A.create();\n\n objs.b = B.create();\n\n objs.c = C.create();\n\n LongLivedObject.create();\n\n (0, _runloop.run)(() => {\n let keys = Object.keys(objs);\n for (let i = 0; i < keys.length; i++) {\n objs[keys[i]].destroy();\n }\n });\n\n assert.equal(shouldNotChange, 0, 'destroyed graph objs should not see change in willDestroy');\n assert.equal(shouldChange, 1, 'long lived should see change in willDestroy');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/detectInstance_test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/object/detectInstance', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detectInstance detects instances correctly'](assert) {\n let A = _object.default.extend();\n let B = A.extend();\n let C = A.extend();\n\n let o = _object.default.create();\n let a = A.create();\n let b = B.create();\n let c = C.create();\n\n assert.ok(_object.default.detectInstance(o), 'o is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(a), 'a is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(b), 'b is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(c), 'c is an instance of EmberObject');\n\n assert.ok(!A.detectInstance(o), 'o is not an instance of A');\n assert.ok(A.detectInstance(a), 'a is an instance of A');\n assert.ok(A.detectInstance(b), 'b is an instance of A');\n assert.ok(A.detectInstance(c), 'c is an instance of A');\n\n assert.ok(!B.detectInstance(o), 'o is not an instance of B');\n assert.ok(!B.detectInstance(a), 'a is not an instance of B');\n assert.ok(B.detectInstance(b), 'b is an instance of B');\n assert.ok(!B.detectInstance(c), 'c is not an instance of B');\n\n assert.ok(!C.detectInstance(o), 'o is not an instance of C');\n assert.ok(!C.detectInstance(a), 'a is not an instance of C');\n assert.ok(!C.detectInstance(b), 'b is not an instance of C');\n assert.ok(C.detectInstance(c), 'c is an instance of C');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/detect_test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/object/detect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detect detects classes correctly'](assert) {\n let A = _object.default.extend();\n let B = A.extend();\n let C = A.extend();\n\n assert.ok(_object.default.detect(_object.default), 'EmberObject is an EmberObject class');\n assert.ok(_object.default.detect(A), 'A is an EmberObject class');\n assert.ok(_object.default.detect(B), 'B is an EmberObject class');\n assert.ok(_object.default.detect(C), 'C is an EmberObject class');\n\n assert.ok(!A.detect(_object.default), 'EmberObject is not an A class');\n assert.ok(A.detect(A), 'A is an A class');\n assert.ok(A.detect(B), 'B is an A class');\n assert.ok(A.detect(C), 'C is an A class');\n\n assert.ok(!B.detect(_object.default), 'EmberObject is not a B class');\n assert.ok(!B.detect(A), 'A is not a B class');\n assert.ok(B.detect(B), 'B is a B class');\n assert.ok(!B.detect(C), 'C is not a B class');\n\n assert.ok(!C.detect(_object.default), 'EmberObject is not a C class');\n assert.ok(!C.detect(A), 'A is not a C class');\n assert.ok(!C.detect(B), 'B is not a C class');\n assert.ok(C.detect(C), 'C is a C class');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/es-compatibility-test', ['@ember/-internals/runtime/lib/system/object', '@ember/-internals/metal', 'internal-test-helpers'], function (_object, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EmberObject ES Compatibility', class extends _internalTestHelpers.AbstractTestCase {\n ['@test extending an Ember.Object'](assert) {\n let calls = [];\n\n class MyObject extends _object.default {\n constructor() {\n calls.push('constructor');\n super(...arguments);\n this.postInitProperty = 'post-init-property';\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n this.initProperty = 'init-property';\n }\n }\n\n let myObject = MyObject.create({ passedProperty: 'passed-property' });\n\n assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)');\n assert.equal(myObject.postInitProperty, 'post-init-property', 'constructor property available on instance (create)');\n assert.equal(myObject.initProperty, 'init-property', 'init property available on instance (create)');\n assert.equal(myObject.passedProperty, 'passed-property', 'passed property available on instance (create)');\n }\n\n ['@test normal method super'](assert) {\n let calls = [];\n\n let Foo = _object.default.extend({\n method() {\n calls.push('foo');\n }\n });\n\n let Bar = Foo.extend({\n method() {\n this._super();\n calls.push('bar');\n }\n });\n\n class Baz extends Bar {\n method() {\n super.method();\n calls.push('baz');\n }\n }\n\n let Qux = Baz.extend({\n method() {\n this._super();\n calls.push('qux');\n }\n });\n\n let Quux = Qux.extend({\n method() {\n this._super();\n calls.push('quux');\n }\n });\n\n class Corge extends Quux {\n method() {\n super.method();\n calls.push('corge');\n }\n }\n\n let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.create().method();\n\n assert.deepEqual(calls, callValues.slice(0, index + 1), 'chain of static methods called with super');\n });\n }\n\n ['@test static method super'](assert) {\n let calls;\n\n let Foo = _object.default.extend();\n Foo.reopenClass({\n method() {\n calls.push('foo');\n }\n });\n\n let Bar = Foo.extend();\n Bar.reopenClass({\n method() {\n this._super();\n calls.push('bar');\n }\n });\n\n class Baz extends Bar {\n static method() {\n super.method();\n calls.push('baz');\n }\n }\n\n let Qux = Baz.extend();\n Qux.reopenClass({\n method() {\n this._super();\n calls.push('qux');\n }\n });\n\n let Quux = Qux.extend();\n Quux.reopenClass({\n method() {\n this._super();\n calls.push('quux');\n }\n });\n\n class Corge extends Quux {\n static method() {\n super.method();\n calls.push('corge');\n }\n }\n\n let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.method();\n\n assert.deepEqual(calls, callValues.slice(0, index + 1), 'chain of static methods called with super');\n });\n }\n\n ['@test using mixins'](assert) {\n let Mixin1 = _metal.Mixin.create({\n property1: 'data-1'\n });\n\n let Mixin2 = _metal.Mixin.create({\n property2: 'data-2'\n });\n\n class MyObject extends _object.default.extend(Mixin1, Mixin2) {}\n\n let myObject = MyObject.create();\n assert.equal(myObject.property1, 'data-1', 'includes the first mixin');\n assert.equal(myObject.property2, 'data-2', 'includes the second mixin');\n }\n\n ['@test using instanceof'](assert) {\n class MyObject extends _object.default {}\n\n let myObject = MyObject.create();\n\n assert.ok(myObject instanceof MyObject);\n assert.ok(myObject instanceof _object.default);\n }\n\n ['@test using Ember.Object#detect'](assert) {\n let Parent = _object.default.extend();\n class Child extends Parent {}\n let Grandchild = Child.extend();\n\n assert.ok(Parent.detect(Child), 'Parent.detect(Child)');\n assert.ok(Child.detect(Grandchild), 'Child.detect(Grandchild)');\n }\n\n ['@test extending an ES subclass of EmberObject'](assert) {\n let calls = [];\n\n class SubEmberObject extends _object.default {\n constructor() {\n calls.push('constructor');\n super(...arguments);\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n }\n }\n\n class MyObject extends SubEmberObject {}\n\n MyObject.create();\n assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)');\n }\n\n ['@test calling extend on an ES subclass of EmberObject'](assert) {\n let calls = [];\n\n class SubEmberObject extends _object.default {\n constructor() {\n calls.push('before constructor');\n super(...arguments);\n calls.push('after constructor');\n this.foo = 123;\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n }\n }\n\n let MyObject = SubEmberObject.extend({});\n\n MyObject.create();\n assert.deepEqual(calls, ['before constructor', 'after constructor', 'init'], 'constructor then init called (create)');\n\n let obj = MyObject.create({\n foo: 456,\n bar: 789\n });\n\n assert.equal(obj.foo, 456, 'sets class fields on instance correctly');\n assert.equal(obj.bar, 789, 'sets passed in properties on instance correctly');\n }\n\n ['@test calling metaForProperty on a native class works'](assert) {\n assert.expect(0);\n\n class SubEmberObject extends _object.default {}\n\n (0, _metal.defineProperty)(SubEmberObject.prototype, 'foo', (0, _metal.computed)('foo', {\n get() {\n return 'bar';\n }\n }));\n\n // able to get meta without throwing an error\n SubEmberObject.metaForProperty('foo');\n }\n\n '@test observes / removeObserver on / removeListener interop'(assert) {\n let fooDidChangeBase = 0;\n let fooDidChangeA = 0;\n let fooDidChangeB = 0;\n let someEventBase = 0;\n let someEventA = 0;\n let someEventB = 0;\n class A extends _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n fooDidChangeBase++;\n }),\n\n onSomeEvent: (0, _metal.on)('someEvent', function () {\n someEventBase++;\n })\n }) {\n init() {\n super.init();\n this.foo = 'bar';\n }\n\n fooDidChange() {\n super.fooDidChange();\n fooDidChangeA++;\n }\n\n onSomeEvent() {\n super.onSomeEvent();\n someEventA++;\n }\n }\n\n class B extends A {\n fooDidChange() {\n super.fooDidChange();\n fooDidChangeB++;\n }\n\n onSomeEvent() {\n super.onSomeEvent();\n someEventB++;\n }\n }\n\n (0, _metal.removeObserver)(B.prototype, 'foo', null, 'fooDidChange');\n (0, _metal.removeListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n\n assert.equal(fooDidChangeBase, 0);\n assert.equal(fooDidChangeA, 0);\n assert.equal(fooDidChangeB, 0);\n\n assert.equal(someEventBase, 0);\n assert.equal(someEventA, 0);\n assert.equal(someEventB, 0);\n\n let a = A.create();\n a.set('foo', 'something');\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n\n (0, _metal.sendEvent)(a, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n\n let b = B.create();\n b.set('foo', 'something');\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n\n (0, _metal.sendEvent)(b, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n }\n\n '@test super and _super interop between old and new methods'(assert) {\n let calls = [];\n let changes = [];\n let events = [];\n let lastProps;\n\n class A extends _object.default {\n init(props) {\n calls.push('A init');\n lastProps = props;\n }\n }\n\n let Mixin1 = _metal.Mixin.create({\n init() {\n calls.push('Mixin1 init before _super');\n this._super(...arguments);\n calls.push('Mixin1 init after _super');\n }\n });\n\n let Mixin2 = _metal.Mixin.create({\n init() {\n calls.push('Mixin2 init before _super');\n this._super(...arguments);\n calls.push('Mixin2 init after _super');\n }\n });\n\n class B extends A.extend(Mixin1, Mixin2) {\n init() {\n calls.push('B init before super.init');\n super.init(...arguments);\n calls.push('B init after super.init');\n }\n\n onSomeEvent(evt) {\n events.push(`B onSomeEvent ${evt}`);\n }\n\n fullNameDidChange() {\n changes.push('B fullNameDidChange');\n }\n }\n\n // // define a CP\n (0, _metal.defineProperty)(B.prototype, 'full', (0, _metal.computed)('first', 'last', {\n get() {\n return this.first + ' ' + this.last;\n }\n }));\n\n // Only string observers are allowed for prototypes\n (0, _metal.addObserver)(B.prototype, 'full', null, 'fullNameDidChange');\n\n // Only string listeners are allowed for prototypes\n (0, _metal.addListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n\n B.reopen({\n init() {\n calls.push('reopen init before _super');\n this._super(...arguments);\n calls.push('reopen init after _super');\n }\n });\n\n let C = B.extend({\n init() {\n calls.push('C init before _super');\n this._super(...arguments);\n calls.push('C init after _super');\n },\n\n onSomeEvent(evt) {\n calls.push('C onSomeEvent before _super');\n this._super(evt);\n calls.push('C onSomeEvent after _super');\n },\n\n fullNameDidChange() {\n calls.push('C fullNameDidChange before _super');\n this._super();\n calls.push('C fullNameDidChange after _super');\n }\n });\n\n class D extends C {\n init() {\n calls.push('D init before super.init');\n super.init(...arguments);\n calls.push('D init after super.init');\n }\n\n onSomeEvent(evt) {\n events.push('D onSomeEvent before super.onSomeEvent');\n super.onSomeEvent(evt);\n events.push('D onSomeEvent after super.onSomeEvent');\n }\n\n fullNameDidChange() {\n changes.push('D fullNameDidChange before super.fullNameDidChange');\n super.fullNameDidChange();\n changes.push('D fullNameDidChange after super.fullNameDidChange');\n }\n\n triggerSomeEvent(...args) {\n (0, _metal.sendEvent)(this, 'someEvent', args);\n }\n }\n\n assert.deepEqual(calls, [], 'nothing has been called');\n assert.deepEqual(changes, [], 'full has not changed');\n assert.deepEqual(events, [], 'onSomeEvent has not been triggered');\n\n let d = D.create({ first: 'Robert', last: 'Jackson' });\n\n assert.deepEqual(calls, ['D init before super.init', 'C init before _super', 'reopen init before _super', 'B init before super.init', 'Mixin2 init before _super', 'Mixin1 init before _super', 'A init', 'Mixin1 init after _super', 'Mixin2 init after _super', 'B init after super.init', 'reopen init after _super', 'C init after _super', 'D init after super.init']);\n assert.deepEqual(changes, [], 'full has not changed');\n assert.deepEqual(events, [], 'onSomeEvent has not been triggered');\n\n assert.deepEqual(lastProps, {\n first: 'Robert',\n last: 'Jackson'\n });\n\n assert.equal(d.full, 'Robert Jackson');\n\n d.setProperties({ first: 'Kris', last: 'Selden' });\n assert.deepEqual(changes, ['D fullNameDidChange before super.fullNameDidChange', 'B fullNameDidChange', 'D fullNameDidChange after super.fullNameDidChange']);\n\n assert.equal(d.full, 'Kris Selden');\n\n d.triggerSomeEvent('event arg');\n assert.deepEqual(events, ['D onSomeEvent before super.onSomeEvent', 'B onSomeEvent event arg', 'D onSomeEvent after super.onSomeEvent']);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/events_test', ['@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/mixins/evented', 'internal-test-helpers'], function (_object, _evented, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Object events', class extends _internalTestHelpers.AbstractTestCase {\n ['@test a listener can be added to an object'](assert) {\n let count = 0;\n let F = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', F);\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\n assert.equal(count, 2, 'the event was triggered');\n }\n\n ['@test a listener can be added and removed automatically the first time it is triggered'](assert) {\n let count = 0;\n let F = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', F);\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was not triggered again');\n }\n\n ['@test triggering an event can have arguments'](assert) {\n let self, args;\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', function () {\n args = [].slice.call(arguments);\n self = this;\n });\n\n obj.trigger('event!', 'foo', 'bar');\n\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, obj);\n }\n\n ['@test a listener can be added and removed automatically and have arguments'](assert) {\n let self, args;\n let count = 0;\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', function () {\n args = [].slice.call(arguments);\n self = this;\n count++;\n });\n\n obj.trigger('event!', 'foo', 'bar');\n\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, obj);\n assert.equal(count, 1, 'the event is triggered once');\n\n obj.trigger('event!', 'baz', 'bat');\n\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(count, 1, 'the event was not triggered again');\n assert.equal(self, obj);\n }\n\n ['@test binding an event can specify a different target'](assert) {\n let self, args;\n\n let obj = _object.default.extend(_evented.default).create();\n let target = {};\n\n obj.on('event!', target, function () {\n args = [].slice.call(arguments);\n self = this;\n });\n\n obj.trigger('event!', 'foo', 'bar');\n\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, target);\n }\n\n ['@test a listener registered with one can take method as string and can be added with different target'](assert) {\n let count = 0;\n let target = {};\n target.fn = function () {\n count++;\n };\n\n let obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', target, 'fn');\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was triggered');\n\n obj.trigger('event!');\n\n assert.equal(count, 1, 'the event was not triggered again');\n }\n\n ['@test a listener registered with one can be removed with off'](assert) {\n let obj = _object.default.extend(_evented.default, {\n F() {}\n }).create();\n let F = function () {};\n\n obj.one('event!', F);\n obj.one('event!', obj, 'F');\n\n assert.equal(obj.has('event!'), true, 'has events');\n\n obj.off('event!', F);\n obj.off('event!', obj, 'F');\n\n assert.equal(obj.has('event!'), false, 'has no more events');\n }\n\n ['@test adding and removing listeners should be chainable'](assert) {\n let obj = _object.default.extend(_evented.default).create();\n let F = function () {};\n\n let ret = obj.on('event!', F);\n assert.equal(ret, obj, '#on returns self');\n\n ret = obj.off('event!', F);\n assert.equal(ret, obj, '#off returns self');\n\n ret = obj.one('event!', F);\n assert.equal(ret, obj, '#one returns self');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/extend_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EmberObject.extend', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Basic extend'](assert) {\n let SomeClass = _object.default.extend({ foo: 'BAR' });\n assert.ok(SomeClass.isClass, 'A class has isClass of true');\n let obj = SomeClass.create();\n assert.equal(obj.foo, 'BAR');\n }\n\n ['@test Sub-subclass'](assert) {\n let SomeClass = _object.default.extend({ foo: 'BAR' });\n let AnotherClass = SomeClass.extend({ bar: 'FOO' });\n let obj = AnotherClass.create();\n assert.equal(obj.foo, 'BAR');\n assert.equal(obj.bar, 'FOO');\n }\n\n ['@test Overriding a method several layers deep'](assert) {\n let SomeClass = _object.default.extend({\n fooCnt: 0,\n foo() {\n this.fooCnt++;\n },\n\n barCnt: 0,\n bar() {\n this.barCnt++;\n }\n });\n\n let AnotherClass = SomeClass.extend({\n barCnt: 0,\n bar() {\n this.barCnt++;\n this._super(...arguments);\n }\n });\n\n let FinalClass = AnotherClass.extend({\n fooCnt: 0,\n foo() {\n this.fooCnt++;\n this._super(...arguments);\n }\n });\n\n let obj = FinalClass.create();\n obj.foo();\n obj.bar();\n assert.equal(obj.fooCnt, 2, 'should invoke both');\n assert.equal(obj.barCnt, 2, 'should invoke both');\n\n // Try overriding on create also\n obj = FinalClass.extend({\n foo() {\n this.fooCnt++;\n this._super(...arguments);\n }\n }).create();\n\n obj.foo();\n obj.bar();\n assert.equal(obj.fooCnt, 3, 'should invoke final as well');\n assert.equal(obj.barCnt, 2, 'should invoke both');\n }\n\n ['@test With concatenatedProperties'](assert) {\n let SomeClass = _object.default.extend({\n things: 'foo',\n concatenatedProperties: ['things']\n });\n let AnotherClass = SomeClass.extend({ things: 'bar' });\n let YetAnotherClass = SomeClass.extend({ things: 'baz' });\n let some = SomeClass.create();\n let another = AnotherClass.create();\n let yetAnother = YetAnotherClass.create();\n assert.deepEqual(some.get('things'), ['foo'], 'base class should have just its value');\n assert.deepEqual(another.get('things'), ['foo', 'bar'], \"subclass should have base class' and its own\");\n assert.deepEqual(yetAnother.get('things'), ['foo', 'baz'], \"subclass should have base class' and its own\");\n }\n\n ['@test With concatenatedProperties class properties'](assert) {\n let SomeClass = _object.default.extend();\n SomeClass.reopenClass({\n concatenatedProperties: ['things'],\n things: 'foo'\n });\n let AnotherClass = SomeClass.extend();\n AnotherClass.reopenClass({ things: 'bar' });\n let YetAnotherClass = SomeClass.extend();\n YetAnotherClass.reopenClass({ things: 'baz' });\n let some = SomeClass.create();\n let another = AnotherClass.create();\n let yetAnother = YetAnotherClass.create();\n assert.deepEqual((0, _metal.get)(some.constructor, 'things'), ['foo'], 'base class should have just its value');\n assert.deepEqual((0, _metal.get)(another.constructor, 'things'), ['foo', 'bar'], \"subclass should have base class' and its own\");\n assert.deepEqual((0, _metal.get)(yetAnother.constructor, 'things'), ['foo', 'baz'], \"subclass should have base class' and its own\");\n }\n\n ['@test Overriding a computed property with an observer'](assert) {\n let Parent = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n let seen = [];\n\n let Child = Parent.extend({\n foo: (0, _metal.observer)('bar', function () {\n seen.push(this.get('bar'));\n })\n });\n\n let child = Child.create({ bar: 0 });\n\n assert.deepEqual(seen, []);\n\n child.set('bar', 1);\n\n assert.deepEqual(seen, [1]);\n\n child.set('bar', 2);\n\n assert.deepEqual(seen, [1, 2]);\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/observer_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_runloop, _metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EmberObject observer', class extends _internalTestHelpers.AbstractTestCase {\n ['@test observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = MyClass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on subclass'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let Subclass = MyClass.extend({\n foo: (0, _metal.observer)('baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = Subclass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on instance'](assert) {\n let obj = _object.default.extend({\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create({\n count: 0\n });\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer on instance overriding class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj = MyClass.extend({\n foo: (0, _metal.observer)('baz', function () {\n // <-- change property we observe\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create();\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n\n (0, _metal.set)(obj, 'bar', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n\n (0, _metal.set)(obj, 'baz', 'BAZ');\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n ['@test observer should not fire after being destroyed'](assert) {\n let obj = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create();\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'precond - should not invoke observer immediately');\n\n (0, _runloop.run)(() => obj.destroy());\n\n expectAssertion(function () {\n (0, _metal.set)(obj, 'bar', 'BAZ');\n }, `calling set on destroyed object: ${obj}.bar = BAZ`);\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n }\n\n // ..........................................................\n // COMPLEX PROPERTIES\n //\n\n ['@test chain observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj1 = MyClass.create({\n bar: { baz: 'biff' }\n });\n\n let obj2 = MyClass.create({\n bar: { baz: 'biff2' }\n });\n\n assert.equal((0, _metal.get)(obj1, 'count'), 0, 'should not invoke yet');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should invoke observer on obj1');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 1, 'should invoke observer on obj2');\n }\n\n ['@test chain observer on class'](assert) {\n let MyClass = _object.default.extend({\n count: 0,\n\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n let obj1 = MyClass.extend().create({\n bar: { baz: 'biff' }\n });\n\n let obj2 = MyClass.extend({\n foo: (0, _metal.observer)('bar2.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create({\n bar: { baz: 'biff2' },\n bar2: { baz: 'biff3' }\n });\n\n assert.equal((0, _metal.get)(obj1, 'count'), 0, 'should not invoke yet');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should invoke observer on obj1');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BIFF3');\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 1, 'should invoke observer on obj2');\n }\n\n ['@test chain observer on class that has a reference to an uninitialized object will finish chains that reference it'](assert) {\n let changed = false;\n\n let ChildClass = _object.default.extend({\n parent: null,\n parentOneTwoDidChange: (0, _metal.observer)('parent.one.two', function () {\n changed = true;\n })\n });\n\n let ParentClass = _object.default.extend({\n one: {\n two: 'old'\n },\n init() {\n this.child = ChildClass.create({\n parent: this\n });\n }\n });\n\n let parent = ParentClass.create();\n\n assert.equal(changed, false, 'precond');\n\n (0, _metal.set)(parent, 'one.two', 'new');\n\n assert.equal(changed, true, 'child should have been notified of change to path');\n\n (0, _metal.set)(parent, 'one', { two: 'newer' });\n\n assert.equal(changed, true, 'child should have been notified of change to path');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/reopenClass_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/object/reopenClass', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adds new properties to subclass'](assert) {\n let Subclass = _object.default.extend();\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\n\n assert.equal(Subclass.foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(Subclass, 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test class properties inherited by subclasses'](assert) {\n let Subclass = _object.default.extend();\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\n\n let SubSub = Subclass.extend();\n\n assert.equal(SubSub.foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(SubSub, 'bar'), 'BAR', 'Adds property');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/reopen_test', ['@ember/-internals/metal', '@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_metal, _object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/core_object/reopen', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adds new properties to subclass instance'](assert) {\n let Subclass = _object.default.extend();\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\n\n assert.equal(Subclass.create().foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(Subclass.create(), 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test reopened properties inherited by subclasses'](assert) {\n let Subclass = _object.default.extend();\n let SubSub = Subclass.extend();\n\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n bar: 'BAR'\n });\n\n assert.equal(SubSub.create().foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(SubSub.create(), 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test allows reopening already instantiated classes'](assert) {\n let Subclass = _object.default.extend();\n\n Subclass.create();\n\n Subclass.reopen({\n trololol: true\n });\n\n assert.equal(Subclass.create().get('trololol'), true, 'reopen works');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/strict-mode-test', ['@ember/-internals/runtime/lib/system/object', 'internal-test-helpers'], function (_object, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('strict mode tests', class extends _internalTestHelpers.AbstractTestCase {\n ['@test __superWrapper does not throw errors in strict mode'](assert) {\n let Foo = _object.default.extend({\n blah() {\n return 'foo';\n }\n });\n\n let Bar = Foo.extend({\n blah() {\n return 'bar';\n },\n\n callBlah() {\n let blah = this.blah;\n\n return blah();\n }\n });\n\n let bar = Bar.create();\n\n assert.equal(bar.callBlah(), 'bar', 'can call local function without call/apply');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object/toString_test', ['@ember/runloop', '@ember/-internals/utils', '@ember/-internals/environment', '@ember/-internals/runtime/lib/system/object', '@ember/-internals/runtime/lib/system/namespace', 'internal-test-helpers'], function (_runloop, _utils, _environment, _object, _namespace, _internalTestHelpers) {\n 'use strict';\n\n let originalLookup = _environment.context.lookup;\n let lookup;\n\n (0, _internalTestHelpers.moduleFor)('system/object/toString', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n _environment.context.lookup = lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test toString() returns the same value if called twice'](assert) {\n let Foo = _namespace.default.create();\n Foo.toString = function () {\n return 'Foo';\n };\n\n Foo.Bar = _object.default.extend();\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n let obj = Foo.Bar.create();\n\n assert.equal(obj.toString(), '');\n assert.equal(obj.toString(), '');\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a class returns a useful value when nested in a namespace'](assert) {\n let obj;\n\n let Foo = _namespace.default.create();\n Foo.toString = function () {\n return 'Foo';\n };\n\n Foo.Bar = _object.default.extend();\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n Foo.Baz = Foo.Bar.extend();\n assert.equal(Foo.Baz.toString(), 'Foo.Baz');\n\n obj = Foo.Baz.create();\n assert.equal(obj.toString(), '');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace finds the namespace in lookup'](assert) {\n let Foo = lookup.Foo = _namespace.default.create();\n\n assert.equal(Foo.toString(), 'Foo');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace finds the namespace in lookup'](assert) {\n let Foo = lookup.Foo = _namespace.default.create();\n let obj;\n\n Foo.Bar = _object.default.extend();\n\n assert.equal(Foo.Bar.toString(), 'Foo.Bar');\n\n obj = Foo.Bar.create();\n assert.equal(obj.toString(), '');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString on a namespace falls back to modulePrefix, if defined'](assert) {\n let Foo = _namespace.default.create({ modulePrefix: 'foo' });\n\n assert.equal(Foo.toString(), 'foo');\n\n (0, _runloop.run)(Foo, 'destroy');\n }\n\n ['@test toString includes toStringExtension if defined'](assert) {\n let Foo = _object.default.extend({\n toStringExtension() {\n return 'fooey';\n }\n });\n let foo = Foo.create();\n let Bar = _object.default.extend({});\n let bar = Bar.create();\n\n // simulate these classes being defined on a Namespace\n (0, _utils.setName)(Foo, 'Foo');\n (0, _utils.setName)(Bar, 'Bar');\n\n assert.equal(bar.toString(), '', 'does not include toStringExtension part');\n assert.equal(foo.toString(), '', 'Includes toStringExtension result');\n }\n });\n});","enifed('@ember/-internals/runtime/tests/system/object_proxy_test', ['@ember/-internals/metal', '@ember/-internals/utils', '@ember/-internals/runtime/lib/system/object_proxy', 'internal-test-helpers'], function (_metal, _utils, _object_proxy, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ObjectProxy', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should not proxy properties passed to create'](assert) {\n let Proxy = _object_proxy.default.extend({\n cp: (0, _metal.computed)({\n get() {\n return this._cp;\n },\n set(key, value) {\n this._cp = value;\n return this._cp;\n }\n })\n });\n let proxy = Proxy.create({\n prop: 'Foo',\n cp: 'Bar'\n });\n\n assert.equal((0, _metal.get)(proxy, 'prop'), 'Foo', 'should not have tried to proxy set');\n assert.equal(proxy._cp, 'Bar', 'should use CP setter');\n }\n\n ['@test should proxy properties to content'](assert) {\n let content = {\n firstName: 'Tom',\n lastName: 'Dale',\n unknownProperty(key) {\n return key + ' unknown';\n }\n };\n let proxy = _object_proxy.default.create();\n\n assert.equal((0, _metal.get)(proxy, 'firstName'), undefined, 'get on proxy without content should return undefined');\n expectAssertion(() => {\n (0, _metal.set)(proxy, 'firstName', 'Foo');\n }, /Cannot delegate set\\('firstName', Foo\\) to the 'content'/i);\n\n (0, _metal.set)(proxy, 'content', content);\n\n assert.equal((0, _metal.get)(proxy, 'firstName'), 'Tom', 'get on proxy with content should forward to content');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Dale', 'get on proxy with content should forward to content');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo unknown', 'get on proxy with content should forward to content');\n\n (0, _metal.set)(proxy, 'lastName', 'Huda');\n\n assert.equal((0, _metal.get)(content, 'lastName'), 'Huda', 'content should have new value from set on proxy');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Huda', 'proxy should have new value from set on proxy');\n\n (0, _metal.set)(proxy, 'content', { firstName: 'Yehuda', lastName: 'Katz' });\n\n assert.equal((0, _metal.get)(proxy, 'firstName'), 'Yehuda', 'proxy should reflect updated content');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Katz', 'proxy should reflect updated content');\n }\n\n ['@test getting proxied properties with Ember.get should work'](assert) {\n let proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'FOO');\n }\n\n [`@test JSON.stringify doens't assert`](assert) {\n let proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: { foo: 'FOO' } }));\n }\n\n ['@test calling a function on the proxy avoids the assertion'](assert) {\n if (true /* DEBUG */ && _utils.HAS_NATIVE_PROXY) {\n let proxy = _object_proxy.default.extend({\n init() {\n if (!this.foobar) {\n this.foobar = function () {\n let content = (0, _metal.get)(this, 'content');\n return content.foobar.apply(content, []);\n };\n }\n }\n }).create({\n content: {\n foobar() {\n return 'xoxo';\n }\n }\n });\n\n assert.equal(proxy.foobar(), 'xoxo', 'should be able to use a function from a proxy');\n } else {\n assert.expect(0);\n }\n }\n\n [`@test setting a property on the proxy avoids the assertion`](assert) {\n let proxy = _object_proxy.default.create({\n toJSON: undefined,\n content: {\n toJSON() {\n return 'hello';\n }\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));\n }\n\n [`@test setting a property on the proxy's prototype avoids the assertion`](assert) {\n let proxy = _object_proxy.default.extend({\n toJSON: null\n }).create({\n content: {\n toJSON() {\n return 'hello';\n }\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));\n }\n\n ['@test getting proxied properties with [] should be an error'](assert) {\n if (true /* DEBUG */ && _utils.HAS_NATIVE_PROXY) {\n let proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n expectAssertion(() => proxy.foo, /\\.get\\('foo'\\)/);\n } else {\n assert.expect(0);\n }\n }\n\n ['@test should work with watched properties'](assert) {\n let content1 = { firstName: 'Tom', lastName: 'Dale' };\n let content2 = { firstName: 'Yehuda', lastName: 'Katz' };\n let count = 0;\n let last;\n\n let Proxy = _object_proxy.default.extend({\n fullName: (0, _metal.computed)(function () {\n let firstName = this.get('firstName');\n let lastName = this.get('lastName');\n\n if (firstName && lastName) {\n return firstName + ' ' + lastName;\n }\n return firstName || lastName;\n }).property('firstName', 'lastName')\n });\n\n let proxy = Proxy.create();\n\n (0, _metal.addObserver)(proxy, 'fullName', function () {\n last = (0, _metal.get)(proxy, 'fullName');\n count++;\n });\n\n // proxy without content returns undefined\n assert.equal((0, _metal.get)(proxy, 'fullName'), undefined);\n\n // setting content causes all watched properties to change\n (0, _metal.set)(proxy, 'content', content1);\n // both dependent keys changed\n assert.equal(count, 2);\n assert.equal(last, 'Tom Dale');\n\n // setting property in content causes proxy property to change\n (0, _metal.set)(content1, 'lastName', 'Huda');\n assert.equal(count, 3);\n assert.equal(last, 'Tom Huda');\n\n // replacing content causes all watched properties to change\n (0, _metal.set)(proxy, 'content', content2);\n // both dependent keys changed\n assert.equal(count, 5);\n assert.equal(last, 'Yehuda Katz');\n // content1 is no longer watched\n assert.ok(!(0, _metal.isWatching)(content1, 'firstName'), 'not watching firstName');\n assert.ok(!(0, _metal.isWatching)(content1, 'lastName'), 'not watching lastName');\n\n // setting property in new content\n (0, _metal.set)(content2, 'firstName', 'Tomhuda');\n assert.equal(last, 'Tomhuda Katz');\n assert.equal(count, 6);\n\n // setting property in proxy syncs with new content\n (0, _metal.set)(proxy, 'lastName', 'Katzdale');\n assert.equal(count, 7);\n assert.equal(last, 'Tomhuda Katzdale');\n assert.equal((0, _metal.get)(content2, 'firstName'), 'Tomhuda');\n assert.equal((0, _metal.get)(content2, 'lastName'), 'Katzdale');\n }\n\n ['@test set and get should work with paths'](assert) {\n let content = { foo: { bar: 'baz' } };\n let proxy = _object_proxy.default.create({ content });\n let count = 0;\n\n proxy.set('foo.bar', 'hello');\n assert.equal(proxy.get('foo.bar'), 'hello');\n assert.equal(proxy.get('content.foo.bar'), 'hello');\n\n proxy.addObserver('foo.bar', function () {\n count++;\n });\n\n proxy.set('foo.bar', 'bye');\n\n assert.equal(count, 1);\n assert.equal(proxy.get('foo.bar'), 'bye');\n assert.equal(proxy.get('content.foo.bar'), 'bye');\n }\n\n ['@test should transition between watched and unwatched strategies'](assert) {\n let content = { foo: 'foo' };\n let proxy = _object_proxy.default.create({ content: content });\n let count = 0;\n\n function observer() {\n count++;\n }\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.addObserver)(proxy, 'foo', observer);\n\n assert.equal(count, 0);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n\n (0, _metal.removeObserver)(proxy, 'foo', observer);\n\n (0, _metal.set)(content, 'foo', 'bar');\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n\n (0, _metal.set)(proxy, 'foo', 'foo');\n\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n }\n\n ['@test setting `undefined` to a proxied content property should override its existing value'](assert) {\n let proxyObject = _object_proxy.default.create({\n content: {\n prop: 'emberjs'\n }\n });\n (0, _metal.set)(proxyObject, 'prop', undefined);\n assert.equal((0, _metal.get)(proxyObject, 'prop'), undefined, 'sets the `undefined` value to the proxied content');\n }\n });\n});","enifed('@ember/-internals/utils/tests/cache_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Cache', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basic'](assert) {\n let cache = new _utils.Cache(100, key => key.toUpperCase());\n\n assert.equal(cache.get('foo'), 'FOO');\n assert.equal(cache.get('bar'), 'BAR');\n assert.equal(cache.get('foo'), 'FOO');\n }\n\n ['@test explicit sets'](assert) {\n let cache = new _utils.Cache(100, key => key.toUpperCase());\n\n assert.equal(cache.get('foo'), 'FOO');\n\n assert.equal(cache.set('foo', 'FOO!!!'), 'FOO!!!');\n\n assert.equal(cache.get('foo'), 'FOO!!!');\n\n assert.strictEqual(cache.set('foo', undefined), undefined);\n\n assert.strictEqual(cache.get('foo'), undefined);\n }\n\n ['@test caches computation correctly'](assert) {\n let count = 0;\n let cache = new _utils.Cache(100, key => {\n count++;\n return key.toUpperCase();\n });\n\n assert.equal(count, 0);\n cache.get('foo');\n assert.equal(count, 1);\n cache.get('bar');\n assert.equal(count, 2);\n cache.get('bar');\n assert.equal(count, 2);\n cache.get('foo');\n assert.equal(count, 2);\n }\n\n ['@test handles undefined value correctly'](assert) {\n let count = 0;\n let cache = new _utils.Cache(100, () => {\n count++;\n });\n\n assert.equal(count, 0);\n assert.strictEqual(cache.get('foo'), undefined);\n assert.equal(count, 1);\n assert.strictEqual(cache.get('bar'), undefined);\n assert.equal(count, 2);\n assert.strictEqual(cache.get('bar'), undefined);\n assert.equal(count, 2);\n assert.strictEqual(cache.get('foo'), undefined);\n assert.equal(count, 2);\n }\n\n ['@test continues working after reaching cache limit'](assert) {\n let cache = new _utils.Cache(3, key => key.toUpperCase());\n\n cache.get('a');\n cache.get('b');\n cache.get('c');\n\n assert.equal(cache.get('d'), 'D');\n assert.equal(cache.get('a'), 'A');\n assert.equal(cache.get('b'), 'B');\n assert.equal(cache.get('c'), 'C');\n }\n });\n});","enifed('@ember/-internals/utils/tests/can_invoke_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('Ember.canInvoke', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n obj = {\n foobar: 'foobar',\n aMethodThatExists() {}\n };\n }\n\n teardown() {\n obj = undefined;\n }\n\n [\"@test should return false if the object doesn't exist\"](assert) {\n assert.equal((0, _utils.canInvoke)(undefined, 'aMethodThatDoesNotExist'), false);\n }\n\n ['@test should return true for falsy values that have methods'](assert) {\n assert.equal((0, _utils.canInvoke)(false, 'valueOf'), true);\n assert.equal((0, _utils.canInvoke)('', 'charAt'), true);\n assert.equal((0, _utils.canInvoke)(0, 'toFixed'), true);\n }\n\n ['@test should return true if the method exists on the object'](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'aMethodThatExists'), true);\n }\n\n [\"@test should return false if the method doesn't exist on the object\"](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'aMethodThatDoesNotExist'), false);\n }\n\n ['@test should return false if the property exists on the object but is a non-function'](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'foobar'), false);\n }\n });\n});","enifed('@ember/-internals/utils/tests/checkHasSuper_test', ['@ember/-internals/browser-environment', '@ember/-internals/utils', 'internal-test-helpers'], function (_browserEnvironment, _utils, _internalTestHelpers) {\n 'use strict';\n\n // Only run this test on browsers that we are certain should have function\n // source available. This allows the test suite to continue to pass on other\n // platforms that correctly (for them) fall back to the \"always wrap\" code.\n if (_browserEnvironment.isChrome || _browserEnvironment.isFirefox) {\n (0, _internalTestHelpers.moduleFor)('checkHasSuper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test does not super wrap needlessly [GH #12462]'](assert) {\n assert.notOk((0, _utils.checkHasSuper)(function () {}), 'empty function does not have super');\n }\n });\n }\n});","enifed('@ember/-internals/utils/tests/generate_guid_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.generateGuid', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Prefix'](assert) {\n let a = {};\n\n assert.ok((0, _utils.generateGuid)(a, 'tyrell').indexOf('tyrell') > -1, 'guid can be prefixed');\n }\n });\n});","enifed('@ember/-internals/utils/tests/guid_for_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n function sameGuid(assert, a, b, message) {\n assert.equal((0, _utils.guidFor)(a), (0, _utils.guidFor)(b), message);\n }\n\n function diffGuid(assert, a, b, message) {\n assert.ok((0, _utils.guidFor)(a) !== (0, _utils.guidFor)(b), message);\n }\n\n function nanGuid(assert, obj) {\n let type = typeof obj;\n assert.ok(isNaN(parseInt((0, _utils.guidFor)(obj), 0)), 'guids for ' + type + \"don't parse to numbers\");\n }\n\n (0, _internalTestHelpers.moduleFor)('guidFor', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Object'](assert) {\n let a = {};\n let b = {};\n\n sameGuid(assert, a, a, 'same object always yields same guid');\n diffGuid(assert, a, b, 'different objects yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test strings'](assert) {\n let a = 'string A';\n let aprime = 'string A';\n let b = 'String B';\n\n sameGuid(assert, a, a, 'same string always yields same guid');\n sameGuid(assert, a, aprime, 'identical strings always yield the same guid');\n diffGuid(assert, a, b, 'different strings yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test numbers'](assert) {\n let a = 23;\n let aprime = 23;\n let b = 34;\n\n sameGuid(assert, a, a, 'same numbers always yields same guid');\n sameGuid(assert, a, aprime, 'identical numbers always yield the same guid');\n diffGuid(assert, a, b, 'different numbers yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test symbols'](assert) {\n if (typeof Symbol === 'undefined') {\n assert.ok(true, 'symbols are not supported on this browser');\n return;\n }\n\n let a = Symbol('a');\n let b = Symbol('b');\n\n sameGuid(assert, a, a, 'same symbols always yields same guid');\n diffGuid(assert, a, b, 'different symbols yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test booleans'](assert) {\n let a = true;\n let aprime = true;\n let b = false;\n\n sameGuid(assert, a, a, 'same booleans always yields same guid');\n sameGuid(assert, a, aprime, 'identical booleans always yield the same guid');\n diffGuid(assert, a, b, 'different boolean yield different guids');\n nanGuid(assert, a);\n nanGuid(assert, b);\n }\n\n ['@test null and undefined'](assert) {\n let a = null;\n let aprime = null;\n let b;\n\n sameGuid(assert, a, a, 'null always returns the same guid');\n sameGuid(assert, b, b, 'undefined always returns the same guid');\n sameGuid(assert, a, aprime, 'different nulls return the same guid');\n diffGuid(assert, a, b, 'null and undefined return different guids');\n nanGuid(assert, a);\n nanGuid(assert, b);\n }\n\n ['@test arrays'](assert) {\n let a = ['a', 'b', 'c'];\n let aprime = ['a', 'b', 'c'];\n let b = ['1', '2', '3'];\n\n sameGuid(assert, a, a, 'same instance always yields same guid');\n diffGuid(assert, a, aprime, 'identical arrays always yield the same guid');\n diffGuid(assert, a, b, 'different arrays yield different guids');\n nanGuid(assert, a);\n }\n });\n});","enifed('@ember/-internals/utils/tests/inspect_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.inspect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test strings'](assert) {\n assert.equal((0, _utils.inspect)('foo'), '\"foo\"');\n }\n\n ['@test numbers'](assert) {\n assert.equal((0, _utils.inspect)(2.6), '2.6');\n }\n\n ['@test null'](assert) {\n assert.equal((0, _utils.inspect)(null), 'null');\n }\n\n ['@test undefined'](assert) {\n assert.equal((0, _utils.inspect)(undefined), 'undefined');\n }\n\n ['@test true'](assert) {\n assert.equal((0, _utils.inspect)(true), 'true');\n }\n\n ['@test false'](assert) {\n assert.equal((0, _utils.inspect)(false), 'false');\n }\n\n ['@test object'](assert) {\n assert.equal((0, _utils.inspect)({}), '{ }');\n assert.equal((0, _utils.inspect)({ foo: 'bar' }), '{ foo: \"bar\" }');\n let obj = {\n foo() {\n return this;\n }\n };\n // IE 11 doesn't have function name\n if (obj.foo.name) {\n assert.equal((0, _utils.inspect)(obj), `{ foo: [Function:foo] }`);\n } else {\n assert.equal((0, _utils.inspect)(obj), `{ foo: [Function] }`);\n }\n }\n\n ['@test objects without a prototype'](assert) {\n let prototypelessObj = Object.create(null);\n prototypelessObj.a = 1;\n prototypelessObj.b = [Object.create(null)];\n assert.equal((0, _utils.inspect)({ foo: prototypelessObj }), '{ foo: { a: 1, b: [ { } ] } }');\n }\n\n ['@test array'](assert) {\n assert.equal((0, _utils.inspect)([1, 2, 3]), '[ 1, 2, 3 ]');\n }\n\n ['@test array list limit'](assert) {\n let a = [];\n for (let i = 0; i < 120; i++) {\n a.push(1);\n }\n assert.equal((0, _utils.inspect)(a), `[ ${a.slice(0, 100).join(', ')}, ... 20 more items ]`);\n }\n\n ['@test object list limit'](assert) {\n let obj = {};\n let pairs = [];\n for (let i = 0; i < 120; i++) {\n obj['key' + i] = i;\n pairs.push(`key${i}: ${i}`);\n }\n assert.equal((0, _utils.inspect)(obj), `{ ${pairs.slice(0, 100).join(', ')}, ... 20 more keys }`);\n }\n\n ['@test depth limit'](assert) {\n assert.equal((0, _utils.inspect)([[[['here', { a: 1 }, [1]]]]]), '[ [ [ [ \"here\", [Object], [Array] ] ] ] ]');\n }\n\n ['@test odd key'](assert) {\n assert.equal((0, _utils.inspect)({\n [`Hello world!\nHow are you?`]: 1\n }), '{ \"Hello world!\\\\nHow are you?\": 1 }');\n }\n\n ['@test node call'](assert) {\n let obj = { a: 1 };\n obj.inspect = _utils.inspect;\n let depth = 2;\n let options = {};\n assert.equal(obj.inspect(depth, options), obj);\n }\n\n ['@test cycle'](assert) {\n let obj = {};\n obj.a = obj;\n let arr = [obj];\n arr.push(arr);\n assert.equal((0, _utils.inspect)(arr), '[ { a: [Circular] }, [Circular] ]');\n }\n\n ['@test custom toString'](assert) {\n class Component {\n static toString() {\n return '@ember/component';\n }\n\n toString() {\n return `<${this.constructor}:ember234>`;\n }\n }\n\n assert.equal((0, _utils.inspect)([new Component(), Component]), '[ <@ember/component:ember234>, @ember/component ]');\n }\n\n ['@test regexp'](assert) {\n assert.equal((0, _utils.inspect)(/regexp/), '/regexp/');\n }\n\n ['@test date'](assert) {\n let inspected = (0, _utils.inspect)(new Date('Sat Apr 30 2011 13:24:11'));\n assert.ok(inspected.match(/Sat Apr 30/), 'The inspected date has its date');\n assert.ok(inspected.match(/2011/), 'The inspected date has its year');\n assert.ok(inspected.match(/13:24:11/), 'The inspected date has its time');\n }\n\n ['@test inspect outputs the toString() representation of Symbols'](assert) {\n if (_utils.HAS_NATIVE_SYMBOL) {\n let symbol = Symbol('test');\n assert.equal((0, _utils.inspect)(symbol), 'Symbol(test)');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/-internals/utils/tests/is_proxy_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils isProxy', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basic'](assert) {\n let proxy = {};\n (0, _utils.setProxy)(proxy);\n\n assert.equal((0, _utils.isProxy)(proxy), true);\n\n assert.equal((0, _utils.isProxy)({}), false);\n assert.equal((0, _utils.isProxy)(undefined), false);\n assert.equal((0, _utils.isProxy)(null), false);\n }\n });\n});","enifed('@ember/-internals/utils/tests/make_array_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.makeArray', class extends _internalTestHelpers.AbstractTestCase {\n ['@test undefined'](assert) {\n assert.deepEqual((0, _utils.makeArray)(), []);\n assert.deepEqual((0, _utils.makeArray)(undefined), []);\n }\n\n ['@test null'](assert) {\n assert.deepEqual((0, _utils.makeArray)(null), []);\n }\n\n ['@test string'](assert) {\n assert.deepEqual((0, _utils.makeArray)('lindsay'), ['lindsay']);\n }\n\n ['@test number'](assert) {\n assert.deepEqual((0, _utils.makeArray)(0), [0]);\n assert.deepEqual((0, _utils.makeArray)(1), [1]);\n }\n\n ['@test array'](assert) {\n assert.deepEqual((0, _utils.makeArray)([1, 2, 42]), [1, 2, 42]);\n }\n\n ['@test true'](assert) {\n assert.deepEqual((0, _utils.makeArray)(true), [true]);\n }\n\n ['@test false'](assert) {\n assert.deepEqual((0, _utils.makeArray)(false), [false]);\n }\n\n ['@test object'](assert) {\n assert.deepEqual((0, _utils.makeArray)({}), [{}]);\n }\n });\n});","enifed('@ember/-internals/utils/tests/to-string-test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils toString', class extends _internalTestHelpers.AbstractTestCase {\n [`@test toString uses an object's toString method when available`](assert) {\n let obj = {\n toString() {\n return 'bob';\n }\n };\n\n assert.strictEqual((0, _utils.toString)(obj), 'bob');\n }\n\n ['@test toString falls back to Object.prototype.toString'](assert) {\n let obj = Object.create(null);\n\n assert.strictEqual((0, _utils.toString)(obj), {}.toString());\n }\n\n ['@test toString does not fail when called on Arrays with objects without toString method'](assert) {\n let obj = Object.create(null);\n let arr = [obj, 2];\n\n assert.strictEqual((0, _utils.toString)(arr), `${{}.toString()},2`);\n }\n });\n});","enifed('@ember/-internals/utils/tests/try_invoke_test', ['@ember/-internals/utils', 'internal-test-helpers'], function (_utils, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n\n (0, _internalTestHelpers.moduleFor)('Ember.tryInvoke', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n obj = {\n aMethodThatExists() {\n return true;\n },\n aMethodThatTakesArguments(arg1, arg2) {\n return arg1 === arg2;\n }\n };\n }\n\n teardown() {\n obj = undefined;\n }\n\n [\"@test should return undefined when the object doesn't exist\"](assert) {\n assert.equal((0, _utils.tryInvoke)(undefined, 'aMethodThatDoesNotExist'), undefined);\n }\n\n [\"@test should return undefined when asked to perform a method that doesn't exist on the object\"](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatDoesNotExist'), undefined);\n }\n\n ['@test should return what the method returns when asked to perform a method that exists on the object'](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatExists'), true);\n }\n\n ['@test should return what the method returns when asked to perform a method that takes arguments and exists on the object'](assert) {\n assert.equal((0, _utils.tryInvoke)(obj, 'aMethodThatTakesArguments', [true, true]), true);\n }\n });\n});","enifed('@ember/application/tests/application_instance_test', ['@ember/engine', '@ember/application', '@ember/application/instance', '@ember/runloop', '@ember/-internals/container', 'internal-test-helpers', '@ember/-internals/runtime', '@ember/debug'], function (_engine, _application, _instance, _runloop, _container, _internalTestHelpers, _runtime, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n let application, appInstance;\n\n (0, _internalTestHelpers.moduleFor)('ApplicationInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n\n document.getElementById('qunit-fixture').innerHTML = `\n
    HI
    HI
    \n `;\n application = (0, _runloop.run)(() => _application.default.create({ rootElement: '#one', router: null }));\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n if (appInstance) {\n (0, _runloop.run)(appInstance, 'destroy');\n appInstance = null;\n }\n\n if (application) {\n (0, _runloop.run)(application, 'destroy');\n application = null;\n }\n\n document.getElementById('qunit-fixture').innerHTML = '';\n }\n\n ['@test an application instance can be created based upon an application'](assert) {\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n\n assert.ok(appInstance, 'instance should be created');\n assert.equal(appInstance.application, application, 'application should be set to parent');\n }\n\n ['@test customEvents added to the application before setupEventDispatcher'](assert) {\n assert.expect(1);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n application.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\n eventDispatcher.setup = function (events) {\n assert.equal(events.awesome, 'sauce');\n };\n\n appInstance.setupEventDispatcher();\n }\n\n ['@test customEvents added to the application before setupEventDispatcher'](assert) {\n assert.expect(1);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n application.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\n eventDispatcher.setup = function (events) {\n assert.equal(events.awesome, 'sauce');\n };\n\n appInstance.setupEventDispatcher();\n }\n\n ['@test customEvents added to the application instance before setupEventDispatcher'](assert) {\n assert.expect(1);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n appInstance.setupRegistry();\n\n appInstance.customEvents = {\n awesome: 'sauce'\n };\n\n let eventDispatcher = appInstance.lookup('event_dispatcher:main');\n eventDispatcher.setup = function (events) {\n assert.equal(events.awesome, 'sauce');\n };\n\n appInstance.setupEventDispatcher();\n }\n\n ['@test unregistering a factory clears all cached instances of that factory'](assert) {\n assert.expect(5);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n\n let PostController1 = (0, _internalTestHelpers.factory)();\n let PostController2 = (0, _internalTestHelpers.factory)();\n\n appInstance.register('controller:post', PostController1);\n\n let postController1 = appInstance.lookup('controller:post');\n let postController1Factory = appInstance.factoryFor('controller:post');\n assert.ok(postController1 instanceof PostController1, 'precond - lookup creates instance');\n assert.equal(PostController1, postController1Factory.class, 'precond - factoryFor().class matches');\n\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2);\n\n let postController2 = appInstance.lookup('controller:post');\n let postController2Factory = appInstance.factoryFor('controller:post');\n assert.ok(postController2 instanceof PostController2, 'lookup creates instance');\n assert.equal(PostController2, postController2Factory.class, 'factoryFor().class matches');\n\n assert.notStrictEqual(postController1, postController2, 'lookup creates a brand new instance, because the previous one was reset');\n }\n\n ['@skip unregistering a factory clears caches with source of that factory'](assert) {\n assert.expect(1);\n\n appInstance = (0, _runloop.run)(() => _instance.default.create({ application }));\n\n let PostController1 = (0, _internalTestHelpers.factory)();\n let PostController2 = (0, _internalTestHelpers.factory)();\n\n appInstance.register('controller:post', PostController1);\n\n appInstance.lookup('controller:post');\n let postControllerLookupWithSource = appInstance.lookup('controller:post', {\n source: 'doesnt-even-matter'\n });\n\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2);\n\n // The cache that is source-specific is not cleared\n assert.ok(postControllerLookupWithSource !== appInstance.lookup('controller:post', {\n source: 'doesnt-even-matter'\n }), 'lookup with source creates a new instance');\n }\n\n ['@test can build and boot a registered engine'](assert) {\n assert.expect(11);\n\n let ChatEngine = _engine.default.extend();\n let chatEngineInstance;\n\n application.register('engine:chat', ChatEngine);\n\n (0, _runloop.run)(() => {\n appInstance = _instance.default.create({ application });\n appInstance.setupRegistry();\n chatEngineInstance = appInstance.buildChildEngineInstance('chat');\n });\n\n return chatEngineInstance.boot().then(() => {\n assert.ok(true, 'boot successful');\n\n let registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment'];\n\n registrations.forEach(key => {\n assert.strictEqual(chatEngineInstance.resolveRegistration(key), appInstance.resolveRegistration(key), `Engine and parent app share registrations for '${key}'`);\n });\n\n let singletons = ['router:main', _container.privatize`-bucket-cache:main`, '-view-registry:main', '-environment:main', 'service:-document', 'event_dispatcher:main'];\n\n let env = appInstance.lookup('-environment:main');\n singletons.push(env.isInteractive ? 'renderer:-dom' : 'renderer:-inert');\n\n singletons.forEach(key => {\n assert.strictEqual(chatEngineInstance.lookup(key), appInstance.lookup(key), `Engine and parent app share singleton '${key}'`);\n });\n });\n }\n\n ['@test can build a registry via ApplicationInstance.setupRegistry() -- simulates ember-test-helpers'](assert) {\n let namespace = _runtime.Object.create({\n Resolver: { create: function () {} }\n });\n\n let registry = _application.default.buildRegistry(namespace);\n\n _instance.default.setupRegistry(registry);\n\n assert.equal(registry.resolve('service:-document'), document);\n }\n });\n});","enifed('@ember/application/tests/application_test', ['ember/version', '@ember/-internals/environment', '@ember/-internals/metal', '@ember/debug', '@ember/application', '@ember/-internals/routing', '@ember/-internals/views', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/glimmer', '@ember/-internals/container', '@ember/polyfills', 'internal-test-helpers', '@ember/runloop'], function (_version, _environment, _metal, _debug, _application, _routing, _views, _controller, _runtime, _glimmer, _container, _polyfills, _internalTestHelpers, _runloop) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application, autobooting multiple apps', class extends _internalTestHelpers.ApplicationTestCase {\n get fixture() {\n return `\n
    \n
    HI
    \n
    \n
    HI
    \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one',\n router: null,\n autoboot: true\n });\n }\n\n createSecondApplication(options) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, options);\n return this.secondApp = _application.default.create(myOptions);\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test you can make a new application in a non-overlapping element`](assert) {\n let app = this.runTask(() => this.createSecondApplication({\n rootElement: '#two'\n }));\n\n this.runTask(() => app.destroy());\n assert.ok(true, 'should not raise');\n }\n\n [`@test you cannot make a new application that is a parent of an existing application`]() {\n expectAssertion(() => {\n this.runTask(() => this.createSecondApplication({\n rootElement: this.applicationOptions.rootElement\n }));\n });\n }\n\n [`@test you cannot make a new application that is a descendant of an existing application`]() {\n expectAssertion(() => {\n this.runTask(() => this.createSecondApplication({\n rootElement: '#one-child'\n }));\n });\n }\n\n [`@test you cannot make a new application that is a duplicate of an existing application`]() {\n expectAssertion(() => {\n this.runTask(() => this.createSecondApplication({\n rootElement: '#one'\n }));\n });\n }\n\n [`@test you cannot make two default applications without a rootElement error`]() {\n expectAssertion(() => {\n this.runTask(() => this.createSecondApplication());\n });\n }\n }); /*globals EmberDev */\n\n\n (0, _internalTestHelpers.moduleFor)('Application', class extends _internalTestHelpers.ApplicationTestCase {\n [`@test builds a registry`](assert) {\n let { application } = this;\n assert.strictEqual(application.resolveRegistration('application:main'), application, `application:main is registered`);\n assert.deepEqual(application.registeredOptionsForType('component'), { singleton: false }, `optionsForType 'component'`);\n assert.deepEqual(application.registeredOptionsForType('view'), { singleton: false }, `optionsForType 'view'`);\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'controller:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view', '_viewRegistry', '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_topLevelViewTemplate', 'template:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'route:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'event_dispatcher:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'router:main', 'namespace', 'application:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view:-outlet', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:auto');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:hash');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:history');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:none');\n\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'controller', 'target', 'router:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'controller', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'router', '_bucketCache', _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_bucketCache', _container.privatize`-bucket-cache:main`);\n\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'route', '_router', 'router:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-text-field');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-text-area');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:-checkbox');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:link-to');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-routing');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component-lookup:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-glimmer-environment');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-dom-changes');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-dom-tree-construction');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-glimmer-environment', 'appendOperations', 'service:-dom-tree-construction');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'service:-glimmer-environment', 'updateOperations', 'service:-dom-changes');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'renderer', 'env', 'service:-glimmer-environment');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'renderer:-dom');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'renderer:-inert');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, _container.privatize`template:components/-default`);\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'view:-outlet', 'template', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, application, 'template', 'compiler', _container.privatize`template-compiler:main`);\n\n assert.deepEqual(application.registeredOptionsForType('helper'), { instantiate: false }, `optionsForType 'helper'`);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application, default resolver with autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super(...arguments);\n this.originalLookup = _environment.context.lookup;\n }\n\n teardown() {\n _environment.context.lookup = this.originalLookup;\n super.teardown();\n (0, _glimmer.setTemplates)({});\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true\n });\n }\n\n [`@test acts like a namespace`](assert) {\n this.application = this.runTask(() => this.createApplication());\n let Foo = this.application.Foo = _runtime.Object.extend();\n assert.equal(Foo.toString(), 'TestApp.Foo', 'Classes pick up their parent namespace');\n }\n\n [`@test can specify custom router`](assert) {\n let MyRouter = _routing.Router.extend();\n this.runTask(() => {\n this.createApplication();\n this.application.Router = MyRouter;\n });\n\n assert.ok(this.application.__deprecatedInstance__.lookup('router:main') instanceof MyRouter, 'application resolved the correct router');\n }\n\n [`@test Minimal Application initialized with just an application template`]() {\n this.setupFixture('');\n this.runTask(() => this.createApplication());\n this.assertInnerHTML('Hello World');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application, autobooting', class extends _internalTestHelpers.AutobootApplicationTestCase {\n constructor() {\n super(...arguments);\n this.originalLogVersion = _environment.ENV.LOG_VERSION;\n this.originalDebug = (0, _debug.getDebugFunction)('debug');\n this.originalWarn = (0, _debug.getDebugFunction)('warn');\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('warn', this.originalWarn);\n (0, _debug.setDebugFunction)('debug', this.originalDebug);\n _environment.ENV.LOG_VERSION = this.originalLogVersion;\n super.teardown();\n }\n\n [`@test initialized application goes to initial route`]() {\n this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', '

    Hi from index

    ');\n });\n\n this.assertText('Hi from index');\n }\n\n [`@test ready hook is called before routing begins`](assert) {\n assert.expect(2);\n\n this.runTask(() => {\n function registerRoute(application, name, callback) {\n let route = _routing.Route.extend({\n activate: callback\n });\n\n application.register('route:' + name, route);\n }\n\n let MyApplication = _application.default.extend({\n ready() {\n registerRoute(this, 'index', () => {\n assert.ok(true, 'last-minute route is activated');\n });\n }\n });\n\n let app = this.createApplication({}, MyApplication);\n\n registerRoute(app, 'application', () => assert.ok(true, 'normal route is activated'));\n });\n }\n\n [`@test initialize application via initialize call`](assert) {\n this.runTask(() => this.createApplication());\n // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(router instanceof _routing.Router, true, 'Router was set from initialize call');\n assert.equal(router.location instanceof _routing.NoneLocation, true, 'Location was set from location implementation name');\n }\n\n [`@test initialize application with stateManager via initialize call from Router class`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '

    Hello!

    ');\n });\n // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n let router = this.application.__deprecatedInstance__.lookup('router:main');\n assert.equal(router instanceof _routing.Router, true, 'Router was set from initialize call');\n this.assertText('Hello!');\n }\n\n [`@test Application Controller backs the appplication template`]() {\n this.runTask(() => {\n this.createApplication();\n this.addTemplate('application', '

    {{greeting}}

    ');\n this.add('controller:application', _controller.default.extend({\n greeting: 'Hello!'\n }));\n });\n this.assertText('Hello!');\n }\n\n [`@test enable log of libraries with an ENV var`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n let messages = [];\n\n _environment.ENV.LOG_VERSION = true;\n\n (0, _debug.setDebugFunction)('debug', message => messages.push(message));\n\n _metal.libraries.register('my-lib', '2.0.0a');\n\n this.runTask(() => this.createApplication());\n\n assert.equal(messages[1], 'Ember : ' + _version.default);\n if (_views.jQueryDisabled) {\n assert.equal(messages[2], 'my-lib : ' + '2.0.0a');\n } else {\n assert.equal(messages[2], 'jQuery : ' + (0, _views.jQuery)().jquery);\n assert.equal(messages[3], 'my-lib : ' + '2.0.0a');\n }\n\n _metal.libraries.deRegister('my-lib');\n }\n\n [`@test disable log of version of libraries with an ENV var`](assert) {\n let logged = false;\n\n _environment.ENV.LOG_VERSION = false;\n\n (0, _debug.setDebugFunction)('debug', () => logged = true);\n\n this.runTask(() => this.createApplication());\n\n assert.ok(!logged, 'library version logging skipped');\n }\n\n [`@test can resolve custom router`](assert) {\n let CustomRouter = _routing.Router.extend();\n\n this.runTask(() => {\n this.createApplication();\n this.add('router:main', CustomRouter);\n });\n\n assert.ok(this.application.__deprecatedInstance__.lookup('router:main') instanceof CustomRouter, 'application resolved the correct router');\n }\n\n [`@test does not leak itself in onLoad._loaded`](assert) {\n assert.equal(_application._loaded.application, undefined);\n this.runTask(() => this.createApplication());\n assert.equal(_application._loaded.application, this.application);\n this.runTask(() => this.application.destroy());\n assert.equal(_application._loaded.application, undefined);\n }\n\n [`@test can build a registry via Application.buildRegistry() --- simulates ember-test-helpers`](assert) {\n let namespace = _runtime.Object.create({\n Resolver: { create: function () {} }\n });\n\n let registry = _application.default.buildRegistry(namespace);\n\n assert.equal(registry.resolve('application:main'), namespace);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application#buildRegistry', class extends _internalTestHelpers.AbstractTestCase {\n [`@test can build a registry via Application.buildRegistry() --- simulates ember-test-helpers`](assert) {\n let namespace = _runtime.Object.create({\n Resolver: { create() {} }\n });\n\n let registry = _application.default.buildRegistry(namespace);\n\n assert.equal(registry.resolve('application:main'), namespace);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application - instance tracking', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test tracks built instance'](assert) {\n let instance = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n\n assert.ok(instance.isDestroyed, 'instance was destroyed');\n }\n\n ['@test tracks built instances'](assert) {\n let instanceA = this.application.buildInstance();\n let instanceB = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n\n assert.ok(instanceA.isDestroyed, 'instanceA was destroyed');\n assert.ok(instanceB.isDestroyed, 'instanceB was destroyed');\n }\n });\n});","enifed('@ember/application/tests/bootstrap-test', ['@ember/polyfills', 'internal-test-helpers'], function (_polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application with default resolver and autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n get fixture() {\n return `\n
    \n\n \n \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: true,\n rootElement: '#app'\n });\n }\n\n ['@test templates in script tags are extracted at application creation'](assert) {\n this.runTask(() => this.createApplication());\n assert.equal(document.getElementById('app').textContent, 'Hello World!');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/custom_resolver_test', ['@ember/application/globals-resolver', '@ember/polyfills', 'internal-test-helpers'], function (_globalsResolver, _polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application with extended default resolver and autoboot', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n get applicationOptions() {\n let applicationTemplate = this.compile(`

    Fallback

    `);\n\n let Resolver = _globalsResolver.default.extend({\n resolveTemplate(resolvable) {\n if (resolvable.fullNameWithoutType === 'application') {\n return applicationTemplate;\n } else {\n return this._super(resolvable);\n }\n }\n });\n\n return (0, _polyfills.assign)(super.applicationOptions, {\n Resolver,\n autoboot: true\n });\n }\n\n [`@test a resolver can be supplied to application`]() {\n this.runTask(() => this.createApplication());\n this.assertText('Fallback');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/default_resolver_test', ['internal-test-helpers', '@ember/-internals/environment', '@ember/controller', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/routing', '@ember/-internals/glimmer', '@ember/debug'], function (_internalTestHelpers, _environment, _controller, _service, _runtime, _routing, _glimmer, _debug) {\n 'use strict';\n\n /* globals EmberDev */\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n beforeEach() {\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n get privateRegistry() {\n return this.application.__registry__;\n }\n\n /*\n * This first batch of tests are integration tests against the public\n * applicationInstance API.\n */\n\n [`@test the default resolver looks up templates in Ember.TEMPLATES`](assert) {\n let fooTemplate = this.addTemplate('foo', `foo template`);\n let fooBarTemplate = this.addTemplate('fooBar', `fooBar template`);\n let fooBarBazTemplate = this.addTemplate('fooBar/baz', `fooBar/baz template`);\n\n assert.equal(this.applicationInstance.factoryFor('template:foo').class, fooTemplate, 'resolves template:foo');\n assert.equal(this.applicationInstance.factoryFor('template:fooBar').class, fooBarTemplate, 'resolves template:foo_bar');\n assert.equal(this.applicationInstance.factoryFor('template:fooBar.baz').class, fooBarBazTemplate, 'resolves template:foo_bar.baz');\n }\n\n [`@test the default resolver looks up basic name as no prefix`](assert) {\n let instance = this.applicationInstance.lookup('controller:basic');\n assert.ok(_controller.default.detect(instance), 'locator looks up correct controller');\n }\n\n [`@test the default resolver looks up arbitrary types on the namespace`](assert) {\n let Class = this.application.FooManager = _runtime.Object.extend();\n let resolvedClass = this.application.resolveRegistration('manager:foo');\n assert.equal(Class, resolvedClass, 'looks up FooManager on application');\n }\n\n [`@test the default resolver resolves models on the namespace`](assert) {\n let Class = this.application.Post = _runtime.Object.extend();\n let factoryClass = this.applicationInstance.factoryFor('model:post').class;\n assert.equal(Class, factoryClass, 'looks up Post model on application');\n }\n\n [`@test the default resolver resolves *:main on the namespace`](assert) {\n let Class = this.application.FooBar = _runtime.Object.extend();\n let factoryClass = this.applicationInstance.factoryFor('foo-bar:main').class;\n assert.equal(Class, factoryClass, 'looks up FooBar type without name on application');\n }\n\n [`@test the default resolver resolves container-registered helpers`](assert) {\n let shorthandHelper = (0, _glimmer.helper)(() => {});\n let helper = _glimmer.Helper.extend();\n\n this.application.register('helper:shorthand', shorthandHelper);\n this.application.register('helper:complete', helper);\n\n let lookedUpShorthandHelper = this.applicationInstance.factoryFor('helper:shorthand').class;\n\n assert.ok(lookedUpShorthandHelper.isHelperFactory, 'shorthand helper isHelper');\n\n let lookedUpHelper = this.applicationInstance.factoryFor('helper:complete').class;\n\n assert.ok(lookedUpHelper.isHelperFactory, 'complete helper is factory');\n assert.ok(helper.detect(lookedUpHelper), 'looked up complete helper');\n }\n\n [`@test the default resolver resolves container-registered helpers via lookupFor`](assert) {\n let shorthandHelper = (0, _glimmer.helper)(() => {});\n let helper = _glimmer.Helper.extend();\n\n this.application.register('helper:shorthand', shorthandHelper);\n this.application.register('helper:complete', helper);\n\n let lookedUpShorthandHelper = this.applicationInstance.factoryFor('helper:shorthand').class;\n\n assert.ok(lookedUpShorthandHelper.isHelperFactory, 'shorthand helper isHelper');\n\n let lookedUpHelper = this.applicationInstance.factoryFor('helper:complete').class;\n\n assert.ok(lookedUpHelper.isHelperFactory, 'complete helper is factory');\n assert.ok(helper.detect(lookedUpHelper), 'looked up complete helper');\n }\n\n [`@test the default resolver resolves helpers on the namespace`](assert) {\n let ShorthandHelper = (0, _glimmer.helper)(() => {});\n let CompleteHelper = _glimmer.Helper.extend();\n\n this.application.ShorthandHelper = ShorthandHelper;\n this.application.CompleteHelper = CompleteHelper;\n\n let resolvedShorthand = this.application.resolveRegistration('helper:shorthand');\n let resolvedComplete = this.application.resolveRegistration('helper:complete');\n\n assert.equal(resolvedShorthand, ShorthandHelper, 'resolve fetches the shorthand helper factory');\n assert.equal(resolvedComplete, CompleteHelper, 'resolve fetches the complete helper factory');\n }\n\n [`@test the default resolver resolves to the same instance, no matter the notation `](assert) {\n this.application.NestedPostController = _controller.default.extend({});\n\n assert.equal(this.applicationInstance.lookup('controller:nested-post'), this.applicationInstance.lookup('controller:nested_post'), 'looks up NestedPost controller on application');\n }\n\n [`@test the default resolver throws an error if the fullName to resolve is invalid`]() {\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(undefined);\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(null);\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(':');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('model');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration('model:');\n }, /fullName must be a proper full name/);\n expectAssertion(() => {\n this.applicationInstance.resolveRegistration(':type');\n }, /fullName must be a proper full name/);\n }\n\n /*\n * The following are integration tests against the private registry API.\n */\n\n [`@test lookup description`](assert) {\n this.application.toString = () => 'App';\n\n assert.equal(this.privateRegistry.describe('controller:foo'), 'App.FooController', 'Type gets appended at the end');\n assert.equal(this.privateRegistry.describe('controller:foo.bar'), 'App.FooBarController', 'dots are removed');\n assert.equal(this.privateRegistry.describe('model:foo'), 'App.Foo', \"models don't get appended at the end\");\n }\n\n [`@test assertion for routes without isRouteFactory property`]() {\n this.application.FooRoute = _glimmer.Component.extend();\n\n expectAssertion(() => {\n this.privateRegistry.resolve(`route:foo`);\n }, /to resolve to an Ember.Route/, 'Should assert');\n }\n\n [`@test no assertion for routes that extend from Route`](assert) {\n assert.expect(0);\n this.application.FooRoute = _routing.Route.extend();\n this.privateRegistry.resolve(`route:foo`);\n }\n\n [`@test deprecation warning for service factories without isServiceFactory property`]() {\n expectAssertion(() => {\n this.application.FooService = _runtime.Object.extend();\n this.privateRegistry.resolve('service:foo');\n }, /Expected service:foo to resolve to an Ember.Service but instead it was TestApp\\.FooService\\./);\n }\n\n [`@test no deprecation warning for service factories that extend from Service`](assert) {\n assert.expect(0);\n this.application.FooService = _service.default.extend();\n this.privateRegistry.resolve('service:foo');\n }\n\n [`@test deprecation warning for component factories without isComponentFactory property`]() {\n expectAssertion(() => {\n this.application.FooComponent = _runtime.Object.extend();\n this.privateRegistry.resolve('component:foo');\n }, /Expected component:foo to resolve to an Ember\\.Component but instead it was TestApp\\.FooComponent\\./);\n }\n\n [`@test no deprecation warning for component factories that extend from Component`]() {\n expectNoDeprecation();\n this.application.FooView = _glimmer.Component.extend();\n this.privateRegistry.resolve('component:foo');\n }\n\n [`@test knownForType returns each item for a given type found`](assert) {\n this.application.FooBarHelper = 'foo';\n this.application.BazQuxHelper = 'bar';\n\n let found = this.privateRegistry.resolver.knownForType('helper');\n\n assert.deepEqual(found, {\n 'helper:foo-bar': true,\n 'helper:baz-qux': true\n });\n }\n\n [`@test knownForType is not required to be present on the resolver`](assert) {\n delete this.privateRegistry.resolver.knownForType;\n\n this.privateRegistry.resolver.knownForType('helper', () => {});\n\n assert.ok(true, 'does not error');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver w/ other namespace', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n beforeEach() {\n this.UserInterface = _environment.context.lookup.UserInterface = _runtime.Namespace.create();\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n teardown() {\n let UserInterfaceNamespace = _runtime.Namespace.NAMESPACES_BY_ID['UserInterface'];\n if (UserInterfaceNamespace) {\n this.runTask(() => {\n UserInterfaceNamespace.destroy();\n });\n }\n super.teardown();\n }\n\n [`@test the default resolver can look things up in other namespaces`](assert) {\n this.UserInterface.NavigationController = _controller.default.extend();\n\n let nav = this.applicationInstance.lookup('controller:userInterface/navigation');\n\n assert.ok(nav instanceof this.UserInterface.NavigationController, 'the result should be an instance of the specified class');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Integration - default resolver', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super();\n this._originalLookup = _environment.context.lookup;\n this._originalInfo = (0, _debug.getDebugFunction)('info');\n }\n\n beforeEach() {\n this.runTask(() => this.createApplication());\n return this.visit('/');\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('info', this._originalInfo);\n _environment.context.lookup = this._originalLookup;\n super.teardown();\n }\n\n [`@test the default resolver logs hits if 'LOG_RESOLVER' is set`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(3);\n\n this.application.LOG_RESOLVER = true;\n this.application.ScoobyDoo = _runtime.Object.extend();\n this.application.toString = () => 'App';\n\n (0, _debug.setDebugFunction)('info', function (symbol, name, padding, lookupDescription) {\n assert.equal(symbol, '[✓]', 'proper symbol is printed when a module is found');\n assert.equal(name, 'doo:scooby', 'proper lookup value is logged');\n assert.equal(lookupDescription, 'App.ScoobyDoo');\n });\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n }\n\n [`@test the default resolver logs misses if 'LOG_RESOLVER' is set`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(3);\n\n this.application.LOG_RESOLVER = true;\n this.application.toString = () => 'App';\n\n (0, _debug.setDebugFunction)('info', function (symbol, name, padding, lookupDescription) {\n assert.equal(symbol, '[ ]', 'proper symbol is printed when a module is not found');\n assert.equal(name, 'doo:scooby', 'proper lookup value is logged');\n assert.equal(lookupDescription, 'App.ScoobyDoo');\n });\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n }\n\n [`@test doesn't log without LOG_RESOLVER`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n let infoCount = 0;\n\n this.application.ScoobyDoo = _runtime.Object.extend();\n\n (0, _debug.setDebugFunction)('info', () => infoCount = infoCount + 1);\n\n this.applicationInstance.resolveRegistration('doo:scooby');\n this.applicationInstance.resolveRegistration('doo:scrappy');\n assert.equal(infoCount, 0, 'console.info should not be called if LOG_RESOLVER is not set');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/normalization_test', ['@ember/runloop', '@ember/application', 'internal-test-helpers'], function (_runloop, _application, _internalTestHelpers) {\n 'use strict';\n\n let application, registry;\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - normalize', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n application = (0, _runloop.run)(_application.default, 'create');\n registry = application.__registry__;\n }\n\n teardown() {\n super.teardown();\n (0, _runloop.run)(application, 'destroy');\n application = undefined;\n registry = undefined;\n }\n\n ['@test normalization'](assert) {\n assert.ok(registry.normalize, 'registry#normalize is present');\n\n assert.equal(registry.normalize('foo:bar'), 'foo:bar');\n\n assert.equal(registry.normalize('controller:posts'), 'controller:posts');\n assert.equal(registry.normalize('controller:posts_index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts.index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts-index'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:posts.post.index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts_post.index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts.post_index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:posts.post-index'), 'controller:postsPostIndex');\n assert.equal(registry.normalize('controller:postsIndex'), 'controller:postsIndex');\n assert.equal(registry.normalize('controller:blogPosts.index'), 'controller:blogPostsIndex');\n assert.equal(registry.normalize('controller:blog/posts.index'), 'controller:blog/postsIndex');\n assert.equal(registry.normalize('controller:blog/posts-index'), 'controller:blog/postsIndex');\n assert.equal(registry.normalize('controller:blog/posts.post.index'), 'controller:blog/postsPostIndex');\n assert.equal(registry.normalize('controller:blog/posts_post.index'), 'controller:blog/postsPostIndex');\n assert.equal(registry.normalize('controller:blog/posts_post-index'), 'controller:blog/postsPostIndex');\n\n assert.equal(registry.normalize('template:blog/posts_index'), 'template:blog/posts_index');\n }\n\n ['@test normalization is indempotent'](assert) {\n let examples = ['controller:posts', 'controller:posts.post.index', 'controller:blog/posts.post_index', 'template:foo_bar'];\n\n examples.forEach(example => {\n assert.equal(registry.normalize(registry.normalize(example)), registry.normalize(example));\n });\n }\n });\n});","enifed('@ember/application/tests/dependency_injection/to_string_test', ['@ember/polyfills', '@ember/-internals/utils', '@ember/-internals/runtime', 'internal-test-helpers'], function (_polyfills, _utils, _runtime, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - DefaultResolver#toString', class extends _internalTestHelpers.DefaultResolverApplicationTestCase {\n constructor() {\n super();\n this.runTask(() => this.createApplication());\n this.application.Post = _runtime.Object.extend();\n }\n\n beforeEach() {\n return this.visit('/');\n }\n\n ['@test factories'](assert) {\n let PostFactory = this.applicationInstance.factoryFor('model:post').class;\n assert.equal(PostFactory.toString(), 'TestApp.Post', 'expecting the model to be post');\n }\n\n ['@test instances'](assert) {\n let post = this.applicationInstance.lookup('model:post');\n let guid = (0, _utils.guidFor)(post);\n\n assert.equal(post.toString(), '', 'expecting the model to be post');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection - Resolver#toString', class extends _internalTestHelpers.ApplicationTestCase {\n beforeEach() {\n return this.visit('/');\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n Resolver: class extends _internalTestHelpers.ModuleBasedTestResolver {\n makeToString(_, fullName) {\n return fullName;\n }\n }\n });\n }\n\n ['@test toString called on a resolver'](assert) {\n this.add('model:peter', _runtime.Object.extend());\n\n let peter = this.applicationInstance.lookup('model:peter');\n let guid = (0, _utils.guidFor)(peter);\n assert.equal(peter.toString(), ``, 'expecting the supermodel to be peter');\n }\n });\n});","enifed('@ember/application/tests/dependency_injection_test', ['@ember/-internals/environment', '@ember/runloop', '@ember/-internals/runtime', '@ember/application', 'internal-test-helpers'], function (_environment, _runloop, _runtime, _application, _internalTestHelpers) {\n 'use strict';\n\n let originalLookup = _environment.context.lookup;\n let registry, locator, application;\n\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n application = (0, _runloop.run)(_application.default, 'create');\n\n application.Person = _runtime.Object.extend({});\n application.Orange = _runtime.Object.extend({});\n application.Email = _runtime.Object.extend({});\n application.User = _runtime.Object.extend({});\n application.PostIndexController = _runtime.Object.extend({});\n\n application.register('model:person', application.Person, {\n singleton: false\n });\n application.register('model:user', application.User, {\n singleton: false\n });\n application.register('fruit:favorite', application.Orange);\n application.register('communication:main', application.Email, {\n singleton: false\n });\n application.register('controller:postIndex', application.PostIndexController, {\n singleton: true\n });\n\n registry = application.__registry__;\n locator = application.__container__;\n\n _environment.context.lookup = {};\n }\n\n teardown() {\n super.teardown();\n (0, _runloop.run)(application, 'destroy');\n registry = application = locator = null;\n _environment.context.lookup = originalLookup;\n }\n\n ['@test container lookup is normalized'](assert) {\n let dotNotationController = locator.lookup('controller:post.index');\n let camelCaseController = locator.lookup('controller:postIndex');\n\n assert.ok(dotNotationController instanceof application.PostIndexController);\n assert.ok(camelCaseController instanceof application.PostIndexController);\n\n assert.equal(dotNotationController, camelCaseController);\n }\n\n ['@test registered entities can be looked up later'](assert) {\n assert.equal(registry.resolve('model:person'), application.Person);\n assert.equal(registry.resolve('model:user'), application.User);\n assert.equal(registry.resolve('fruit:favorite'), application.Orange);\n assert.equal(registry.resolve('communication:main'), application.Email);\n assert.equal(registry.resolve('controller:postIndex'), application.PostIndexController);\n\n assert.equal(locator.lookup('fruit:favorite'), locator.lookup('fruit:favorite'), 'singleton lookup worked');\n assert.ok(locator.lookup('model:user') !== locator.lookup('model:user'), 'non-singleton lookup worked');\n }\n\n ['@test injections'](assert) {\n application.inject('model', 'fruit', 'fruit:favorite');\n application.inject('model:user', 'communication', 'communication:main');\n\n let user = locator.lookup('model:user');\n let person = locator.lookup('model:person');\n let fruit = locator.lookup('fruit:favorite');\n\n assert.equal(user.get('fruit'), fruit);\n assert.equal(person.get('fruit'), fruit);\n\n assert.ok(application.Email.detectInstance(user.get('communication')));\n }\n });\n});","enifed('@ember/application/tests/initializers_test', ['@ember/polyfills', 'internal-test-helpers', '@ember/application'], function (_polyfills, _internalTestHelpers, _application) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application initializers', class extends _internalTestHelpers.AutobootApplicationTestCase {\n get fixture() {\n return `
    ONE
    \n
    TWO
    \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n let secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n let MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.initializer({ name: 'initializer' });\n });\n\n expectAssertion(() => {\n MyApplication.initializer({ initialize() {} });\n });\n }\n\n [`@test initializers that throw errors cause the boot promise to reject with the error`](assert) {\n assert.expect(2);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n initialize() {\n throw new Error('boot failure');\n }\n });\n\n this.runTask(() => {\n this.createApplication({\n autoboot: false\n }, MyApplication);\n });\n\n let app = this.application;\n\n try {\n this.runTask(() => {\n app.boot().then(() => {\n assert.ok(false, 'The boot promise should not resolve when there is a boot error');\n }, error => {\n assert.ok(error instanceof Error, 'The boot promise should reject with an error');\n assert.equal(error.message, 'boot failure');\n });\n });\n } catch (error) {\n assert.ok(false, 'The boot method should not throw');\n throw error;\n }\n }\n\n [`@test initializers are passed an App`](assert) {\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n initialize(App) {\n assert.ok(App instanceof _application.default, 'initialize is passed an Application');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.initializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can be registered in a specified order as an array`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.initializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\n initialize() {\n order.push('after c');\n }\n };\n\n MyApplication.initializer(b);\n MyApplication.initializer(a);\n MyApplication.initializer(afterC);\n MyApplication.initializer(afterB);\n MyApplication.initializer(c);\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n [`@test initializers set on Application subclasses are not shared between apps`](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = _application.default.extend();\n\n SecondApp.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n }\n\n [`@test initializers are concatenated`](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = FirstApp.extend();\n SecondApp.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run when base class created');\n\n firstInitializerRunCount = 0;\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n }\n\n [`@test initializers are per-app`](assert) {\n assert.expect(2);\n\n let FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(() => {\n FirstApp.initializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n assert.ok(true, 'Two apps can have initializers named the same.');\n }\n\n [`@test initializers are executed in their own context`](assert) {\n assert.expect(1);\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n });\n});","enifed('@ember/application/tests/instance_initializers_test', ['@ember/polyfills', 'internal-test-helpers', '@ember/application/instance', '@ember/application'], function (_polyfills, _internalTestHelpers, _instance, _application) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application instance initializers', class extends _internalTestHelpers.AutobootApplicationTestCase {\n get fixture() {\n return `
    ONE
    \n
    TWO
    \n `;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n let secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n let MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.instanceInitializer({ name: 'initializer' });\n });\n\n expectAssertion(() => {\n MyApplication.instanceInitializer({ initialize() {} });\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are passed an app instance`](assert) {\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'initializer',\n initialize(instance) {\n assert.ok(instance instanceof _instance.default, 'initialize is passed an application instance');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can be registered in a specified order as an array`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyApplication.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n let order = [];\n let MyApplication = _application.default.extend();\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\n initialize() {\n order.push('after c');\n }\n };\n\n MyApplication.instanceInitializer(b);\n MyApplication.instanceInitializer(a);\n MyApplication.instanceInitializer(afterC);\n MyApplication.instanceInitializer(afterB);\n MyApplication.instanceInitializer(c);\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n [`@test initializers set on Application subclasses should not be shared between apps`](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n }\n\n [`@test initializers are concatenated`](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondApp = FirstApp.extend();\n SecondApp.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run when base class created');\n\n firstInitializerRunCount = 0;\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n }\n\n [`@test initializers are per-app`](assert) {\n assert.expect(2);\n\n let FirstApp = _application.default.extend();\n FirstApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(function () {\n FirstApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n this.runTask(() => this.createApplication({}, FirstApp));\n\n let SecondApp = _application.default.extend();\n SecondApp.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n this.runTask(() => this.createSecondApplication({}, SecondApp));\n\n assert.ok(true, 'Two apps can have initializers named the same.');\n }\n\n [`@test initializers are run before ready hook`](assert) {\n assert.expect(2);\n\n let MyApplication = _application.default.extend({\n ready() {\n assert.ok(true, 'ready is called');\n readyWasCalled = false;\n }\n });\n let readyWasCalled = false;\n\n MyApplication.instanceInitializer({\n name: 'initializer',\n initialize() {\n assert.ok(!readyWasCalled, 'ready is not yet called');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are executed in their own context`](assert) {\n assert.expect(1);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers get an instance on app reset`](assert) {\n assert.expect(2);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'giveMeAnInstance',\n initialize(instance) {\n assert.ok(!!instance, 'Initializer got an instance');\n }\n });\n\n this.runTask(() => this.createApplication({}, MyApplication));\n\n this.runTask(() => this.application.reset());\n }\n });\n});","enifed('@ember/application/tests/lazy_load_test', ['@ember/runloop', '@ember/application', 'internal-test-helpers'], function (_runloop, _application, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Lazy Loading', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n let keys = Object.keys(_application._loaded);\n for (let i = 0; i < keys.length; i++) {\n delete _application._loaded[keys[i]];\n }\n }\n\n ['@test if a load hook is registered, it is executed when runLoadHooks are exected'](assert) {\n let count = 0;\n\n (0, _runloop.run)(function () {\n (0, _application.onLoad)('__test_hook__', function (object) {\n count += object;\n });\n });\n\n (0, _runloop.run)(function () {\n (0, _application.runLoadHooks)('__test_hook__', 1);\n });\n\n assert.equal(count, 1, 'the object was passed into the load hook');\n }\n\n ['@test if runLoadHooks was already run, it executes newly added hooks immediately'](assert) {\n let count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n\n (0, _runloop.run)(() => (0, _application.runLoadHooks)('__test_hook__', 1));\n\n count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n\n assert.equal(count, 1, 'the original object was passed into the load hook');\n }\n\n [\"@test hooks in ENV.EMBER_LOAD_HOOKS['hookName'] get executed\"](assert) {\n // Note that the necessary code to perform this test is run before\n // the Ember lib is loaded in tests/index.html\n\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__before_ember_test_hook__', 1);\n });\n\n assert.equal(window.ENV.__test_hook_count__, 1, 'the object was passed into the load hook');\n }\n\n ['@test load hooks trigger a custom event'](assert) {\n if (typeof window === 'object' && typeof window.dispatchEvent === 'function' && typeof CustomEvent === 'function') {\n let eventObject = 'super duper awesome events';\n\n window.addEventListener('__test_hook_for_events__', function (e) {\n assert.ok(true, 'custom event was fired');\n assert.equal(e.detail, eventObject, 'event details are provided properly');\n });\n\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__test_hook_for_events__', eventObject);\n });\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('@ember/application/tests/logging_test', ['internal-test-helpers', '@ember/controller', '@ember/-internals/routing', '@ember/polyfills'], function (_internalTestHelpers, _controller, _routing, _polyfills) {\n 'use strict';\n\n /*globals EmberDev */\n\n class LoggingApplicationTestCase extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.logs = {};\n\n /* eslint-disable no-console */\n this._originalLogger = console.info;\n\n console.info = (_, { fullName }) => {\n if (!this.logs.hasOwnProperty(fullName)) {\n this.logs[fullName] = 0;\n }\n /* eslint-ensable no-console */\n this.logs[fullName]++;\n };\n\n this.router.map(function () {\n this.route('posts', { resetNamespace: true });\n });\n }\n\n teardown() {\n /* eslint-disable no-console */\n console.info = this._originalLogger;\n /* eslint-enable no-console */\n super.teardown();\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Application with LOG_ACTIVE_GENERATION=true', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n LOG_ACTIVE_GENERATION: true\n });\n }\n\n ['@test log class generation if logging enabled'](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 4, 'expected logs');\n });\n }\n\n ['@test actively generated classes get logged'](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n return this.visit('/posts').then(() => {\n assert.equal(this.logs['controller:application'], 1, 'expected: ApplicationController was generated');\n assert.equal(this.logs['controller:posts'], 1, 'expected: PostsController was generated');\n\n assert.equal(this.logs['route:application'], 1, 'expected: ApplicationRoute was generated');\n assert.equal(this.logs['route:posts'], 1, 'expected: PostsRoute was generated');\n });\n }\n\n ['@test predefined classes do not get logged'](assert) {\n this.add('controller:application', _controller.default.extend());\n this.add('controller:posts', _controller.default.extend());\n this.add('route:application', _routing.Route.extend());\n this.add('route:posts', _routing.Route.extend());\n\n return this.visit('/posts').then(() => {\n assert.ok(!this.logs['controller:application'], 'did not expect: ApplicationController was generated');\n assert.ok(!this.logs['controller:posts'], 'did not expect: PostsController was generated');\n\n assert.ok(!this.logs['route:application'], 'did not expect: ApplicationRoute was generated');\n assert.ok(!this.logs['route:posts'], 'did not expect: PostsRoute was generated');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application when LOG_ACTIVE_GENERATION=false', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n LOG_ACTIVE_GENERATION: false\n });\n }\n\n [`@test do NOT log class generation if logging disabled`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected logs');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application with LOG_VIEW_LOOKUPS=true', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n LOG_VIEW_LOOKUPS: true\n });\n }\n\n [`@test log when template and view are missing when flag is active`](assert) {\n if (EmberDev && EmberDev.runningProdBuild) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n this.addTemplate('application', '{{outlet}}');\n\n return this.visit('/').then(() => this.visit('/posts')).then(() => {\n assert.equal(this.logs['template:application'], undefined, 'expected: Should not log template:application since it exists.');\n assert.equal(this.logs['template:index'], 1, 'expected: Could not find \"index\" template or view.');\n assert.equal(this.logs['template:posts'], 1, 'expected: Could not find \"posts\" template or view.');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application with LOG_VIEW_LOOKUPS=false', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n LOG_VIEW_LOOKUPS: false\n });\n }\n\n [`@test do not log when template and view are missing when flag is not true`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected no logs');\n });\n }\n\n [`@test do not log which views are used with templates when flag is not true`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected no logs');\n });\n }\n });\n});","enifed('@ember/application/tests/readiness_test', ['internal-test-helpers', '@ember/runloop', '@ember/application'], function (_internalTestHelpers, _runloop, _application) {\n 'use strict';\n\n let jQuery, application, Application;\n let readyWasCalled, domReady, readyCallbacks;\n\n // We are using a small mock of jQuery because jQuery is third-party code with\n // very well-defined semantics, and we want to confirm that a jQuery stub run\n // in a more minimal server environment that implements this behavior will be\n // sufficient for Ember's requirements.\n (0, _internalTestHelpers.moduleFor)('Application readiness', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n readyWasCalled = 0;\n readyCallbacks = [];\n\n let jQueryInstance = {\n ready(callback) {\n readyCallbacks.push(callback);\n if (jQuery.isReady) {\n domReady();\n }\n }\n };\n\n jQuery = function () {\n return jQueryInstance;\n };\n jQuery.isReady = false;\n\n let domReadyCalled = 0;\n domReady = function () {\n if (domReadyCalled !== 0) {\n return;\n }\n domReadyCalled++;\n for (let i = 0; i < readyCallbacks.length; i++) {\n readyCallbacks[i]();\n }\n };\n\n Application = _application.default.extend({\n $: jQuery,\n\n ready() {\n readyWasCalled++;\n }\n });\n }\n\n teardown() {\n if (application) {\n (0, _runloop.run)(() => application.destroy());\n jQuery = readyCallbacks = domReady = Application = application = undefined;\n }\n }\n\n // These tests are confirming that if the callbacks passed into jQuery's ready hook is called\n // synchronously during the application's initialization, we get the same behavior as if\n // it was triggered after initialization.\n\n [\"@test Application's ready event is called right away if jQuery is already ready\"](assert) {\n jQuery.isReady = true;\n\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n\n assert.equal(readyWasCalled, 0, 'ready is not called until later');\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called');\n\n domReady();\n\n assert.equal(readyWasCalled, 1, \"application's ready was not called again\");\n }\n\n [\"@test Application's ready event is called after the document becomes ready\"](assert) {\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n });\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n domReady();\n\n assert.equal(readyWasCalled, 1, 'ready was called now that DOM is ready');\n }\n\n [\"@test Application's ready event can be deferred by other components\"](assert) {\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n application.deferReadiness();\n });\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n domReady();\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n (0, _runloop.run)(() => {\n application.advanceReadiness();\n assert.equal(readyWasCalled, 0);\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called now all readiness deferrals are advanced');\n }\n\n [\"@test Application's ready event can be deferred by other components\"](assert) {\n jQuery.isReady = false;\n\n (0, _runloop.run)(() => {\n application = Application.create({ router: false });\n application.deferReadiness();\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n });\n\n domReady();\n\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n\n (0, _runloop.run)(() => {\n application.advanceReadiness();\n });\n\n assert.equal(readyWasCalled, 1, 'ready was called now all readiness deferrals are advanced');\n\n expectAssertion(() => {\n application.deferReadiness();\n });\n }\n });\n});","enifed('@ember/application/tests/reset_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/controller', '@ember/-internals/routing', 'internal-test-helpers'], function (_runloop, _metal, _controller, _routing, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application - resetting', class extends _internalTestHelpers.AutobootApplicationTestCase {\n ['@test Brings its own run-loop if not provided'](assert) {\n assert.expect(0);\n (0, _runloop.run)(() => this.createApplication());\n this.application.reset();\n }\n\n ['@test Does not bring its own run loop if one is already provided'](assert) {\n assert.expect(3);\n\n let didBecomeReady = false;\n\n (0, _runloop.run)(() => this.createApplication());\n\n (0, _runloop.run)(() => {\n this.application.ready = () => {\n didBecomeReady = true;\n };\n\n this.application.reset();\n\n this.application.deferReadiness();\n assert.ok(!didBecomeReady, 'app is not ready');\n });\n\n assert.ok(!didBecomeReady, 'app is not ready');\n (0, _runloop.run)(this.application, 'advanceReadiness');\n assert.ok(didBecomeReady, 'app is ready');\n }\n\n ['@test When an application is reset, new instances of controllers are generated'](assert) {\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('controller:academic', _controller.default.extend());\n });\n\n let firstController = this.applicationInstance.lookup('controller:academic');\n let secondController = this.applicationInstance.lookup('controller:academic');\n\n this.application.reset();\n\n let thirdController = this.applicationInstance.lookup('controller:academic');\n\n assert.strictEqual(firstController, secondController, 'controllers looked up in succession should be the same instance');\n\n assert.ok(firstController.isDestroying, 'controllers are destroyed when their application is reset');\n\n assert.notStrictEqual(firstController, thirdController, 'controllers looked up after the application is reset should not be the same instance');\n }\n\n ['@test When an application is reset, the eventDispatcher is destroyed and recreated'](assert) {\n let eventDispatcherWasSetup = 0;\n let eventDispatcherWasDestroyed = 0;\n\n let mockEventDispatcher = {\n setup() {\n eventDispatcherWasSetup++;\n },\n destroy() {\n eventDispatcherWasDestroyed++;\n }\n };\n\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('event_dispatcher:main', {\n create: () => mockEventDispatcher\n });\n\n assert.equal(eventDispatcherWasSetup, 0);\n assert.equal(eventDispatcherWasDestroyed, 0);\n });\n\n assert.equal(eventDispatcherWasSetup, 1);\n assert.equal(eventDispatcherWasDestroyed, 0);\n\n this.application.reset();\n\n assert.equal(eventDispatcherWasDestroyed, 1);\n assert.equal(eventDispatcherWasSetup, 2, 'setup called after reset');\n }\n\n ['@test When an application is reset, the router URL is reset to `/`'](assert) {\n (0, _runloop.run)(() => {\n this.createApplication();\n\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n\n this.router.map(function () {\n this.route('one');\n this.route('two');\n });\n });\n\n let initialRouter, initialApplicationController;\n return this.visit('/one').then(() => {\n initialApplicationController = this.applicationInstance.lookup('controller:application');\n initialRouter = this.applicationInstance.lookup('router:main');\n let location = initialRouter.get('location');\n\n assert.equal(location.getURL(), '/one');\n assert.equal((0, _metal.get)(initialApplicationController, 'currentPath'), 'one');\n\n this.application.reset();\n\n return this.application._bootPromise;\n }).then(() => {\n let applicationController = this.applicationInstance.lookup('controller:application');\n assert.strictEqual(applicationController, undefined, 'application controller no longer exists');\n\n return this.visit('/one');\n }).then(() => {\n let applicationController = this.applicationInstance.lookup('controller:application');\n let router = this.applicationInstance.lookup('router:main');\n let location = router.get('location');\n\n assert.notEqual(initialRouter, router, 'a different router instance was created');\n assert.notEqual(initialApplicationController, applicationController, 'a different application controller is created');\n\n assert.equal(location.getURL(), '/one');\n assert.equal((0, _metal.get)(applicationController, 'currentPath'), 'one');\n });\n }\n\n ['@test When an application with advance/deferReadiness is reset, the app does correctly become ready after reset'](assert) {\n let readyCallCount = 0;\n\n (0, _runloop.run)(() => {\n this.createApplication({\n ready() {\n readyCallCount++;\n }\n });\n\n this.application.deferReadiness();\n assert.equal(readyCallCount, 0, 'ready has not yet been called');\n });\n\n (0, _runloop.run)(this.application, 'advanceReadiness');\n\n assert.equal(readyCallCount, 1, 'ready was called once');\n\n this.application.reset();\n\n assert.equal(readyCallCount, 2, 'ready was called twice');\n }\n });\n});","enifed('@ember/application/tests/visit_test', ['internal-test-helpers', '@ember/service', '@ember/-internals/runtime', '@ember/runloop', '@ember/application', '@ember/application/instance', '@ember/engine', '@ember/-internals/routing', '@ember/-internals/glimmer', 'ember-template-compiler', '@ember/-internals/environment'], function (_internalTestHelpers, _service, _runtime, _runloop, _application, _instance, _engine, _routing, _glimmer, _emberTemplateCompiler, _environment) {\n 'use strict';\n\n function expectAsyncError() {\n _runtime.RSVP.off('error');\n }\n\n (0, _internalTestHelpers.moduleFor)('Application - visit()', class extends _internalTestHelpers.ApplicationTestCase {\n teardown() {\n _runtime.RSVP.on('error', _runtime.onerrorDefault);\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n super.teardown();\n }\n\n createApplication(options) {\n return super.createApplication(options, _application.default.extend());\n }\n\n assertEmptyFixture(message) {\n this.assert.strictEqual(document.getElementById('qunit-fixture').children.length, 0, `there are no elements in the fixture element ${message ? message : ''}`);\n }\n\n [`@test does not add serialize-mode markers by default`](assert) {\n let templateContent = '
    Hi, Mom!
    ';\n this.addTemplate('index', templateContent);\n let rootElement = document.createElement('div');\n\n let bootOptions = {\n isBrowser: false,\n rootElement\n };\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n return this.visit('/', bootOptions).then(() => {\n assert.equal(rootElement.innerHTML, templateContent, 'without serialize flag renders as expected');\n });\n }\n\n [`@test _renderMode: rehydration`](assert) {\n assert.expect(2);\n\n let indexTemplate = '
    Hi, Mom!
    ';\n this.addTemplate('index', indexTemplate);\n let rootElement = document.createElement('div');\n\n let bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'serialize'\n };\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\n return this.visit('/', bootOptions).then(instance => {\n assert.ok((0, _glimmer.isSerializationFirstNode)(instance.rootElement.firstChild), 'glimmer-vm comment node was not found');\n }).then(() => {\n return this.runTask(() => {\n this.applicationInstance.destroy();\n this.applicationInstance = null;\n });\n }).then(() => {\n bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'rehydrate'\n };\n\n this.application.visit('/', bootOptions).then(instance => {\n assert.equal(instance.rootElement.innerHTML, indexTemplate, 'was not properly rehydrated');\n });\n });\n }\n\n // This tests whether the application is \"autobooted\" by registering an\n // instance initializer and asserting it never gets run. Since this is\n // inherently testing that async behavior *doesn't* happen, we set a\n // 500ms timeout to verify that when autoboot is set to false, the\n // instance initializer that would normally get called on DOM ready\n // does not fire.\n [`@test Applications with autoboot set to false do not autoboot`](assert) {\n function delay(time) {\n return new _runtime.RSVP.Promise(resolve => (0, _runloop.later)(resolve, time));\n }\n\n let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n initialize() {\n instanceBooted++;\n }\n });\n\n assert.ok(!this.applicationInstance, 'precond - no instance');\n assert.ok(appBooted === 0, 'precond - not booted');\n assert.ok(instanceBooted === 0, 'precond - not booted');\n\n // Continue after 500ms\n return delay(500).then(() => {\n assert.ok(appBooted === 0, '500ms elapsed without app being booted');\n assert.ok(instanceBooted === 0, '500ms elapsed without instances being booted');\n\n return this.runTask(() => this.application.boot());\n }).then(() => {\n assert.ok(appBooted === 1, 'app should boot when manually calling `app.boot()`');\n assert.ok(instanceBooted === 0, 'no instances should be booted automatically when manually calling `app.boot()');\n });\n }\n\n [`@test calling visit() on an app without first calling boot() should boot the app`](assert) {\n let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n initialize() {\n instanceBooted++;\n }\n });\n\n return this.visit('/').then(() => {\n assert.ok(appBooted === 1, 'the app should be booted`');\n assert.ok(instanceBooted === 1, 'an instances should be booted');\n });\n }\n\n [`@test calling visit() on an already booted app should not boot it again`](assert) {\n let appBooted = 0;\n let instanceBooted = 0;\n\n this.application.initializer({\n name: 'assert-no-autoboot',\n initialize() {\n appBooted++;\n }\n });\n\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n initialize() {\n instanceBooted++;\n }\n });\n\n return this.runTask(() => this.application.boot()).then(() => {\n assert.ok(appBooted === 1, 'the app should be booted');\n assert.ok(instanceBooted === 0, 'no instances should be booted');\n\n return this.visit('/');\n }).then(() => {\n assert.ok(appBooted === 1, 'the app should not be booted again');\n assert.ok(instanceBooted === 1, 'an instance should be booted');\n\n /*\n * Destroy the instance.\n */\n return this.runTask(() => {\n this.applicationInstance.destroy();\n this.applicationInstance = null;\n });\n }).then(() => {\n /*\n * Visit on the application a second time. The application should remain\n * booted, but a new instance will be created.\n */\n return this.application.visit('/').then(instance => {\n this.applicationInstance = instance;\n });\n }).then(() => {\n assert.ok(appBooted === 1, 'the app should not be booted again');\n assert.ok(instanceBooted === 2, 'another instance should be booted');\n });\n }\n\n [`@test visit() rejects on application boot failure`](assert) {\n this.application.initializer({\n name: 'error',\n initialize() {\n throw new Error('boot failure');\n }\n });\n\n expectAsyncError();\n\n return this.visit('/').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'boot failure');\n });\n }\n\n [`@test visit() rejects on instance boot failure`](assert) {\n this.application.instanceInitializer({\n name: 'error',\n initialize() {\n throw new Error('boot failure');\n }\n });\n\n expectAsyncError();\n\n return this.visit('/').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'boot failure');\n });\n }\n\n [`@test visit() follows redirects`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b', { path: '/b/:b' });\n this.route('c', { path: '/c/:c' });\n });\n\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n this.replaceWith('b', 'zomg');\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n this.transitionTo('c', params.b);\n }\n }));\n\n /*\n * First call to `visit` is `this.application.visit` and returns the\n * applicationInstance.\n */\n return this.visit('/a').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/c/zomg', 'It should follow all redirects');\n });\n }\n\n [`@test visit() rejects if an error occurred during a transition`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b', { path: '/b/:b' });\n this.route('c', { path: '/c/:c' });\n });\n\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n this.replaceWith('b', 'zomg');\n }\n }));\n\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n this.transitionTo('c', params.b);\n }\n }));\n\n this.add('route:c', _routing.Route.extend({\n afterModel() {\n throw new Error('transition failure');\n }\n }));\n\n expectAsyncError();\n\n return this.visit('/a').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'transition failure');\n });\n }\n\n [`@test visit() chain`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n this.route('c');\n });\n\n return this.visit('/').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/');\n\n return instance.visit('/a');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/a');\n\n return instance.visit('/b');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/b');\n\n return instance.visit('/c');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/c');\n });\n }\n\n [`@test visit() returns a promise that resolves when the view has rendered`](assert) {\n this.addTemplate('application', `

    Hello world

    `);\n\n this.assertEmptyFixture();\n\n return this.visit('/').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(this.element.textContent, 'Hello world', 'the application was rendered once the promise resolves');\n });\n }\n\n [`@test visit() returns a promise that resolves without rendering when shouldRender is set to false`](assert) {\n assert.expect(3);\n\n this.addTemplate('application', '

    Hello world

    ');\n\n this.assertEmptyFixture();\n\n return this.visit('/', { shouldRender: false }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n\n this.assertEmptyFixture('after visit');\n });\n }\n\n [`@test visit() renders a template when shouldRender is set to true`](assert) {\n assert.expect(3);\n\n this.addTemplate('application', '

    Hello world

    ');\n\n this.assertEmptyFixture();\n\n return this.visit('/', { shouldRender: true }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.strictEqual(document.querySelector('#qunit-fixture').children.length, 1, 'there is 1 element in the fixture element after visit');\n });\n }\n\n [`@test visit() returns a promise that resolves without rendering when shouldRender is set to false with Engines`](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n this.addTemplate('application', '

    Hello world

    ');\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: false }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n\n this.assertEmptyFixture('after visit');\n });\n }\n\n [`@test visit() does not setup the event_dispatcher:main if isInteractive is false (with Engines) GH#15615`](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n this.addTemplate('application', '

    Hello world

    {{outlet}}');\n this.add('event_dispatcher:main', {\n create() {\n throw new Error('should not happen!');\n }\n });\n\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{cache-money}}'));\n this.register('template:components/cache-money', (0, _emberTemplateCompiler.compile)(`\n

    Dis cache money

    \n `));\n this.register('component:cache-money', _glimmer.Component.extend({}));\n }\n });\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { isInteractive: false }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.strictEqual(this.element.querySelector('p').textContent, 'Dis cache money', 'Engine component is resolved');\n });\n }\n\n [`@test visit() on engine resolves engine component`](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{cache-money}}'));\n this.register('template:components/cache-money', (0, _emberTemplateCompiler.compile)(`\n

    Dis cache money

    \n `));\n this.register('component:cache-money', _glimmer.Component.extend({}));\n }\n });\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n assert.strictEqual(this.element.querySelector('p').textContent, 'Dis cache money', 'Engine component is resolved');\n });\n }\n\n [`@test visit() on engine resolves engine helper`](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n // Register engine\n let BlogEngine = _engine.default.extend({\n init(...args) {\n this._super.apply(this, args);\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{swag}}'));\n this.register('helper:swag', (0, _glimmer.helper)(function () {\n return 'turnt up';\n }));\n }\n });\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {};\n this.add('route-map:blog', BlogMap);\n\n this.assertEmptyFixture();\n\n return this.visit('/blog', { shouldRender: true }).then(() => {\n assert.strictEqual(this.element.textContent, 'turnt up', 'Engine component is resolved');\n });\n }\n\n [`@test Ember Islands-style setup`](assert) {\n let xFooInitCalled = false;\n let xFooDidInsertElementCalled = false;\n\n let xBarInitCalled = false;\n let xBarDidInsertElementCalled = false;\n\n this.router.map(function () {\n this.route('show', { path: '/:component_name' });\n });\n\n this.add('route:show', _routing.Route.extend({\n queryParams: {\n data: { refreshModel: true }\n },\n\n model(params) {\n return {\n componentName: params.component_name,\n componentData: params.data ? JSON.parse(params.data) : undefined\n };\n }\n }));\n\n let Counter = _runtime.Object.extend({\n value: 0,\n\n increment() {\n this.incrementProperty('value');\n }\n });\n\n this.add('service:isolatedCounter', Counter);\n this.add('service:sharedCounter', Counter.create());\n this.application.registerOptions('service:sharedCounter', {\n instantiate: false\n });\n\n this.addTemplate('show', '{{component model.componentName model=model.componentData}}');\n\n this.addTemplate('components/x-foo', `\n

    X-Foo

    \n

    Hello {{model.name}}, I have been clicked {{isolatedCounter.value}} times ({{sharedCounter.value}} times combined)!

    \n `);\n\n this.add('component:x-foo', _glimmer.Component.extend({\n tagName: 'x-foo',\n\n isolatedCounter: (0, _service.inject)(),\n sharedCounter: (0, _service.inject)(),\n\n init() {\n this._super();\n xFooInitCalled = true;\n },\n\n didInsertElement() {\n xFooDidInsertElementCalled = true;\n },\n\n click() {\n this.get('isolatedCounter').increment();\n this.get('sharedCounter').increment();\n }\n }));\n\n this.addTemplate('components/x-bar', `\n

    X-Bar

    \n \n `);\n\n this.add('component:x-bar', _glimmer.Component.extend({\n counter: (0, _service.inject)('sharedCounter'),\n\n actions: {\n incrementCounter() {\n this.get('counter').increment();\n }\n },\n\n init() {\n this._super();\n xBarInitCalled = true;\n },\n\n didInsertElement() {\n xBarDidInsertElementCalled = true;\n }\n }));\n\n let fixtureElement = document.querySelector('#qunit-fixture');\n let foo = document.createElement('div');\n let bar = document.createElement('div');\n fixtureElement.appendChild(foo);\n fixtureElement.appendChild(bar);\n\n let data = encodeURIComponent(JSON.stringify({ name: 'Godfrey' }));\n let instances = [];\n\n return _runtime.RSVP.all([this.runTask(() => {\n return this.application.visit(`/x-foo?data=${data}`, {\n rootElement: foo\n });\n }), this.runTask(() => {\n return this.application.visit('/x-bar', { rootElement: bar });\n })]).then(_instances => {\n instances = _instances;\n\n assert.ok(xFooInitCalled);\n assert.ok(xFooDidInsertElementCalled);\n\n assert.ok(xBarInitCalled);\n assert.ok(xBarDidInsertElementCalled);\n\n assert.equal(foo.querySelector('h1').textContent, 'X-Foo');\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 0 times (0 times combined)!');\n assert.ok(foo.textContent.indexOf('X-Bar') === -1);\n\n assert.equal(bar.querySelector('h1').textContent, 'X-Bar');\n assert.equal(bar.querySelector('button').textContent, 'Join 0 others in clicking me!');\n assert.ok(bar.textContent.indexOf('X-Foo') === -1);\n\n this.runTask(() => {\n this.click(foo.querySelector('x-foo'));\n });\n\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 1 times (1 times combined)!');\n assert.equal(bar.querySelector('button').textContent, 'Join 1 others in clicking me!');\n\n this.runTask(() => {\n this.click(bar.querySelector('button'));\n this.click(bar.querySelector('button'));\n });\n\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 1 times (3 times combined)!');\n assert.equal(bar.querySelector('button').textContent, 'Join 3 others in clicking me!');\n }).finally(() => {\n this.runTask(() => {\n instances.forEach(instance => {\n instance.destroy();\n });\n });\n });\n }\n });\n});","enifed('@ember/controller/tests/controller_test', ['@ember/controller', '@ember/service', '@ember/-internals/runtime', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _service, _runtime, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Controller event handling', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Action can be handled by a function on actions object'](assert) {\n assert.expect(1);\n let TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked');\n }\n }\n });\n let controller = TestController.create();\n controller.send('poke');\n }\n\n ['@test A handled action can be bubbled to the target for continued processing'](assert) {\n assert.expect(2);\n let TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 1');\n return true;\n }\n }\n });\n\n let controller = TestController.create({\n target: _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 2');\n }\n }\n }).create()\n });\n controller.send('poke');\n }\n\n [\"@test Action can be handled by a superclass' actions object\"](assert) {\n assert.expect(4);\n\n let SuperController = _controller.default.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let BarControllerMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\n }\n }\n });\n\n let IndexController = SuperController.extend(BarControllerMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n }\n });\n\n let controller = IndexController.create({});\n controller.send('foo');\n controller.send('bar', 'HELLO');\n controller.send('baz');\n }\n\n ['@test .send asserts if called on a destroyed controller']() {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:application', _controller.default.extend({\n toString() {\n return 'controller:rip-alley';\n }\n }));\n\n let controller = owner.lookup('controller:application');\n (0, _internalTestHelpers.runDestroy)(owner);\n\n expectAssertion(() => {\n controller.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed object 'controller:rip-alley'.\");\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Controller deprecations -> Controller Content -> Model Alias', class extends _internalTestHelpers.AbstractTestCase {\n ['@test `content` is not moved to `model` when `model` is unset'](assert) {\n assert.expect(2);\n let controller;\n\n ignoreDeprecation(function () {\n controller = _controller.default.extend({\n content: 'foo-bar'\n }).create();\n });\n\n assert.notEqual(controller.get('model'), 'foo-bar', 'model is set properly');\n assert.equal(controller.get('content'), 'foo-bar', 'content is not set properly');\n }\n\n ['@test specifying `content` (without `model` specified) does not result in deprecation'](assert) {\n assert.expect(2);\n expectNoDeprecation();\n\n let controller = _controller.default.extend({\n content: 'foo-bar'\n }).create();\n\n assert.equal((0, _metal.get)(controller, 'content'), 'foo-bar');\n }\n\n ['@test specifying `content` (with `model` specified) does not result in deprecation'](assert) {\n assert.expect(3);\n expectNoDeprecation();\n\n let controller = _controller.default.extend({\n content: 'foo-bar',\n model: 'blammo'\n }).create();\n\n assert.equal((0, _metal.get)(controller, 'content'), 'foo-bar');\n assert.equal((0, _metal.get)(controller, 'model'), 'blammo');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Controller deprecations -> Controller injected properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining a controller on a non-controller should fail assertion']() {\n expectAssertion(function () {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n let AnObject = _runtime.Object.extend({\n foo: (0, _controller.inject)('bar')\n });\n\n owner.register('controller:bar', _runtime.Object.extend());\n owner.register('foo:main', AnObject);\n\n owner.lookup('foo:main');\n }, /Defining `foo` as an injected controller property on a non-controller \\(`foo:main`\\) is not allowed/);\n }\n\n ['@test controllers can be injected into controllers'](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:post', _controller.default.extend({\n postsController: (0, _controller.inject)('posts')\n }));\n\n owner.register('controller:posts', _controller.default.extend());\n\n let postController = owner.lookup('controller:post');\n let postsController = owner.lookup('controller:posts');\n\n assert.equal(postsController, postController.get('postsController'), 'controller.posts is injected');\n }\n\n ['@test services can be injected into controllers'](assert) {\n let owner = (0, _internalTestHelpers.buildOwner)();\n\n owner.register('controller:application', _controller.default.extend({\n authService: (0, _service.inject)('auth')\n }));\n\n owner.register('service:auth', _service.default.extend());\n\n let appController = owner.lookup('controller:application');\n let authService = owner.lookup('service:auth');\n\n assert.equal(authService, appController.get('authService'), 'service.auth is injected');\n }\n });\n});","enifed('@ember/debug/tests/handlers-test', ['@ember/debug/lib/handlers', 'internal-test-helpers'], function (_handlers, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-debug: registerHandler', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n delete _handlers.HANDLERS.blarz;\n }\n\n ['@test calls handler on `invoke` when `falsey`'](assert) {\n assert.expect(2);\n\n function handler(message) {\n assert.ok(true, 'called handler');\n assert.equal(message, 'Foo bar');\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n\n (0, _handlers.invoke)('blarz', 'Foo bar', false);\n }\n\n ['@test does not call handler on `invoke` when `truthy`'](assert) {\n assert.expect(0);\n\n function handler() {\n assert.ok(false, 'called handler');\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n\n (0, _handlers.invoke)('blarz', 'Foo bar', true);\n }\n\n ['@test calling `invoke` without handlers does not throw an error'](assert) {\n assert.expect(0);\n\n (0, _handlers.invoke)('blarz', 'Foo bar', false);\n }\n\n ['@test invoking `next` argument calls the next handler'](assert) {\n assert.expect(2);\n\n function handler1() {\n assert.ok(true, 'called handler1');\n }\n\n function handler2(message, options, next) {\n assert.ok(true, 'called handler2');\n next(message, options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test invoking `next` when no other handlers exists does not error'](assert) {\n assert.expect(1);\n\n function handler(message, options, next) {\n assert.ok(true, 'called handler1');\n\n next(message, options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test handlers are called in the proper order'](assert) {\n assert.expect(11);\n\n let expectedMessage = 'This is the message';\n let expectedOptions = { id: 'foo-bar' };\n let expected = ['first', 'second', 'third', 'fourth', 'fifth'];\n let actualCalls = [];\n\n function generateHandler(item) {\n return function (message, options, next) {\n assert.equal(message, expectedMessage, `message supplied to ${item} handler is correct`);\n assert.equal(options, expectedOptions, `options supplied to ${item} handler is correct`);\n\n actualCalls.push(item);\n\n next(message, options);\n };\n }\n\n expected.forEach(item => (0, _handlers.registerHandler)('blarz', generateHandler(item)));\n\n (0, _handlers.invoke)('blarz', expectedMessage, false, expectedOptions);\n\n assert.deepEqual(actualCalls, expected.reverse(), 'handlers were called in proper order');\n }\n\n ['@test not invoking `next` prevents further handlers from being called'](assert) {\n assert.expect(1);\n\n function handler1() {\n assert.ok(false, 'called handler1');\n }\n\n function handler2() {\n assert.ok(true, 'called handler2');\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test handlers can call `next` with custom message and/or options'](assert) {\n assert.expect(4);\n\n let initialMessage = 'initial message';\n let initialOptions = { id: 'initial-options' };\n\n let handler2Message = 'Handler2 Message';\n let handler2Options = { id: 'handler-2' };\n\n function handler1(message, options) {\n assert.equal(message, handler2Message, 'handler2 message provided to handler1');\n assert.equal(options, handler2Options, 'handler2 options provided to handler1');\n }\n\n function handler2(message, options, next) {\n assert.equal(message, initialMessage, 'initial message provided to handler2');\n assert.equal(options, initialOptions, 'initial options proivided to handler2');\n\n next(handler2Message, handler2Options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n\n (0, _handlers.invoke)('blarz', initialMessage, false, initialOptions);\n }\n });\n});","enifed('@ember/debug/tests/main_test', ['@ember/-internals/environment', '@ember/-internals/runtime', '@ember/debug/lib/handlers', '@ember/debug/lib/deprecate', '@ember/debug/lib/warn', '@ember/debug/index', 'internal-test-helpers'], function (_environment, _runtime, _handlers, _deprecate, _warn, _index, _internalTestHelpers) {\n 'use strict';\n\n let originalEnvValue;\n let originalDeprecateHandler;\n let originalWarnHandler;\n\n const originalConsoleWarn = console.warn; // eslint-disable-line no-console\n const noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('ember-debug', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n originalEnvValue = _environment.ENV.RAISE_ON_DEPRECATION;\n originalDeprecateHandler = _handlers.HANDLERS.deprecate;\n originalWarnHandler = _handlers.HANDLERS.warn;\n\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n }\n\n teardown() {\n _handlers.HANDLERS.deprecate = originalDeprecateHandler;\n _handlers.HANDLERS.warn = originalWarnHandler;\n\n _environment.ENV.RAISE_ON_DEPRECATION = originalEnvValue;\n }\n\n afterEach() {\n console.warn = originalConsoleWarn; // eslint-disable-line no-console\n }\n\n ['@test deprecate does not throw if RAISE_ON_DEPRECATION is false'](assert) {\n assert.expect(1);\n console.warn = noop; // eslint-disable-line no-console\n\n _environment.ENV.RAISE_ON_DEPRECATION = false;\n\n try {\n (0, _index.deprecate)('Should not throw', false, { id: 'test', until: 'forever' });\n assert.ok(true, 'deprecate did not throw');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n }\n\n ['@test deprecate resets deprecation level to RAISE if ENV.RAISE_ON_DEPRECATION is set'](assert) {\n assert.expect(2);\n console.warn = noop; // eslint-disable-line no-console\n\n _environment.ENV.RAISE_ON_DEPRECATION = false;\n\n try {\n (0, _index.deprecate)('Should not throw', false, { id: 'test', until: 'forever' });\n assert.ok(true, 'deprecate did not throw');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n\n assert.throws(() => {\n (0, _index.deprecate)('Should throw', false, { id: 'test', until: 'forever' });\n }, /Should throw/);\n }\n\n ['@test When ENV.RAISE_ON_DEPRECATION is true, it is still possible to silence a deprecation by id'](assert) {\n assert.expect(3);\n\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n (0, _deprecate.registerHandler)(function (message, options, next) {\n if (!options || options.id !== 'my-deprecation') {\n next(...arguments);\n }\n });\n\n try {\n (0, _index.deprecate)('should be silenced with matching id', false, {\n id: 'my-deprecation',\n until: 'forever'\n });\n assert.ok(true, 'Did not throw when level is set by id');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n\n assert.throws(() => {\n (0, _index.deprecate)('Should throw with no matching id', false, {\n id: 'test',\n until: 'forever'\n });\n }, /Should throw with no matching id/);\n\n assert.throws(() => {\n (0, _index.deprecate)('Should throw with non-matching id', false, {\n id: 'other-id',\n until: 'forever'\n });\n }, /Should throw with non-matching id/);\n }\n\n ['@test deprecate throws deprecation if second argument is falsy'](assert) {\n assert.expect(3);\n\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', false, {\n id: 'test',\n until: 'forever'\n }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', '', { id: 'test', until: 'forever' }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', 0, { id: 'test', until: 'forever' }));\n }\n\n ['@test deprecate does not invoke a function as the second argument'](assert) {\n assert.expect(1);\n\n (0, _index.deprecate)('Deprecation is thrown', function () {\n assert.ok(false, 'this function should not be invoked');\n }, { id: 'test', until: 'forever' });\n\n assert.ok(true, 'deprecations were not thrown');\n }\n\n ['@test deprecate does not throw deprecations if second argument is truthy'](assert) {\n assert.expect(1);\n\n (0, _index.deprecate)('Deprecation is thrown', true, {\n id: 'test',\n until: 'forever'\n });\n (0, _index.deprecate)('Deprecation is thrown', '1', { id: 'test', until: 'forever' });\n (0, _index.deprecate)('Deprecation is thrown', 1, { id: 'test', until: 'forever' });\n\n assert.ok(true, 'deprecations were not thrown');\n }\n\n ['@test assert throws if second argument is falsy'](assert) {\n assert.expect(3);\n\n assert.throws(() => (0, _index.assert)('Assertion is thrown', false));\n assert.throws(() => (0, _index.assert)('Assertion is thrown', ''));\n assert.throws(() => (0, _index.assert)('Assertion is thrown', 0));\n }\n\n ['@test assert does not throw if second argument is a function'](assert) {\n assert.expect(1);\n\n (0, _index.assert)('Assertion is thrown', () => true);\n\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test assert does not throw if second argument is falsy'](assert) {\n assert.expect(1);\n\n (0, _index.assert)('Assertion is thrown', true);\n (0, _index.assert)('Assertion is thrown', '1');\n (0, _index.assert)('Assertion is thrown', 1);\n\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test assert does not throw if second argument is an object'](assert) {\n assert.expect(1);\n let Igor = _runtime.Object.extend();\n\n (0, _index.assert)('is truthy', Igor);\n (0, _index.assert)('is truthy', Igor.create());\n\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test deprecate does not throw a deprecation at log and silence'](assert) {\n assert.expect(4);\n let id = 'ABC';\n let until = 'forever';\n let shouldThrow = false;\n\n (0, _deprecate.registerHandler)(function (message, options) {\n if (options && options.id === id) {\n if (shouldThrow) {\n throw new Error(message);\n }\n }\n });\n\n try {\n (0, _index.deprecate)('Deprecation for testing purposes', false, { id, until });\n assert.ok(true, 'Deprecation did not throw');\n } catch (e) {\n assert.ok(false, 'Deprecation was thrown despite being added to blacklist');\n }\n\n try {\n (0, _index.deprecate)('Deprecation for testing purposes', false, { id, until });\n assert.ok(true, 'Deprecation did not throw');\n } catch (e) {\n assert.ok(false, 'Deprecation was thrown despite being added to blacklist');\n }\n\n shouldThrow = true;\n\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, { id, until });\n });\n\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, { id, until });\n });\n }\n\n ['@test deprecate without options triggers an assertion'](assert) {\n assert.expect(2);\n\n assert.throws(() => (0, _index.deprecate)('foo'), new RegExp(_deprecate.missingOptionsDeprecation), 'proper assertion is triggered when options is missing');\n\n assert.throws(() => (0, _index.deprecate)('foo', false, {}), new RegExp(_deprecate.missingOptionsDeprecation), 'proper assertion is triggered when options is missing');\n }\n\n ['@test deprecate without options.id triggers an assertion'](assert) {\n assert.expect(1);\n\n assert.throws(() => (0, _index.deprecate)('foo', false, { until: 'forever' }), new RegExp(_deprecate.missingOptionsIdDeprecation), 'proper assertion is triggered when options.id is missing');\n }\n\n ['@test deprecate without options.until triggers an assertion'](assert) {\n assert.expect(1);\n\n assert.throws(() => (0, _index.deprecate)('foo', false, { id: 'test' }), new RegExp(_deprecate.missingOptionsUntilDeprecation), 'proper assertion is triggered when options.until is missing');\n }\n\n ['@test warn without options triggers an assert'](assert) {\n assert.expect(1);\n\n assert.throws(() => (0, _index.warn)('foo'), new RegExp(_warn.missingOptionsDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without options.id triggers an assertion'](assert) {\n assert.expect(1);\n\n assert.throws(() => (0, _index.warn)('foo', false, {}), new RegExp(_warn.missingOptionsIdDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without options.id nor test triggers an assertion'](assert) {\n assert.expect(1);\n\n assert.throws(() => (0, _index.warn)('foo', {}), new RegExp(_warn.missingOptionsIdDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without test but with options does not trigger an assertion'](assert) {\n assert.expect(1);\n\n (0, _warn.registerHandler)(function (message) {\n assert.equal(message, 'foo', 'warning was triggered');\n });\n\n (0, _index.warn)('foo', { id: 'ember-debug.do-not-raise' });\n }\n });\n});","enifed('@ember/engine/tests/engine_initializers_test', ['@ember/runloop', '@ember/engine', 'internal-test-helpers'], function (_runloop, _engine, _internalTestHelpers) {\n 'use strict';\n\n let MyEngine, myEngine, myEngineInstance;\n\n (0, _internalTestHelpers.moduleFor)('Engine initializers', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _runloop.run)(() => {\n if (myEngineInstance) {\n myEngineInstance.destroy();\n myEngineInstance = null;\n }\n\n if (myEngine) {\n myEngine.destroy();\n myEngine = null;\n }\n });\n }\n\n [\"@test initializers require proper 'name' and 'initialize' properties\"]() {\n MyEngine = _engine.default.extend();\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({ name: 'initializer' });\n });\n });\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({ initialize() {} });\n });\n });\n }\n\n ['@test initializers are passed an Engine'](assert) {\n MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'initializer',\n initialize(engine) {\n assert.ok(engine instanceof _engine.default, 'initialize is passed an Engine');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n }\n\n ['@test initializers can be registered in a specified order'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n MyEngine.initializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.initializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n ['@test initializers can be registered in a specified order as an array'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.initializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.initializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n ['@test initializers can have multiple dependencies'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\n initialize() {\n order.push('after c');\n }\n };\n\n MyEngine.initializer(b);\n MyEngine.initializer(a);\n MyEngine.initializer(afterC);\n MyEngine.initializer(afterB);\n MyEngine.initializer(c);\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n ['@test initializers set on Engine subclasses are not shared between engines'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = _engine.default.extend();\n\n SecondEngine.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = firstEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n let secondEngine = SecondEngine.create();\n let secondEngineInstance = secondEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n\n (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = FirstEngine.extend();\n\n SecondEngine.initializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = firstEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'second initializer was not run when first base class created');\n firstInitializerRunCount = 0;\n\n let secondEngine = SecondEngine.create();\n let secondEngineInstance = secondEngine.buildInstance();\n\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n\n (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.initializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(function () {\n FirstEngine.initializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondEngine = _engine.default.extend();\n SecondEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n assert.ok(true, 'Two engines can have initializers named the same.');\n }\n\n ['@test initializers are executed in their own context'](assert) {\n assert.expect(1);\n\n MyEngine = _engine.default.extend();\n\n MyEngine.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n }\n });\n});","enifed('@ember/engine/tests/engine_instance_initializers_test', ['@ember/runloop', '@ember/engine', '@ember/engine/instance', 'internal-test-helpers'], function (_runloop, _engine, _instance, _internalTestHelpers) {\n 'use strict';\n\n let MyEngine, myEngine, myEngineInstance;\n\n function buildEngineInstance(EngineClass) {\n let engineInstance = EngineClass.buildInstance();\n (0, _engine.setEngineParent)(engineInstance, {\n lookup() {\n return {};\n },\n resolveRegistration() {\n return {};\n }\n });\n return engineInstance;\n }\n\n (0, _internalTestHelpers.moduleFor)('Engine instance initializers', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n super.teardown();\n (0, _runloop.run)(() => {\n if (myEngineInstance) {\n myEngineInstance.destroy();\n }\n\n if (myEngine) {\n myEngine.destroy();\n }\n });\n MyEngine = myEngine = myEngineInstance = undefined;\n }\n\n [\"@test initializers require proper 'name' and 'initialize' properties\"]() {\n MyEngine = _engine.default.extend();\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({ name: 'initializer' });\n });\n });\n\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({ initialize() {} });\n });\n });\n }\n\n ['@test initializers are passed an engine instance'](assert) {\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'initializer',\n initialize(instance) {\n assert.ok(instance instanceof _instance.default, 'initialize is passed an engine instance');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot();\n }\n\n ['@test initializers can be registered in a specified order'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: 'third',\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'first',\n before: 'second',\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\n return myEngineInstance.boot().then(() => {\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n });\n }\n\n ['@test initializers can be registered in a specified order as an array'](assert) {\n let order = [];\n MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'third',\n initialize() {\n order.push('third');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n initialize() {\n order.push('second');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n initialize() {\n order.push('fourth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n initialize() {\n order.push('fifth');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'first',\n before: ['second'],\n initialize() {\n order.push('first');\n }\n });\n\n MyEngine.instanceInitializer({\n name: 'sixth',\n initialize() {\n order.push('sixth');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\n return myEngineInstance.boot().then(() => {\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n });\n }\n\n ['@test initializers can have multiple dependencies'](assert) {\n let order = [];\n\n MyEngine = _engine.default.extend();\n\n let a = {\n name: 'a',\n before: 'b',\n initialize() {\n order.push('a');\n }\n };\n let b = {\n name: 'b',\n initialize() {\n order.push('b');\n }\n };\n let c = {\n name: 'c',\n after: 'b',\n initialize() {\n order.push('c');\n }\n };\n let afterB = {\n name: 'after b',\n after: 'b',\n initialize() {\n order.push('after b');\n }\n };\n let afterC = {\n name: 'after c',\n after: 'c',\n initialize() {\n order.push('after c');\n }\n };\n\n MyEngine.instanceInitializer(b);\n MyEngine.instanceInitializer(a);\n MyEngine.instanceInitializer(afterC);\n MyEngine.instanceInitializer(afterB);\n MyEngine.instanceInitializer(c);\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\n return myEngineInstance.boot().then(() => {\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n });\n }\n\n ['@test initializers set on Engine subclasses should not be shared between engines'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n let firstEngine, firstEngineInstance;\n\n FirstEngine.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = _engine.default.extend();\n let secondEngine, secondEngineInstance;\n\n SecondEngine.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n firstEngine = FirstEngine.create();\n firstEngineInstance = buildEngineInstance(firstEngine);\n\n return firstEngineInstance.boot().then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n\n secondEngine = SecondEngine.create();\n secondEngineInstance = buildEngineInstance(secondEngine);\n return secondEngineInstance.boot();\n }).then(() => {\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n let firstInitializerRunCount = 0;\n let secondInitializerRunCount = 0;\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.instanceInitializer({\n name: 'first',\n initialize() {\n firstInitializerRunCount++;\n }\n });\n\n let SecondEngine = FirstEngine.extend();\n\n SecondEngine.instanceInitializer({\n name: 'second',\n initialize() {\n secondInitializerRunCount++;\n }\n });\n\n let firstEngine = FirstEngine.create();\n let firstEngineInstance = buildEngineInstance(firstEngine);\n\n let secondEngine, secondEngineInstance;\n\n return firstEngineInstance.boot().then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'second initializer was not run when first base class created');\n firstInitializerRunCount = 0;\n\n secondEngine = SecondEngine.create();\n secondEngineInstance = buildEngineInstance(secondEngine);\n return secondEngineInstance.boot();\n }).then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n let FirstEngine = _engine.default.extend();\n\n FirstEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n expectAssertion(() => {\n FirstEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n });\n\n let SecondEngine = _engine.default.extend();\n SecondEngine.instanceInitializer({\n name: 'abc',\n initialize() {}\n });\n\n assert.ok(true, 'Two engines can have initializers named the same.');\n }\n\n ['@test initializers are executed in their own context'](assert) {\n assert.expect(1);\n\n let MyEngine = _engine.default.extend();\n\n MyEngine.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n });\n\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n\n return myEngineInstance.boot();\n }\n });\n});","enifed('@ember/engine/tests/engine_instance_test', ['@ember/engine', '@ember/engine/instance', '@ember/runloop', 'internal-test-helpers'], function (_engine, _instance, _runloop, _internalTestHelpers) {\n 'use strict';\n\n let engine, engineInstance;\n\n (0, _internalTestHelpers.moduleFor)('EngineInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n (0, _runloop.run)(() => {\n engine = _engine.default.create({ router: null });\n });\n }\n\n teardown() {\n if (engineInstance) {\n (0, _runloop.run)(engineInstance, 'destroy');\n engineInstance = undefined;\n }\n\n if (engine) {\n (0, _runloop.run)(engine, 'destroy');\n engine = undefined;\n }\n }\n\n ['@test an engine instance can be created based upon a base engine'](assert) {\n (0, _runloop.run)(() => {\n engineInstance = _instance.default.create({ base: engine });\n });\n\n assert.ok(engineInstance, 'instance should be created');\n assert.equal(engineInstance.base, engine, 'base should be set to engine');\n }\n\n ['@test unregistering a factory clears all cached instances of that factory'](assert) {\n assert.expect(3);\n\n engineInstance = (0, _runloop.run)(() => _instance.default.create({ base: engine }));\n\n let PostComponent = (0, _internalTestHelpers.factory)();\n\n engineInstance.register('component:post', PostComponent);\n\n let postComponent1 = engineInstance.lookup('component:post');\n assert.ok(postComponent1, 'lookup creates instance');\n\n engineInstance.unregister('component:post');\n engineInstance.register('component:post', PostComponent);\n\n let postComponent2 = engineInstance.lookup('component:post');\n assert.ok(postComponent2, 'lookup creates instance');\n\n assert.notStrictEqual(postComponent1, postComponent2, 'lookup creates a brand new instance because previous one was reset');\n }\n\n ['@test can be booted when its parent has been set'](assert) {\n assert.expect(3);\n\n engineInstance = (0, _runloop.run)(() => _instance.default.create({ base: engine }));\n\n expectAssertion(() => {\n engineInstance._bootSync();\n }, \"An engine instance's parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.\");\n\n (0, _engine.setEngineParent)(engineInstance, {});\n\n // Stub `cloneParentDependencies`, the internals of which are tested along\n // with application instances.\n engineInstance.cloneParentDependencies = function () {\n assert.ok(true, 'parent dependencies are cloned');\n };\n\n return engineInstance.boot().then(() => {\n assert.ok(true, 'boot successful');\n });\n }\n\n ['@test can build a child instance of a registered engine'](assert) {\n let ChatEngine = _engine.default.extend();\n let chatEngineInstance;\n\n engine.register('engine:chat', ChatEngine);\n\n (0, _runloop.run)(() => {\n engineInstance = _instance.default.create({ base: engine });\n\n // Try to build an unregistered engine.\n assert.throws(() => {\n engineInstance.buildChildEngineInstance('fake');\n }, `You attempted to mount the engine 'fake', but it is not registered with its parent.`);\n\n // Build the `chat` engine, registered above.\n chatEngineInstance = engineInstance.buildChildEngineInstance('chat');\n });\n\n assert.ok(chatEngineInstance, 'child engine instance successfully created');\n\n assert.strictEqual((0, _engine.getEngineParent)(chatEngineInstance), engineInstance, 'child engine instance is assigned the correct parent');\n }\n });\n});","enifed('@ember/engine/tests/engine_parent_test', ['@ember/engine', 'internal-test-helpers'], function (_engine, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('EngineParent', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test An engine's parent can be set with `setEngineParent` and retrieved with `getEngineParent`\"](assert) {\n let engine = {};\n let parent = {};\n\n assert.strictEqual((0, _engine.getEngineParent)(engine), undefined, 'parent has not been set');\n\n (0, _engine.setEngineParent)(engine, parent);\n\n assert.strictEqual((0, _engine.getEngineParent)(engine), parent, 'parent has been set');\n }\n });\n});","enifed('@ember/engine/tests/engine_test', ['@ember/-internals/environment', '@ember/runloop', '@ember/engine', '@ember/-internals/runtime', '@ember/-internals/container', 'internal-test-helpers'], function (_environment, _runloop, _engine, _runtime, _container, _internalTestHelpers) {\n 'use strict';\n\n let engine;\n let originalLookup = _environment.context.lookup;\n\n (0, _internalTestHelpers.moduleFor)('Engine', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n (0, _runloop.run)(() => {\n engine = _engine.default.create();\n _environment.context.lookup = { TestEngine: engine };\n });\n }\n\n teardown() {\n _environment.context.lookup = originalLookup;\n if (engine) {\n (0, _runloop.run)(engine, 'destroy');\n engine = null;\n }\n }\n\n ['@test acts like a namespace'](assert) {\n engine.Foo = _runtime.Object.extend();\n assert.equal(engine.Foo.toString(), 'TestEngine.Foo', 'Classes pick up their parent namespace');\n }\n\n ['@test builds a registry'](assert) {\n assert.strictEqual(engine.resolveRegistration('application:main'), engine, `application:main is registered`);\n assert.deepEqual(engine.registeredOptionsForType('component'), { singleton: false }, `optionsForType 'component'`);\n assert.deepEqual(engine.registeredOptionsForType('view'), { singleton: false }, `optionsForType 'view'`);\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'controller:basic');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view', '_viewRegistry', '-view-registry:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_topLevelViewTemplate', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view:-outlet', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'controller', 'target', 'router:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'controller', 'namespace', 'application:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'router', '_bucketCache', _container.privatize`-bucket-cache:main`);\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_bucketCache', _container.privatize`-bucket-cache:main`);\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'route', '_router', 'router:main');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-text-field');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-text-area');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:-checkbox');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:link-to');\n\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'service:-routing');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component-lookup:main');\n\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-dom-changes', 'document', 'service:-document');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'service:-dom-tree-construction', 'document', 'service:-document');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, _container.privatize`template:components/-default`);\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'view:-outlet', 'template', 'template:-outlet');\n (0, _internalTestHelpers.verifyInjection)(assert, engine, 'template', 'compiler', _container.privatize`template-compiler:main`);\n assert.deepEqual(engine.registeredOptionsForType('helper'), { instantiate: false }, `optionsForType 'helper'`);\n }\n });\n});","enifed('@ember/error/tests/index_test', ['@ember/error', 'internal-test-helpers'], function (_error, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember Error Throwing', class extends _internalTestHelpers.AbstractTestCase {\n ['@test new EmberError displays provided message'](assert) {\n assert.throws(() => {\n throw new _error.default('A Message');\n }, function (e) {\n return e.message === 'A Message';\n }, 'the assigned message was displayed');\n }\n });\n});","enifed('@ember/instrumentation/tests/index-test', ['@ember/instrumentation', 'internal-test-helpers'], function (_instrumentation, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember Instrumentation', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n (0, _instrumentation.reset)();\n }\n\n ['@test execute block even if no listeners'](assert) {\n let result = (0, _instrumentation.instrument)('render', {}, function () {\n return 'hello';\n });\n assert.equal(result, 'hello', 'called block');\n }\n\n ['@test subscribing to a simple path receives the listener'](assert) {\n assert.expect(12);\n\n let sentPayload = {};\n let count = 0;\n\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n if (count === 0) {\n assert.strictEqual(name, 'render');\n } else {\n assert.strictEqual(name, 'render.handlebars');\n }\n\n assert.ok(typeof timestamp === 'number');\n assert.strictEqual(payload, sentPayload);\n },\n\n after(name, timestamp, payload) {\n if (count === 0) {\n assert.strictEqual(name, 'render');\n } else {\n assert.strictEqual(name, 'render.handlebars');\n }\n\n assert.ok(typeof timestamp === 'number');\n assert.strictEqual(payload, sentPayload);\n\n count++;\n }\n });\n\n (0, _instrumentation.instrument)('render', sentPayload, function () {});\n\n (0, _instrumentation.instrument)('render.handlebars', sentPayload, function () {});\n }\n\n ['@test returning a value from the before callback passes it to the after callback'](assert) {\n assert.expect(2);\n\n let passthru1 = {};\n let passthru2 = {};\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n return passthru1;\n },\n after(name, timestamp, payload, beforeValue) {\n assert.strictEqual(beforeValue, passthru1);\n }\n });\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n return passthru2;\n },\n after(name, timestamp, payload, beforeValue) {\n assert.strictEqual(beforeValue, passthru2);\n }\n });\n\n (0, _instrumentation.instrument)('render', null, function () {});\n }\n\n ['@test instrument with 2 args (name, callback) no payload'](assert) {\n assert.expect(1);\n\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\n },\n after() {}\n });\n\n (0, _instrumentation.instrument)('render', function () {});\n }\n\n ['@test instrument with 3 args (name, callback, binding) no payload'](assert) {\n assert.expect(2);\n\n let binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\n },\n after() {}\n });\n\n (0, _instrumentation.instrument)('render', function () {\n assert.deepEqual(this, binding);\n }, binding);\n }\n\n ['@test instrument with 3 args (name, payload, callback) with payload'](assert) {\n assert.expect(1);\n\n let expectedPayload = { hi: 1 };\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\n },\n after() {}\n });\n\n (0, _instrumentation.instrument)('render', expectedPayload, function () {});\n }\n\n ['@test instrument with 4 args (name, payload, callback, binding) with payload'](assert) {\n assert.expect(2);\n\n let expectedPayload = { hi: 1 };\n let binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\n },\n after() {}\n });\n\n (0, _instrumentation.instrument)('render', expectedPayload, function () {\n assert.deepEqual(this, binding);\n }, binding);\n }\n\n ['@test raising an exception in the instrumentation attaches it to the payload'](assert) {\n assert.expect(2);\n\n let error = new Error('Instrumentation');\n\n (0, _instrumentation.subscribe)('render', {\n before() {},\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n });\n\n (0, _instrumentation.subscribe)('render', {\n before() {},\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n });\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {\n throw error;\n });\n }\n\n ['@test it is possible to add a new subscriber after the first instrument'](assert) {\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n assert.ok(true, 'Before callback was called');\n },\n after() {\n assert.ok(true, 'After callback was called');\n }\n });\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n }\n\n ['@test it is possible to remove a subscriber'](assert) {\n assert.expect(4);\n\n let count = 0;\n\n let subscriber = (0, _instrumentation.subscribe)('render', {\n before() {\n assert.equal(count, 0);\n assert.ok(true, 'Before callback was called');\n },\n after() {\n assert.equal(count, 0);\n assert.ok(true, 'After callback was called');\n count++;\n }\n });\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n\n (0, _instrumentation.unsubscribe)(subscriber);\n\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n }\n });\n});","enifed('@ember/map/tests/map_test', ['@ember/map', '@ember/map/with-default', '@ember/map/lib/ordered-set', 'internal-test-helpers'], function (_map, _withDefault, _orderedSet, _internalTestHelpers) {\n 'use strict';\n\n let object, number, string, map, variety;\n const varieties = [['Map', _map.default], ['MapWithDefault', _withDefault.default]];\n\n function testMap(nameAndFunc) {\n variety = nameAndFunc[0];\n\n (0, _internalTestHelpers.moduleFor)('Ember.' + variety + ' (forEach and get are implicitly tested)', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = {};\n number = 42;\n string = 'foo';\n\n expectDeprecation(() => {\n map = nameAndFunc[1].create();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test set'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n map.set(object, 'losing');\n map.set(number, 'losing');\n map.set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']]);\n\n assert.equal(map.has('nope'), false, 'expected the key `nope` to not be present');\n assert.equal(map.has({}), false, 'expected they key `{}` to not be present');\n }\n\n ['@test set chaining'](assert) {\n map.set(object, 'winning').set(number, 'winning').set(string, 'winning');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n map.set(object, 'losing').set(number, 'losing').set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']]);\n\n assert.equal(map.has('nope'), false, 'expected the key `nope` to not be present');\n assert.equal(map.has({}), false, 'expected they key `{}` to not be present');\n }\n\n ['@test with key with undefined value'](assert) {\n map.set('foo', undefined);\n\n map.forEach(function (value, key) {\n assert.equal(value, undefined);\n assert.equal(key, 'foo');\n });\n\n assert.ok(map.has('foo'), 'has key foo, even with undefined value');\n\n assert.equal(map.size, 1);\n }\n\n ['@test arity of forEach is 1 – es6 23.1.3.5'](assert) {\n assert.equal(map.forEach.length, 1, 'expected arity for map.forEach is 1');\n }\n\n ['@test forEach throws without a callback as the first argument'](assert) {\n assert.equal(map.forEach.length, 1, 'expected arity for map.forEach is 1');\n }\n\n ['@test has empty collection'](assert) {\n assert.equal(map.has('foo'), false);\n assert.equal(map.has(), false);\n }\n\n ['@test delete'](assert) {\n expectNoDeprecation();\n\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n map.delete(object);\n map.delete(number);\n map.delete(string);\n\n // doesn't explode\n map.delete({});\n\n mapHasEntries(assert, []);\n }\n\n ['@test copy and then update'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map2.set(object, 'losing');\n map2.set(number, 'losing');\n map2.set(string, 'losing');\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n mapHasEntries(assert, [[object, 'losing'], [number, 'losing'], [string, 'losing']], map2);\n }\n\n ['@test copy and then delete'](assert) {\n map.set(object, 'winning');\n map.set(number, 'winning');\n map.set(string, 'winning');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map2.delete(object);\n map2.delete(number);\n map2.delete(string);\n\n mapHasEntries(assert, [[object, 'winning'], [number, 'winning'], [string, 'winning']]);\n\n mapHasEntries(assert, [], map2);\n }\n\n ['@test size'](assert) {\n //Add a key twice\n assert.equal(map.size, 0);\n map.set(string, 'a string');\n assert.equal(map.size, 1);\n map.set(string, 'the same string');\n assert.equal(map.size, 1);\n\n //Add another\n map.set(number, 'a number');\n assert.equal(map.size, 2);\n\n //Remove one that doesn't exist\n map.delete('does not exist');\n assert.equal(map.size, 2);\n\n //Check copy\n expectDeprecation(() => {\n let copy = map.copy();\n assert.equal(copy.size, 2);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n //Remove a key twice\n map.delete(number);\n assert.equal(map.size, 1);\n map.delete(number);\n assert.equal(map.size, 1);\n\n //Remove the last key\n map.delete(string);\n assert.equal(map.size, 0);\n map.delete(string);\n assert.equal(map.size, 0);\n }\n\n ['@test forEach without proper callback'](assert) {\n expectAssertion(function () {\n map.forEach();\n }, '[object Undefined] is not a function');\n\n expectAssertion(function () {\n map.forEach(undefined);\n }, '[object Undefined] is not a function');\n\n expectAssertion(function () {\n map.forEach(1);\n }, '[object Number] is not a function');\n\n expectAssertion(function () {\n map.forEach({});\n }, '[object Object] is not a function');\n\n map.forEach(function (value, key) {\n map.delete(key);\n });\n // ensure the error happens even if no data is present\n assert.equal(map.size, 0);\n expectAssertion(function () {\n map.forEach({});\n }, '[object Object] is not a function');\n }\n\n ['@test forEach basic'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }, { value: 3, key: 'c', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 3, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w context'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n let context = {};\n let expectations = [{ value: 1, key: 'a', context: context }, { value: 2, key: 'b', context: context }, { value: 3, key: 'c', context: context }];\n\n map.forEach(function (value, key, theMap) {\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n }, context);\n\n assert.equal(iteration, 3, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w deletion while enumerating'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n if (iteration === 0) {\n map.delete('c');\n }\n\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 2, 'expected 3 iterations');\n }\n\n ['@test forEach basic /w addition while enumerating'](assert) {\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n\n let iteration = 0;\n\n let expectations = [{ value: 1, key: 'a', context: unboundThis }, { value: 2, key: 'b', context: unboundThis }, { value: 3, key: 'c', context: unboundThis }, { value: 4, key: 'd', context: unboundThis }];\n\n map.forEach(function (value, key, theMap) {\n if (iteration === 0) {\n map.set('d', 4);\n }\n\n let expectation = expectations[iteration];\n\n assert.equal(value, expectation.value, 'value should be correct');\n assert.equal(key, expectation.key, 'key should be correct');\n assert.equal(this, expectation.context, 'context should be as if it was unbound');\n assert.equal(map, theMap, 'map being iterated over should be passed in');\n\n iteration++;\n });\n\n assert.equal(iteration, 4, 'expected 3 iterations');\n }\n\n ['@test clear'](assert) {\n let iterations = 0;\n\n map.set('a', 1);\n map.set('b', 2);\n map.set('c', 3);\n map.set('d', 4);\n\n assert.equal(map.size, 4);\n\n map.forEach(function () {\n iterations++;\n });\n assert.equal(iterations, 4);\n\n map.clear();\n assert.equal(map.size, 0);\n iterations = 0;\n map.forEach(function () {\n iterations++;\n });\n assert.equal(iterations, 0);\n }\n\n ['@skip -0'](assert) {\n assert.equal(map.has(-0), false);\n assert.equal(map.has(0), false);\n\n map.set(-0, 'zero');\n\n assert.equal(map.has(-0), true);\n assert.equal(map.has(0), true);\n\n assert.equal(map.get(0), 'zero');\n assert.equal(map.get(-0), 'zero');\n\n map.forEach(function (value, key) {\n assert.equal(1 / key, Infinity, 'spec says key should be positive zero');\n });\n }\n\n ['@test NaN'](assert) {\n assert.equal(map.has(NaN), false);\n\n map.set(NaN, 'not-a-number');\n\n assert.equal(map.has(NaN), true);\n\n assert.equal(map.get(NaN), 'not-a-number');\n }\n\n ['@test NaN Boxed'](assert) {\n //jshint -W053\n let boxed = new Number(NaN);\n assert.equal(map.has(boxed), false);\n\n map.set(boxed, 'not-a-number');\n\n assert.equal(map.has(boxed), true);\n assert.equal(map.has(NaN), false);\n\n assert.equal(map.get(NaN), undefined);\n assert.equal(map.get(boxed), 'not-a-number');\n }\n\n ['@test 0 value'](assert) {\n let obj = {};\n assert.equal(map.has(obj), false);\n\n assert.equal(map.size, 0);\n map.set(obj, 0);\n assert.equal(map.size, 1);\n\n assert.equal(map.has(obj), true);\n assert.equal(map.get(obj), 0);\n\n map.delete(obj);\n assert.equal(map.has(obj), false);\n assert.equal(map.get(obj), undefined);\n assert.equal(map.size, 0);\n }\n });\n\n let mapHasLength = function (assert, expected, theMap) {\n theMap = theMap || map;\n\n let length = 0;\n theMap.forEach(function () {\n length++;\n });\n\n assert.equal(length, expected, 'map should contain ' + expected + ' items');\n };\n\n let mapHasEntries = function (assert, entries, theMap) {\n theMap = theMap || map;\n\n for (let i = 0; i < entries.length; i++) {\n assert.equal(theMap.get(entries[i][0]), entries[i][1]);\n assert.equal(theMap.has(entries[i][0]), true);\n }\n\n mapHasLength(assert, entries.length, theMap);\n };\n\n let unboundThis;\n\n (function () {\n unboundThis = this;\n })();\n }\n\n for (let i = 0; i < varieties.length; i++) {\n testMap(varieties[i]);\n }\n\n (0, _internalTestHelpers.moduleFor)('MapWithDefault - default values', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Retrieving a value that has not been set returns and sets a default value'](assert) {\n let map;\n expectDeprecation(() => {\n map = _withDefault.default.create({\n defaultValue(key) {\n return [key];\n }\n });\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n let value = map.get('ohai');\n assert.deepEqual(value, ['ohai']);\n\n assert.strictEqual(value, map.get('ohai'));\n }\n\n ['@test Map.prototype.constructor'](assert) {\n expectDeprecation(() => {\n let map = new _map.default();\n assert.equal(map.constructor, _map.default);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test MapWithDefault.prototype.constructor'](assert) {\n expectDeprecation(() => {\n let map = new _withDefault.default({\n defaultValue(key) {\n return key;\n }\n });\n assert.equal(map.constructor, _withDefault.default);\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test Copying a MapWithDefault copies the default value'](assert) {\n let map;\n expectDeprecation(() => {\n map = _withDefault.default.create({\n defaultValue(key) {\n return [key];\n }\n });\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n map.set('ohai', 1);\n map.get('bai');\n\n let map2;\n expectDeprecation(() => {\n map2 = map.copy();\n }, 'Use of @ember/Map is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n\n assert.equal(map2.get('ohai'), 1);\n assert.deepEqual(map2.get('bai'), ['bai']);\n\n map2.set('kthx', 3);\n\n assert.deepEqual(map.get('kthx'), ['kthx']);\n assert.equal(map2.get('kthx'), 3);\n\n assert.deepEqual(map2.get('default'), ['default']);\n\n map2.defaultValue = key => ['tom is on', key];\n\n assert.deepEqual(map2.get('drugs'), ['tom is on', 'drugs']);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('OrderedSet', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n object = {};\n number = 42;\n string = 'foo';\n\n expectDeprecation(() => {\n map = _orderedSet.default.create();\n }, 'Use of @ember/OrderedSet is deprecated. Please use native `Map` instead', { id: 'ember-map-deprecation', until: '3.5.0' });\n }\n\n ['@test add returns the set'](assert) {\n let obj = {};\n assert.equal(map.add(obj), map);\n assert.equal(map.add(obj), map, 'when it is already in the set');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('__OrderedSet__', class extends _internalTestHelpers.AbstractTestCase {\n ['@test private __OrderedSet__ can be created without deprecation']() {\n expectNoDeprecation();\n _orderedSet.__OrderedSet__.create();\n }\n });\n});","enifed('@ember/object/tests/computed/computed_macros_test', ['@ember/-internals/metal', '@ember/object/computed', '@ember/-internals/runtime', 'internal-test-helpers'], function (_metal, _computed, _runtime, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('CP macros', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.computed.empty'](assert) {\n let obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n\n bestLannisterUnspecified: (0, _computed.empty)('bestLannister'),\n noLannistersKnown: (0, _computed.empty)('lannisters')\n }).create({\n lannisters: (0, _runtime.A)()\n });\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterUnspecified'), true, 'bestLannister initially empty');\n assert.equal((0, _metal.get)(obj, 'noLannistersKnown'), true, 'lannisters initially empty');\n\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterUnspecified'), false, 'empty respects strings');\n assert.equal((0, _metal.get)(obj, 'noLannistersKnown'), false, 'empty respects array mutations');\n }\n\n ['@test Ember.computed.notEmpty'](assert) {\n let obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n\n bestLannisterSpecified: (0, _computed.notEmpty)('bestLannister'),\n LannistersKnown: (0, _computed.notEmpty)('lannisters')\n }).create({\n lannisters: (0, _runtime.A)()\n });\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterSpecified'), false, 'bestLannister initially empty');\n assert.equal((0, _metal.get)(obj, 'LannistersKnown'), false, 'lannisters initially empty');\n\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterSpecified'), true, 'empty respects strings');\n assert.equal((0, _metal.get)(obj, 'LannistersKnown'), true, 'empty respects array mutations');\n }\n\n ['@test computed.not'](assert) {\n let obj = { foo: true };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n\n obj = { foo: { bar: true } };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo.bar'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n }\n\n ['@test computed.empty'](assert) {\n let obj = { foo: [], bar: undefined, baz: null, quz: '' };\n (0, _metal.defineProperty)(obj, 'fooEmpty', (0, _computed.empty)('foo'));\n (0, _metal.defineProperty)(obj, 'barEmpty', (0, _computed.empty)('bar'));\n (0, _metal.defineProperty)(obj, 'bazEmpty', (0, _computed.empty)('baz'));\n (0, _metal.defineProperty)(obj, 'quzEmpty', (0, _computed.empty)('quz'));\n\n assert.equal((0, _metal.get)(obj, 'fooEmpty'), true);\n (0, _metal.set)(obj, 'foo', [1]);\n assert.equal((0, _metal.get)(obj, 'fooEmpty'), false);\n assert.equal((0, _metal.get)(obj, 'barEmpty'), true);\n assert.equal((0, _metal.get)(obj, 'bazEmpty'), true);\n assert.equal((0, _metal.get)(obj, 'quzEmpty'), true);\n (0, _metal.set)(obj, 'quz', 'asdf');\n assert.equal((0, _metal.get)(obj, 'quzEmpty'), false);\n }\n\n ['@test computed.bool'](assert) {\n let obj = { foo() {}, bar: 'asdf', baz: null, quz: false };\n (0, _metal.defineProperty)(obj, 'fooBool', (0, _computed.bool)('foo'));\n (0, _metal.defineProperty)(obj, 'barBool', (0, _computed.bool)('bar'));\n (0, _metal.defineProperty)(obj, 'bazBool', (0, _computed.bool)('baz'));\n (0, _metal.defineProperty)(obj, 'quzBool', (0, _computed.bool)('quz'));\n assert.equal((0, _metal.get)(obj, 'fooBool'), true);\n assert.equal((0, _metal.get)(obj, 'barBool'), true);\n assert.equal((0, _metal.get)(obj, 'bazBool'), false);\n assert.equal((0, _metal.get)(obj, 'quzBool'), false);\n }\n\n ['@test computed.alias'](assert) {\n let obj = { bar: 'asdf', baz: null, quz: false };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\n\n (0, _metal.defineProperty)(obj, 'barAlias', (0, _metal.alias)('bar'));\n (0, _metal.defineProperty)(obj, 'bazAlias', (0, _metal.alias)('baz'));\n (0, _metal.defineProperty)(obj, 'quzAlias', (0, _metal.alias)('quz'));\n (0, _metal.defineProperty)(obj, 'bayAlias', (0, _metal.alias)('bay'));\n\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'asdf');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), null);\n assert.equal((0, _metal.get)(obj, 'quzAlias'), false);\n assert.equal((0, _metal.get)(obj, 'bayAlias'), 'apple');\n\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n (0, _metal.set)(obj, 'quzAlias', null);\n\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quzAlias'), null);\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'baz'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quz'), null);\n }\n\n ['@test computed.alias set'](assert) {\n let obj = {};\n let constantValue = 'always `a`';\n\n (0, _metal.defineProperty)(obj, 'original', (0, _metal.computed)({\n get: function () {\n return constantValue;\n },\n set: function () {\n return constantValue;\n }\n }));\n (0, _metal.defineProperty)(obj, 'aliased', (0, _metal.alias)('original'));\n\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n\n (0, _metal.set)(obj, 'aliased', 'should not set to this value');\n\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n }\n\n ['@test computed.match'](assert) {\n let obj = { name: 'Paul' };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.match)('name', /Paul/));\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n\n (0, _metal.set)(obj, 'name', 'Pierre');\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test computed.notEmpty'](assert) {\n let obj = { items: [1] };\n (0, _metal.defineProperty)(obj, 'hasItems', (0, _computed.notEmpty)('items'));\n\n assert.equal((0, _metal.get)(obj, 'hasItems'), true, 'is not empty');\n\n (0, _metal.set)(obj, 'items', []);\n\n assert.equal((0, _metal.get)(obj, 'hasItems'), false, 'is empty');\n }\n\n ['@test computed.equal'](assert) {\n let obj = { name: 'Paul' };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.equal)('name', 'Paul'));\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n\n (0, _metal.set)(obj, 'name', 'Pierre');\n\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test computed.gt'](assert) {\n let obj = { number: 2 };\n (0, _metal.defineProperty)(obj, 'isGreaterThenOne', (0, _computed.gt)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), true, 'is gt');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n\n (0, _metal.set)(obj, 'number', 0);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n }\n\n ['@test computed.gte'](assert) {\n let obj = { number: 2 };\n (0, _metal.defineProperty)(obj, 'isGreaterOrEqualThenOne', (0, _computed.gte)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n\n (0, _metal.set)(obj, 'number', 0);\n\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), false, 'is not gte');\n }\n\n ['@test computed.lt'](assert) {\n let obj = { number: 0 };\n (0, _metal.defineProperty)(obj, 'isLesserThenOne', (0, _computed.lt)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), true, 'is lt');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n\n (0, _metal.set)(obj, 'number', 2);\n\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n }\n\n ['@test computed.lte'](assert) {\n let obj = { number: 0 };\n (0, _metal.defineProperty)(obj, 'isLesserOrEqualThenOne', (0, _computed.lte)('number', 1));\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n\n (0, _metal.set)(obj, 'number', 1);\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n\n (0, _metal.set)(obj, 'number', 2);\n\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), false, 'is not lte');\n }\n\n ['@test computed.and two properties'](assert) {\n let obj = { one: true, two: true };\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two'));\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), true, 'one and two');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), false, 'one and not two');\n\n (0, _metal.set)(obj, 'one', null);\n (0, _metal.set)(obj, 'two', 'Yes');\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), null, 'returns falsy value as in &&');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), 2, 'returns truthy value as in &&');\n }\n\n ['@test computed.and three properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('one', 'two', 'three'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test computed.and expand properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('{one,two,three}'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test computed.or two properties'](assert) {\n let obj = { one: true, two: true };\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two'));\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), false, 'nor one nor two');\n\n (0, _metal.set)(obj, 'two', null);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or three properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('one', 'two', 'three'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', null);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or expand properties'](assert) {\n let obj = { one: true, two: true, three: true };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('{one,two,three}'));\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'two', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', false);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n\n (0, _metal.set)(obj, 'three', null);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n\n (0, _metal.set)(obj, 'two', true);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n\n (0, _metal.set)(obj, 'one', 1);\n\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test computed.or and computed.and warn about dependent keys with spaces']() {\n let obj = { one: true, two: true };\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two three'));\n }, /Dependent keys passed to computed\\.or\\(\\) can't have spaces\\./);\n\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two three'));\n }, /Dependent keys passed to computed\\.and\\(\\) can't have spaces\\./);\n }\n\n ['@test computed.oneWay'](assert) {\n let obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.oneWay)('firstName'));\n\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n\n (0, _metal.set)(obj, 'nickName', 'TeddyBear');\n\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n }\n\n ['@test computed.readOnly'](assert) {\n let obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.readOnly)('firstName'));\n\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n\n assert.throws(function () {\n (0, _metal.set)(obj, 'nickName', 'TeddyBear');\n }, / /);\n\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TEDDDDDDDDYYY');\n }\n\n ['@test computed.deprecatingAlias'](assert) {\n let obj = { bar: 'asdf', baz: null, quz: false };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\n\n (0, _metal.defineProperty)(obj, 'barAlias', (0, _computed.deprecatingAlias)('bar', { id: 'bar-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'bazAlias', (0, _computed.deprecatingAlias)('baz', { id: 'baz-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'quzAlias', (0, _computed.deprecatingAlias)('quz', { id: 'quz-deprecation', until: 'some.version' }));\n (0, _metal.defineProperty)(obj, 'bayAlias', (0, _computed.deprecatingAlias)('bay', { id: 'bay-deprecation', until: 'some.version' }));\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'asdf');\n }, 'Usage of `barAlias` is deprecated, use `bar` instead.');\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bazAlias'), null);\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'quzAlias'), false);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bayAlias'), 'apple');\n }, 'Usage of `bayAlias` is deprecated, use `bay` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n }, 'Usage of `barAlias` is deprecated, use `bar` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'quzAlias', null);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quzAlias'), null);\n\n assert.equal((0, _metal.get)(obj, 'bar'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'baz'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quz'), null);\n }\n });\n});","enifed('@ember/object/tests/computed/reduce_computed_macros_test', ['@ember/runloop', '@ember/-internals/metal', '@ember/-internals/runtime', '@ember/object/computed', 'internal-test-helpers'], function (_runloop, _metal, _runtime, _computed, _internalTestHelpers) {\n 'use strict';\n\n let obj;\n (0, _internalTestHelpers.moduleFor)('map', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array.@each.v', item => item.v),\n mappedObjects: (0, _computed.map)('arrayObjects.@each.v', item => ({\n name: item.v.name\n }))\n }).create({\n arrayObjects: (0, _runtime.A)([{ v: { name: 'Robert' } }, { v: { name: 'Leanna' } }]),\n\n array: (0, _runtime.A)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test map is readOnly'](assert) {\n assert.throws(function () {\n obj.set('mapped', 1);\n }, /Cannot set read-only property \"mapped\" on object:/);\n }\n\n ['@test it maps simple properties'](assert) {\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n\n obj.get('array').pushObject({ v: 5 });\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n\n (0, _runtime.removeAt)(obj.get('array'), 3);\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n ['@test it maps simple unshifted properties'](assert) {\n let array = (0, _runtime.A)();\n\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', item => item.toUpperCase())\n }).create({\n array\n });\n\n array.unshiftObject('c');\n array.unshiftObject('b');\n array.unshiftObject('a');\n\n array.popObject();\n\n assert.deepEqual(obj.get('mapped'), ['A', 'B'], 'properties unshifted in sequence are mapped correctly');\n }\n\n ['@test it has the correct `this`'](assert) {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', function (item) {\n assert.equal(this, obj, 'should have correct context');\n return this.upperCase(item);\n }),\n upperCase(string) {\n return string.toUpperCase();\n }\n }).create({\n array: ['a', 'b', 'c']\n });\n\n assert.deepEqual(obj.get('mapped'), ['A', 'B', 'C'], 'properties unshifted in sequence are mapped correctly');\n }\n\n ['@test it passes the index to the callback'](assert) {\n let array = ['a', 'b', 'c'];\n\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', (item, index) => index)\n }).create({\n array\n });\n\n assert.deepEqual(obj.get('mapped'), [0, 1, 2], 'index is passed to callback correctly');\n }\n\n ['@test it maps objects'](assert) {\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Robert' }, { name: 'Leanna' }]);\n\n obj.get('arrayObjects').pushObject({\n v: { name: 'Eddard' }\n });\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Robert' }, { name: 'Leanna' }, { name: 'Eddard' }]);\n\n (0, _runtime.removeAt)(obj.get('arrayObjects'), 1);\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Robert' }, { name: 'Eddard' }]);\n\n (0, _metal.set)(obj.get('arrayObjects')[0], 'v', { name: 'Stannis' });\n\n assert.deepEqual(obj.get('mappedObjects'), [{ name: 'Stannis' }, { name: 'Eddard' }]);\n }\n\n ['@test it maps unshifted objects with property observers'](assert) {\n let array = (0, _runtime.A)();\n let cObj = { v: 'c' };\n\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array.@each.v', item => (0, _metal.get)(item, 'v').toUpperCase())\n }).create({\n array\n });\n\n array.unshiftObject(cObj);\n array.unshiftObject({ v: 'b' });\n array.unshiftObject({ v: 'a' });\n\n (0, _metal.set)(cObj, 'v', 'd');\n\n assert.deepEqual(array.mapBy('v'), ['a', 'b', 'd'], 'precond - unmapped array is correct');\n assert.deepEqual(obj.get('mapped'), ['A', 'B', 'D'], 'properties unshifted in sequence are mapped correctly');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('mapBy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.mapBy)('array', 'v')\n }).create({\n array: (0, _runtime.A)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test mapBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('mapped', 1);\n }, /Cannot set read-only property \"mapped\" on object:/);\n }\n\n ['@test it maps properties'](assert) {\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n\n obj.get('array').pushObject({ v: 5 });\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n\n (0, _runtime.removeAt)(obj.get('array'), 3);\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n ['@test it is observable'](assert) {\n let calls = 0;\n\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n\n (0, _metal.addObserver)(obj, 'mapped.@each', () => calls++);\n\n obj.get('array').pushObject({ v: 5 });\n\n assert.equal(calls, 1, 'mapBy is observable');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('filter', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', item => item % 2 === 0)\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7, 8])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filter is readOnly'](assert) {\n assert.throws(function () {\n obj.set('filtered', 1);\n }, /Cannot set read-only property \"filtered\" on object:/);\n }\n\n ['@test it filters according to the specified filter function'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'filter filters by the specified function');\n }\n\n ['@test it passes the index to the callback'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', (item, index) => index === 1)\n }).create({\n array: ['a', 'b', 'c']\n });\n\n assert.deepEqual((0, _metal.get)(obj, 'filtered'), ['b'], 'index is passed to callback correctly');\n }\n\n ['@test it has the correct `this`'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', function (item, index) {\n assert.equal(this, obj);\n return this.isOne(index);\n }),\n isOne(value) {\n return value === 1;\n }\n }).create({\n array: ['a', 'b', 'c']\n });\n\n assert.deepEqual((0, _metal.get)(obj, 'filtered'), ['b'], 'index is passed to callback correctly');\n }\n\n ['@test it passes the array to the callback'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', (item, index, array) => index === (0, _metal.get)(array, 'length') - 2)\n }).create({\n array: (0, _runtime.A)(['a', 'b', 'c'])\n });\n\n assert.deepEqual(obj.get('filtered'), ['b'], 'array is passed to callback correctly');\n }\n\n ['@test it caches properly'](assert) {\n let array = obj.get('array');\n\n let filtered = obj.get('filtered');\n assert.ok(filtered === obj.get('filtered'));\n\n array.addObject(11);\n let newFiltered = obj.get('filtered');\n\n assert.ok(filtered !== newFiltered);\n\n assert.ok(obj.get('filtered') === newFiltered);\n }\n\n ['@test it updates as the array is modified'](assert) {\n let array = obj.get('array');\n\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n array.addObject(11);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'objects not passing the filter are not added');\n\n array.addObject(12);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8, 12], 'objects passing the filter are added');\n\n array.removeObject(3);\n array.removeObject(4);\n\n assert.deepEqual(obj.get('filtered'), [2, 6, 8, 12], 'objects removed from the dependent array are removed from the computed array');\n }\n\n ['@test the dependent array can be cleared one at a time'](assert) {\n let array = (0, _metal.get)(obj, 'array');\n\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n // clear 1-8 but in a random order\n array.removeObject(3);\n array.removeObject(1);\n array.removeObject(2);\n array.removeObject(4);\n array.removeObject(8);\n array.removeObject(6);\n array.removeObject(5);\n array.removeObject(7);\n\n assert.deepEqual(obj.get('filtered'), [], 'filtered array cleared correctly');\n }\n\n ['@test the dependent array can be `clear`ed directly (#3272)'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n obj.get('array').clear();\n\n assert.deepEqual(obj.get('filtered'), [], 'filtered array cleared correctly');\n }\n\n ['@test it updates as the array is replaced'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n\n obj.set('array', [20, 21, 22, 23, 24]);\n\n assert.deepEqual(obj.get('filtered'), [20, 22, 24], 'computed array is updated when array is changed');\n }\n\n ['@test it updates properly on @each with {} dependencies'](assert) {\n let item = _runtime.Object.create({ prop: true });\n\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('items.@each.{prop}', function (item) {\n return item.get('prop') === true;\n })\n }).create({\n items: (0, _runtime.A)([item])\n });\n\n assert.deepEqual(obj.get('filtered'), [item]);\n\n item.set('prop', false);\n\n assert.deepEqual(obj.get('filtered'), []);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('filterBy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n a1s: (0, _computed.filterBy)('array', 'a', 1),\n as: (0, _computed.filterBy)('array', 'a'),\n bs: (0, _computed.filterBy)('array', 'b')\n }).create({\n array: (0, _runtime.A)([{ name: 'one', a: 1, b: false }, { name: 'two', a: 2, b: false }, { name: 'three', a: 1, b: true }, { name: 'four', b: true }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filterBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('as', 1);\n }, /Cannot set read-only property \"as\" on object:/);\n }\n\n ['@test properties can be filtered by truthiness'](assert) {\n assert.deepEqual(obj.get('as').mapBy('name'), ['one', 'two', 'three'], 'properties can be filtered by existence');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['three', 'four'], 'booleans can be filtered');\n\n (0, _metal.set)(obj.get('array')[0], 'a', undefined);\n (0, _metal.set)(obj.get('array')[3], 'a', true);\n\n (0, _metal.set)(obj.get('array')[0], 'b', true);\n (0, _metal.set)(obj.get('array')[3], 'b', false);\n\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four'], 'arrays computed by filter property respond to property changes');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three'], 'arrays computed by filtered property respond to property changes');\n\n obj.get('array').pushObject({ name: 'five', a: 6, b: true });\n\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four', 'five'], 'arrays computed by filter property respond to added objects');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three', 'five'], 'arrays computed by filtered property respond to added objects');\n\n obj.get('array').popObject();\n\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four'], 'arrays computed by filter property respond to removed objects');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three'], 'arrays computed by filtered property respond to removed objects');\n\n obj.set('array', [{ name: 'six', a: 12, b: true }]);\n\n assert.deepEqual(obj.get('as').mapBy('name'), ['six'], 'arrays computed by filter property respond to array changes');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['six'], 'arrays computed by filtered property respond to array changes');\n }\n\n ['@test properties can be filtered by values'](assert) {\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three'], 'properties can be filtered by matching value');\n\n obj.get('array').pushObject({ name: 'five', a: 1 });\n\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three', 'five'], 'arrays computed by matching value respond to added objects');\n\n obj.get('array').popObject();\n\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three'], 'arrays computed by matching value respond to removed objects');\n\n (0, _metal.set)(obj.get('array')[1], 'a', 1);\n (0, _metal.set)(obj.get('array')[2], 'a', 2);\n\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'two'], 'arrays computed by matching value respond to modified properties');\n }\n\n ['@test properties values can be replaced'](assert) {\n obj = _runtime.Object.extend({\n a1s: (0, _computed.filterBy)('array', 'a', 1),\n a1bs: (0, _computed.filterBy)('a1s', 'b')\n }).create({\n array: []\n });\n\n assert.deepEqual(obj.get('a1bs').mapBy('name'), [], 'properties can be filtered by matching value');\n\n (0, _metal.set)(obj, 'array', [{ name: 'item1', a: 1, b: true }]);\n\n assert.deepEqual(obj.get('a1bs').mapBy('name'), ['item1'], 'properties can be filtered by matching value');\n }\n });\n\n [['uniq', _computed.uniq], ['union', _computed.union]].forEach(tuple => {\n let [name, macro] = tuple;\n\n (0, _internalTestHelpers.moduleFor)(`computed.${name}`, class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n union: macro('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6]),\n array2: (0, _runtime.A)([4, 5, 6, 7, 8, 9, 4, 5, 6, 7, 8, 9]),\n array3: (0, _runtime.A)([1, 8, 10])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n [`@test ${name} is readOnly`](assert) {\n assert.throws(function () {\n obj.set('union', 1);\n }, /Cannot set read-only property \"union\" on object:/);\n }\n\n ['@test does not include duplicates'](assert) {\n let array = obj.get('array');\n let array2 = obj.get('array2');\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' does not include duplicates');\n\n array.pushObject(8);\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' does not add existing items');\n\n array.pushObject(11);\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], name + ' adds new items');\n\n (0, _runtime.removeAt)(array2, 6); // remove 7\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], name + ' does not remove items that are still in the dependent array');\n\n array2.removeObject(7);\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 8, 9, 10, 11], name + ' removes items when their last instance is gone');\n }\n\n ['@test has set-union semantics'](assert) {\n let array = obj.get('array');\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' is initially correct');\n\n array.removeObject(6);\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'objects are not removed if they exist in other dependent arrays');\n\n array.clear();\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 4, 5, 6, 7, 8, 9, 10], 'objects are removed when they are no longer in any dependent array');\n }\n });\n });\n\n (0, _internalTestHelpers.moduleFor)('computed.uniqBy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n list: null,\n uniqueById: (0, _computed.uniqBy)('list', 'id')\n }).create({\n list: (0, _runtime.A)([{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 1, value: 'one' }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test uniqBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('uniqueById', 1);\n }, /Cannot set read-only property \"uniqueById\" on object:/);\n }\n ['@test does not include duplicates'](assert) {\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }]);\n }\n\n ['@test it does not share state among instances'](assert) {\n let MyObject = _runtime.Object.extend({\n list: [],\n uniqueByName: (0, _computed.uniqBy)('list', 'name')\n });\n let a = MyObject.create({\n list: [{ name: 'bob' }, { name: 'mitch' }, { name: 'mitch' }]\n });\n let b = MyObject.create({\n list: [{ name: 'warren' }, { name: 'mitch' }]\n });\n\n assert.deepEqual(a.get('uniqueByName'), [{ name: 'bob' }, { name: 'mitch' }]);\n // Making sure that 'mitch' appears\n assert.deepEqual(b.get('uniqueByName'), [{ name: 'warren' }, { name: 'mitch' }]);\n }\n\n ['@test it handles changes to the dependent array'](assert) {\n obj.get('list').pushObject({ id: 3, value: 'three' });\n\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 3, value: 'three' }], 'The list includes three');\n\n obj.get('list').pushObject({ id: 3, value: 'three' });\n\n assert.deepEqual(obj.get('uniqueById'), [{ id: 1, value: 'one' }, { id: 2, value: 'two' }, { id: 3, value: 'three' }], 'The list does not include a duplicate three');\n }\n\n ['@test it returns an empty array when computed on a non-array'](assert) {\n let MyObject = _runtime.Object.extend({\n list: null,\n uniq: (0, _computed.uniqBy)('list', 'name')\n });\n let a = MyObject.create({ list: 'not an array' });\n\n assert.deepEqual(a.get('uniq'), []);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('computed.intersect', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n intersection: (0, _computed.intersect)('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6]),\n array2: (0, _runtime.A)([3, 3, 3, 4, 5]),\n array3: (0, _runtime.A)([3, 5, 6, 7, 8])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test intersect is readOnly'](assert) {\n assert.throws(function () {\n obj.set('intersection', 1);\n }, /Cannot set read-only property \"intersection\" on object:/);\n }\n\n ['@test it has set-intersection semantics'](assert) {\n let array2 = obj.get('array2');\n let array3 = obj.get('array3');\n\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'intersection is initially correct');\n\n array2.shiftObject();\n\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'objects are not removed when they are still in all dependent arrays');\n\n array2.shiftObject();\n\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'objects are not removed when they are still in all dependent arrays');\n\n array2.shiftObject();\n\n assert.deepEqual(obj.get('intersection'), [5], 'objects are removed once they are gone from all dependent arrays');\n\n array2.pushObject(1);\n\n assert.deepEqual(obj.get('intersection'), [5], 'objects are not added as long as they are missing from any dependent array');\n\n array3.pushObject(1);\n\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [1, 5], 'objects added once they belong to all dependent arrays');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('setDiff', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array', 'array2')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5, 10])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test setDiff is readOnly'](assert) {\n assert.throws(function () {\n obj.set('diff', 1);\n }, /Cannot set read-only property \"diff\" on object:/);\n }\n\n ['@test it asserts if given fewer or more than two dependent properties']() {\n expectAssertion(function () {\n _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5])\n });\n }, /\\`computed\\.setDiff\\` requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n\n expectAssertion(function () {\n _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5]),\n array3: (0, _runtime.A)([7])\n });\n }, /\\`computed\\.setDiff\\` requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n }\n\n ['@test it has set-diff semantics'](assert) {\n let array1 = obj.get('array');\n let array2 = obj.get('array2');\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'set-diff is initially correct');\n\n array2.popObject();\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'removing objects from the remove set has no effect if the object is not in the keep set');\n\n array2.shiftObject();\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 3, 6, 7], \"removing objects from the remove set adds them if they're in the keep set\");\n\n array1.removeObject(3);\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'removing objects from the keep array removes them from the computed array');\n\n array1.pushObject(5);\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'objects added to the keep array that are in the remove array are not added to the computed array');\n\n array1.pushObject(22);\n\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7, 22], 'objects added to the keep array not in the remove array are added to the computed array');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('sort - sortProperties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)(['lname', 'fname']),\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sort is readOnly'](assert) {\n assert.throws(function () {\n obj.set('sortedItems', 1);\n }, /Cannot set read-only property \"sortedItems\" on object:/);\n }\n\n ['@test arrays are initially sorted'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test default sort order is correct'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test changing the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('items', [{ fname: 'Roose', lname: 'Bolton' }, { fname: 'Theon', lname: 'Greyjoy' }, { fname: 'Ramsey', lname: 'Bolton' }, { fname: 'Stannis', lname: 'Baratheon' }]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Stannis', 'Ramsey', 'Roose', 'Theon'], 'changing dependent array updates sorted array');\n }\n\n ['@test adding to the dependent array updates the sorted array'](assert) {\n let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb'], 'Adding to the dependent array updates the sorted array');\n }\n\n ['@test removing from the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.get('items').popObject();\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Robb'], 'Removing from the dependent array updates the sorted array');\n }\n\n ['@test distinct items may be sort-equal, although their relative order will not be guaranteed'](assert) {\n // We recreate jaime and \"Cersei\" here only for test stability: we want\n // their guid-ordering to be deterministic\n let jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n\n let jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n\n let items = obj.get('items');\n\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n }\n\n ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](assert) {\n let tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n let tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n let items = obj.get('items');\n\n items.pushObject(tyrion);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n\n items.pushObject(tyrionInDisguise);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Yollo', 'Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n }\n\n ['@test updating sort properties detaches observers for old sort properties'](assert) {\n let objectToRemove = obj.get('items')[3];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname:desc']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei', 'Bran'], 'after updating sort properties array is updated');\n\n obj.get('items').removeObject(objectToRemove);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei'], 'after removing item array is updated');\n\n (0, _metal.set)(objectToRemove, 'lname', 'Updated-Stark');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei'], 'after changing removed item array is not updated');\n }\n\n ['@test sort works if array property is null (non array value) on first evaluation of computed prop'](assert) {\n obj.set('items', null);\n assert.deepEqual(obj.get('sortedItems'), []);\n obj.set('items', (0, _runtime.A)([{ fname: 'Cersei', lname: 'Lanister' }]));\n assert.deepEqual(obj.get('sortedItems'), [{ fname: 'Cersei', lname: 'Lanister' }]);\n }\n\n ['@test updating sort properties updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname:desc']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Robb', 'Jaime', 'Cersei', 'Bran'], 'after updating sort properties array is updated');\n }\n\n ['@test updating sort properties invalidates the sorted array'](assert) {\n let sortProps = obj.get('itemSorting');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n sortProps.clear();\n sortProps.pushObject('fname');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Bran', 'Cersei', 'Jaime', 'Robb'], 'after updating sort properties array is updated');\n }\n\n ['@test updating new sort properties invalidates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['age:desc', 'fname:asc']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Robb', 'Bran'], 'precond - array is correct after item sorting is changed');\n\n (0, _metal.set)(obj.get('items')[1], 'age', 29);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Cersei', 'Robb', 'Bran'], 'after updating sort properties array is updated');\n }\n\n ['@test sort direction defaults to ascending'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb']);\n }\n\n ['@test sort direction defaults to ascending (with sort property change)'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('itemSorting', (0, _runtime.A)(['fname']));\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Bran', 'Cersei', 'Jaime', 'Robb'], 'sort direction defaults to ascending');\n }\n\n [\"@test updating an item's sort properties updates the sorted array\"](assert) {\n let tyrionInDisguise = obj.get('items')[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Tyrion', 'Bran', 'Robb'], \"updating an item's sort properties updates the sorted array\");\n }\n\n [\"@test updating several of an item's sort properties updated the sorted array\"](assert) {\n let sansaInDisguise = obj.get('items')[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.setProperties)(sansaInDisguise, {\n fname: 'Sansa',\n lname: 'Stark'\n });\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Bran', 'Robb', 'Sansa'], \"updating an item's sort properties updates the sorted array\");\n }\n\n [\"@test updating an item's sort properties does not error when binary search does a self compare (#3273)\"](assert) {\n let jaime = {\n name: 'Jaime',\n status: 1\n };\n\n let cersei = {\n name: 'Cersei',\n status: 2\n };\n\n let obj = _runtime.Object.extend({\n sortProps: ['status'],\n sortedPeople: (0, _computed.sort)('people', 'sortProps')\n }).create({\n people: [jaime, cersei]\n });\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'status', 3);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'array is sorted correctly');\n\n (0, _metal.set)(cersei, 'status', 2);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei], 'array is sorted correctly');\n }\n\n ['@test array should not be sorted if sort properties array is empty'](assert) {\n var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n // This bug only manifests when array.sort(() => 0) is not equal to array.\n // In order for this to happen, the browser must use an unstable sort and the\n // array must be sufficient large. On Chrome, 12 items is currently sufficient.\n items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n }\n\n ['@test array should update if items to be sorted is replaced when sort properties array is empty'](assert) {\n var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n\n (0, _metal.set)(o, 'items', (0, _runtime.A)([5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4]));\n\n assert.deepEqual(o.get('sortedItems'), [5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4], 'array was updated');\n }\n\n ['@test array should update if items to be sorted is mutated when sort properties array is empty'](assert) {\n var o = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting: (0, _runtime.A)([]),\n items: (0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n\n o.get('items').pushObject(12);\n\n assert.deepEqual(o.get('sortedItems'), [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 12], 'array was updated');\n }\n\n ['@test array observers do not leak'](assert) {\n let daria = { name: 'Daria' };\n let jane = { name: 'Jane' };\n\n let sisters = [jane, daria];\n\n let sortProps = (0, _runtime.A)(['name']);\n let jaime = _runtime.Object.extend({\n sortedPeople: (0, _computed.sort)('sisters', 'sortProps'),\n sortProps\n }).create({\n sisters\n });\n\n jaime.get('sortedPeople');\n (0, _runloop.run)(jaime, 'destroy');\n\n try {\n sortProps.pushObject({\n name: 'Anna'\n });\n assert.ok(true);\n } catch (e) {\n assert.ok(false, e);\n }\n }\n\n ['@test property paths in sort properties update the sorted array'](assert) {\n let jaime = {\n relatedObj: { status: 1, firstName: 'Jaime', lastName: 'Lannister' }\n };\n\n let cersei = {\n relatedObj: { status: 2, firstName: 'Cersei', lastName: 'Lannister' }\n };\n\n let sansa = _runtime.Object.create({\n relatedObj: { status: 3, firstName: 'Sansa', lastName: 'Stark' }\n });\n\n let obj = _runtime.Object.extend({\n sortProps: ['relatedObj.status'],\n sortedPeople: (0, _computed.sort)('people', 'sortProps')\n }).create({\n people: [jaime, cersei, sansa]\n });\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'status', 3);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n (0, _metal.set)(cersei, 'status', 1);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n sansa.set('status', 1);\n\n assert.deepEqual(obj.get('sortedPeople'), [jaime, cersei, sansa], 'array is sorted correctly');\n\n obj.set('sortProps', ['relatedObj.firstName']);\n\n assert.deepEqual(obj.get('sortedPeople'), [cersei, jaime, sansa], 'array is sorted correctly');\n }\n\n ['@test if the dependentKey is neither an array nor object, it will return an empty array'](assert) {\n (0, _metal.set)(obj, 'items', null);\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n\n (0, _metal.set)(obj, 'array', undefined);\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n\n (0, _metal.set)(obj, 'array', 'not an array');\n assert.ok((0, _runtime.isArray)(obj.get('sortedItems')), 'returns an empty arrays');\n }\n });\n\n function sortByLnameFname(a, b) {\n let lna = (0, _metal.get)(a, 'lname');\n let lnb = (0, _metal.get)(b, 'lname');\n\n if (lna !== lnb) {\n return lna > lnb ? 1 : -1;\n }\n\n return sortByFnameAsc(a, b);\n }\n\n function sortByFnameAsc(a, b) {\n let fna = (0, _metal.get)(a, 'fname');\n let fnb = (0, _metal.get)(b, 'fname');\n\n if (fna === fnb) {\n return 0;\n }\n return fna > fnb ? 1 : -1;\n }\n\n (0, _internalTestHelpers.moduleFor)('sort - sort function', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items.@each.fname', sortByLnameFname)\n }).create({\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sort has correct `this`'](assert) {\n let obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items.@each.fname', function (a, b) {\n assert.equal(this, obj, 'expected the object to be `this`');\n return this.sortByLastName(a, b);\n }),\n sortByLastName(a, b) {\n return sortByFnameAsc(a, b);\n }\n }).create({\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n\n obj.get('sortedItems');\n }\n\n ['@test sort (with function) is readOnly'](assert) {\n assert.throws(function () {\n obj.set('sortedItems', 1);\n }, /Cannot set read-only property \"sortedItems\" on object:/);\n }\n\n ['@test arrays are initially sorted'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test default sort order is correct'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test changing the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.set('items', [{ fname: 'Roose', lname: 'Bolton' }, { fname: 'Theon', lname: 'Greyjoy' }, { fname: 'Ramsey', lname: 'Bolton' }, { fname: 'Stannis', lname: 'Baratheon' }]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Stannis', 'Ramsey', 'Roose', 'Theon'], 'changing dependent array updates sorted array');\n }\n\n ['@test adding to the dependent array updates the sorted array'](assert) {\n let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb'], 'Adding to the dependent array updates the sorted array');\n }\n\n ['@test removing from the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n obj.get('items').popObject();\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Robb'], 'Removing from the dependent array updates the sorted array');\n }\n\n ['@test distinct items may be sort-equal, although their relative order will not be guaranteed'](assert) {\n // We recreate jaime and \"Cersei\" here only for test stability: we want\n // their guid-ordering to be deterministic\n let jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n\n let jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n\n let items = obj.get('items');\n\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n }\n\n ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](assert) {\n let tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n let tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n let items = obj.get('items');\n\n items.pushObject(tyrion);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n\n items.pushObject(tyrionInDisguise);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Yollo', 'Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n }\n\n ['@test changing item properties specified via @each triggers a resort of the modified item'](assert) {\n let items = (0, _metal.get)(obj, 'items');\n\n let tyrionInDisguise = items[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Tyrion', 'Bran', 'Robb'], 'updating a specified property on an item resorts it');\n }\n\n ['@test changing item properties not specified via @each does not trigger a resort'](assert) {\n if (!false /* EMBER_METAL_TRACKED_PROPERTIES */) {\n let items = obj.get('items');\n let cersei = items[1];\n\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n\n (0, _metal.set)(cersei, 'lname', 'Stark'); // plot twist! (possibly not canon)\n\n // The array has become unsorted. If your sort function is sensitive to\n // properties, they *must* be specified as dependent item property keys or\n // we'll be doing binary searches on unsorted arrays.\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'updating an unspecified property on an item does not resort it');\n } else {\n assert.expect(0);\n }\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('sort - stability', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortProps: ['count', 'name'],\n sortedItems: (0, _computed.sort)('items', 'sortProps')\n }).create({\n items: [{ name: 'A', count: 1, thing: 4 }, { name: 'B', count: 1, thing: 3 }, { name: 'C', count: 1, thing: 2 }, { name: 'D', count: 1, thing: 4 }]\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sorts correctly as only one property changes'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n\n (0, _metal.set)(obj.get('items')[3], 'count', 2);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'final');\n }\n });\n\n let klass;\n (0, _internalTestHelpers.moduleFor)('sort - concurrency', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n klass = _runtime.Object.extend({\n sortProps: ['count'],\n sortedItems: (0, _computed.sort)('items', 'sortProps'),\n customSortedItems: (0, _computed.sort)('items.@each.count', (a, b) => a.count - b.count)\n });\n obj = klass.create({\n items: (0, _runtime.A)([{ name: 'A', count: 1, thing: 4, id: 1 }, { name: 'B', count: 2, thing: 3, id: 2 }, { name: 'C', count: 3, thing: 2, id: 3 }, { name: 'D', count: 4, thing: 1, id: 4 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sorts correctly after mutation to the sort properties'](assert) {\n let sorted = obj.get('sortedItems');\n assert.deepEqual(sorted.mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n }\n\n ['@test sort correctly after mutation to the sort'](assert) {\n assert.deepEqual(obj.get('customSortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\n assert.deepEqual(obj.get('customSortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n }\n\n ['@test sort correctly on multiple instances of the same class'](assert) {\n let obj2 = klass.create({\n items: (0, _runtime.A)([{ name: 'W', count: 23, thing: 4 }, { name: 'X', count: 24, thing: 3 }, { name: 'Y', count: 25, thing: 2 }, { name: 'Z', count: 26, thing: 1 }])\n });\n\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['W', 'X', 'Y', 'Z'], 'initial');\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n (0, _metal.set)(obj2.get('items')[1], 'count', 27);\n (0, _metal.set)(obj2.get('items')[2], 'count', 28);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['W', 'Z', 'X', 'Y'], 'final');\n\n obj.set('sortProps', ['thing']);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'final');\n\n obj2.notifyPropertyChange('sortedItems'); // invalidate to flush, to get DK refreshed\n obj2.get('sortedItems'); // flush to get updated DK\n\n obj2.set('items.firstObject.count', 9999);\n\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['Z', 'X', 'Y', 'W'], 'final');\n }\n\n ['@test sort correctly when multiple sorts are chained on the same instance of a class'](assert) {\n let obj2 = klass.extend({\n items: (0, _metal.computed)('sibling.sortedItems.[]', function () {\n return this.get('sibling.sortedItems');\n }),\n asdf: (0, _metal.observer)('sibling.sortedItems.[]', function () {\n this.get('sibling.sortedItems');\n })\n }).create({\n sibling: obj\n });\n\n /*\n ┌───────────┐ ┌────────────┐\n │sortedProps│ │sortedProps2│\n └───────────┘ └────────────┘\n ▲ ▲\n │ ╔═══════════╗ │\n │─ ─ ─ ─ ─ ─ ─ ▶║ CP (sort) ║◀─ ─ ─ ─ ─ ─ ─ ┤\n │ ╚═══════════╝ │\n │ │\n ┌───────────┐ ┏━━━━━━━━━━━┓ ┏━━━━━━━━━━━━┓\n │ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃\n │ items │◀── items.@each.count │◀──┃sortedItems┃◀─── items.@each.count │◀───┃sortedItems2┃\n │ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃\n └───────────┘ ┗━━━━━━━━━━━┛ ┗━━━━━━━━━━━━┛\n */\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'obj.sortedItems.name should be sorted alpha');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'obj2.sortedItems.name should be sorted alpha');\n\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj.sortedItems.name should now have changed');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj2.sortedItems.name should still mirror sortedItems2');\n\n obj.set('sortProps', ['thing']);\n obj2.set('sortProps', ['id']);\n\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'we now sort obj2 by id, so we expect a b c d');\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'we now sort obj by thing');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('max', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n max: (0, _computed.max)('items')\n }).create({\n items: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test max is readOnly'](assert) {\n assert.throws(function () {\n obj.set('max', 1);\n }, /Cannot set read-only property \"max\" on object:/);\n }\n\n ['@test max tracks the max number as objects are added'](assert) {\n assert.equal(obj.get('max'), 3, 'precond - max is initially correct');\n\n let items = obj.get('items');\n\n items.pushObject(5);\n\n assert.equal(obj.get('max'), 5, 'max updates when a larger number is added');\n\n items.pushObject(2);\n\n assert.equal(obj.get('max'), 5, 'max does not update when a smaller number is added');\n }\n\n ['@test max recomputes when the current max is removed'](assert) {\n assert.equal(obj.get('max'), 3, 'precond - max is initially correct');\n\n obj.get('items').removeObject(2);\n\n assert.equal(obj.get('max'), 3, 'max is unchanged when a non-max item is removed');\n\n obj.get('items').removeObject(3);\n\n assert.equal(obj.get('max'), 1, 'max is recomputed when the current max is removed');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('min', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n min: (0, _computed.min)('items')\n }).create({\n items: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test min is readOnly'](assert) {\n assert.throws(function () {\n obj.set('min', 1);\n }, /Cannot set read-only property \"min\" on object:/);\n }\n\n ['@test min tracks the min number as objects are added'](assert) {\n assert.equal(obj.get('min'), 1, 'precond - min is initially correct');\n\n obj.get('items').pushObject(-2);\n\n assert.equal(obj.get('min'), -2, 'min updates when a smaller number is added');\n\n obj.get('items').pushObject(2);\n\n assert.equal(obj.get('min'), -2, 'min does not update when a larger number is added');\n }\n\n ['@test min recomputes when the current min is removed'](assert) {\n let items = obj.get('items');\n\n assert.equal(obj.get('min'), 1, 'precond - min is initially correct');\n\n items.removeObject(2);\n\n assert.equal(obj.get('min'), 1, 'min is unchanged when a non-min item is removed');\n\n items.removeObject(1);\n\n assert.equal(obj.get('min'), 3, 'min is recomputed when the current min is removed');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.arrayComputed - mixed sugar', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n lannisters: (0, _computed.filterBy)('items', 'lname', 'Lannister'),\n lannisterSorting: (0, _runtime.A)(['fname']),\n sortedLannisters: (0, _computed.sort)('lannisters', 'lannisterSorting'),\n\n starks: (0, _computed.filterBy)('items', 'lname', 'Stark'),\n starkAges: (0, _computed.mapBy)('starks', 'age'),\n oldestStarkAge: (0, _computed.max)('starkAges')\n }).create({\n items: (0, _runtime.A)([{ fname: 'Jaime', lname: 'Lannister', age: 34 }, { fname: 'Cersei', lname: 'Lannister', age: 34 }, { fname: 'Robb', lname: 'Stark', age: 16 }, { fname: 'Bran', lname: 'Stark', age: 8 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filtering and sorting can be combined'](assert) {\n let items = obj.get('items');\n\n assert.deepEqual(obj.get('sortedLannisters').mapBy('fname'), ['Cersei', 'Jaime'], 'precond - array is initially filtered and sorted');\n\n items.pushObject({ fname: 'Tywin', lname: 'Lannister' });\n items.pushObject({ fname: 'Lyanna', lname: 'Stark' });\n items.pushObject({ fname: 'Gerion', lname: 'Lannister' });\n\n assert.deepEqual(obj.get('sortedLannisters').mapBy('fname'), ['Cersei', 'Gerion', 'Jaime', 'Tywin'], 'updates propagate to array');\n }\n\n ['@test filtering, sorting and reduce (max) can be combined'](assert) {\n let items = obj.get('items');\n\n assert.equal(16, obj.get('oldestStarkAge'), 'precond - end of chain is initially correct');\n\n items.pushObject({ fname: 'Rickon', lname: 'Stark', age: 5 });\n\n assert.equal(16, obj.get('oldestStarkAge'), 'chain is updated correctly');\n\n items.pushObject({ fname: 'Eddard', lname: 'Stark', age: 35 });\n\n assert.equal(35, obj.get('oldestStarkAge'), 'chain is updated correctly');\n }\n });\n\n function todo(name, priority) {\n return _runtime.Object.create({ name: name, priority: priority });\n }\n\n function priorityComparator(todoA, todoB) {\n let pa = parseInt((0, _metal.get)(todoA, 'priority'), 10);\n let pb = parseInt((0, _metal.get)(todoB, 'priority'), 10);\n\n return pa - pb;\n }\n\n function evenPriorities(todo) {\n let p = parseInt((0, _metal.get)(todo, 'priority'), 10);\n\n return p % 2 === 0;\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.arrayComputed - chains', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sorted: (0, _computed.sort)('todos.@each.priority', priorityComparator),\n filtered: (0, _computed.filter)('sorted.@each.priority', evenPriorities)\n }).create({\n todos: (0, _runtime.A)([todo('E', 4), todo('D', 3), todo('C', 2), todo('B', 1), todo('A', 0)])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test it can filter and sort when both depend on the same item property'](assert) {\n assert.deepEqual(obj.get('todos').mapBy('name'), ['E', 'D', 'C', 'B', 'A'], 'precond - todos initially correct');\n assert.deepEqual(obj.get('sorted').mapBy('name'), ['A', 'B', 'C', 'D', 'E'], 'precond - sorted initially correct');\n assert.deepEqual(obj.get('filtered').mapBy('name'), ['A', 'C', 'E'], 'precond - filtered initially correct');\n\n (0, _metal.set)(obj.get('todos')[1], 'priority', 6);\n\n assert.deepEqual(obj.get('todos').mapBy('name'), ['E', 'D', 'C', 'B', 'A'], 'precond - todos remain correct');\n assert.deepEqual(obj.get('sorted').mapBy('name'), ['A', 'B', 'C', 'E', 'D'], 'precond - sorted updated correctly');\n assert.deepEqual(obj.get('filtered').mapBy('name'), ['A', 'C', 'E', 'D'], 'filtered updated correctly');\n }\n });\n\n let userFnCalls;\n (0, _internalTestHelpers.moduleFor)('Chaining array and reduced CPs', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n userFnCalls = 0;\n obj = _runtime.Object.extend({\n mapped: (0, _computed.mapBy)('array', 'v'),\n max: (0, _computed.max)('mapped'),\n maxDidChange: (0, _metal.observer)('max', () => userFnCalls++)\n }).create({\n array: (0, _runtime.A)([{ v: 1 }, { v: 3 }, { v: 2 }, { v: 1 }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test it computes interdependent array computed properties'](assert) {\n assert.equal(obj.get('max'), 3, 'sanity - it properly computes the maximum value');\n\n let calls = 0;\n\n (0, _metal.addObserver)(obj, 'max', () => calls++);\n\n obj.get('array').pushObject({ v: 5 });\n\n assert.equal(obj.get('max'), 5, 'maximum value is updated correctly');\n assert.equal(userFnCalls, 1, 'object defined observers fire');\n assert.equal(calls, 1, 'runtime created observers fire');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('sum', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n total: (0, _computed.sum)('array')\n }).create({\n array: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sum is readOnly'](assert) {\n assert.throws(function () {\n obj.set('total', 1);\n }, /Cannot set read-only property \"total\" on object:/);\n }\n\n ['@test sums the values in the dependentKey'](assert) {\n assert.equal(obj.get('total'), 6, 'sums the values');\n }\n\n ['@test if the dependentKey is neither an array nor object, it will return `0`'](assert) {\n (0, _metal.set)(obj, 'array', null);\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n\n (0, _metal.set)(obj, 'array', undefined);\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n\n (0, _metal.set)(obj, 'array', 'not an array');\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n }\n\n ['@test updates when array is modified'](assert) {\n obj.get('array').pushObject(1);\n\n assert.equal(obj.get('total'), 7, 'recomputed when elements are added');\n\n obj.get('array').popObject();\n\n assert.equal(obj.get('total'), 6, 'recomputes when elements are removed');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('collect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works'](assert) {\n let obj = { one: 'foo', two: 'bar', three: null };\n (0, _metal.defineProperty)(obj, 'all', (0, _computed.collect)('one', 'two', 'three', 'four'));\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, null], 'have all of them');\n\n (0, _metal.set)(obj, 'four', true);\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, true], 'have all of them');\n\n let a = [];\n (0, _metal.set)(obj, 'one', 0);\n (0, _metal.set)(obj, 'three', a);\n\n assert.deepEqual((0, _metal.get)(obj, 'all'), [0, 'bar', a, true], 'have all of them');\n }\n });\n});","enifed('@ember/polyfills/tests/assign_test', ['@ember/polyfills', 'internal-test-helpers'], function (_polyfills, _internalTestHelpers) {\n 'use strict';\n\n class AssignTests extends _internalTestHelpers.AbstractTestCase {\n ['@test merging objects'](assert) {\n let trgt = { a: 1 };\n let src1 = { b: 2 };\n let src2 = { c: 3 };\n this.assign(trgt, src1, src2);\n\n assert.deepEqual(trgt, { a: 1, b: 2, c: 3 }, 'assign copies values from one or more source objects to a target object');\n assert.deepEqual(src1, { b: 2 }, 'assign does not change source object 1');\n assert.deepEqual(src2, { c: 3 }, 'assign does not change source object 2');\n }\n\n ['@test merging objects with same property'](assert) {\n let trgt = { a: 1, b: 1 };\n let src1 = { a: 2, b: 2 };\n let src2 = { a: 3 };\n this.assign(trgt, src1, src2);\n\n assert.deepEqual(trgt, { a: 3, b: 2 }, 'properties are overwritten by other objects that have the same properties later in the parameters order');\n }\n\n ['@test null'](assert) {\n let trgt = { a: 1 };\n this.assign(trgt, null);\n\n assert.deepEqual(trgt, { a: 1 }, 'null as a source parameter is ignored');\n }\n\n ['@test undefined'](assert) {\n let trgt = { a: 1 };\n this.assign(trgt, null);\n\n assert.deepEqual(trgt, { a: 1 }, 'undefined as a source parameter is ignored');\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.assign (polyfill)', class extends AssignTests {\n assign() {\n return (0, _polyfills.assignPolyfill)(...arguments);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.assign (maybe not-polyfill ;) )', class extends AssignTests {\n assign() {\n return (0, _polyfills.assign)(...arguments);\n }\n });\n});","enifed('@ember/polyfills/tests/merge_test', ['@ember/polyfills', 'internal-test-helpers'], function (_polyfills, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Ember.merge', class extends _internalTestHelpers.AbstractTestCase {\n ['@test merging objects'](assert) {\n let src1 = { a: 1 };\n let src2 = { b: 2 };\n expectDeprecation(() => {\n (0, _polyfills.merge)(src1, src2);\n }, 'Use of `merge` has been deprecated. Please use `assign` instead.');\n\n assert.deepEqual(src1, { a: 1, b: 2 }, 'merge copies values from second source object to first object');\n }\n });\n});","enifed('@ember/runloop/tests/debounce_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('debounce', class extends _internalTestHelpers.AbstractTestCase {\n ['@test debounce - with target, with method, without args'](assert) {\n let done = assert.async();\n\n let calledWith = [];\n let target = {\n someFunc(...args) {\n calledWith.push(args);\n }\n };\n\n (0, _runloop.debounce)(target, target.someFunc, 10);\n (0, _runloop.debounce)(target, target.someFunc, 10);\n (0, _runloop.debounce)(target, target.someFunc, 10);\n\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - with target, with method name, without args'](assert) {\n let done = assert.async();\n\n let calledWith = [];\n let target = {\n someFunc(...args) {\n calledWith.push(args);\n }\n };\n\n (0, _runloop.debounce)(target, 'someFunc', 10);\n (0, _runloop.debounce)(target, 'someFunc', 10);\n (0, _runloop.debounce)(target, 'someFunc', 10);\n\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - without target, without args'](assert) {\n let done = assert.async();\n\n let calledWith = [];\n function someFunc(...args) {\n calledWith.push(args);\n }\n\n (0, _runloop.debounce)(someFunc, 10);\n (0, _runloop.debounce)(someFunc, 10);\n (0, _runloop.debounce)(someFunc, 10);\n\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - without target, with args'](assert) {\n let done = assert.async();\n\n let calledWith = [];\n function someFunc(...args) {\n calledWith.push(args);\n }\n\n (0, _runloop.debounce)(someFunc, { isFoo: true }, 10);\n (0, _runloop.debounce)(someFunc, { isBar: true }, 10);\n (0, _runloop.debounce)(someFunc, { isBaz: true }, 10);\n\n setTimeout(() => {\n assert.deepEqual(calledWith, [[{ isBaz: true }]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n });\n});","enifed('@ember/runloop/tests/later_test', ['internal-test-helpers', '@ember/polyfills', '@ember/runloop'], function (_internalTestHelpers, _polyfills, _runloop) {\n 'use strict';\n\n const originalSetTimeout = window.setTimeout;\n const originalDateValueOf = Date.prototype.valueOf;\n const originalPlatform = _runloop.backburner._platform;\n\n function wait(callback, maxWaitCount = 100) {\n originalSetTimeout(() => {\n if (maxWaitCount > 0 && ((0, _runloop.hasScheduledTimers)() || (0, _runloop.getCurrentRunLoop)())) {\n wait(callback, maxWaitCount - 1);\n\n return;\n }\n\n callback();\n }, 10);\n }\n\n // Synchronous \"sleep\". This simulates work being done\n // after later was called but before the run loop\n // has flushed. In previous versions, this would have\n // caused the later callback to have run from\n // within the run loop flush, since by the time the\n // run loop has to flush, it would have considered\n // the timer already expired.\n function pauseUntil(time) {\n while (+new Date() < time) {\n /* do nothing - sleeping */\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('run.later', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n _runloop.backburner._platform = originalPlatform;\n window.setTimeout = originalSetTimeout;\n Date.prototype.valueOf = originalDateValueOf;\n }\n\n ['@test should invoke after specified period of time - function only'](assert) {\n let done = assert.async();\n let invoked = false;\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => invoked = true, 100);\n });\n\n wait(() => {\n assert.equal(invoked, true, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should invoke after specified period of time - target/method'](assert) {\n let done = assert.async();\n let obj = { invoked: false };\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function () {\n this.invoked = true;\n }, 100);\n });\n\n wait(() => {\n assert.equal(obj.invoked, true, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should invoke after specified period of time - target/method/args'](assert) {\n let done = assert.async();\n let obj = { invoked: 0 };\n\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n }, 10, 100);\n });\n\n wait(() => {\n assert.equal(obj.invoked, 10, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should always invoke within a separate runloop'](assert) {\n let done = assert.async();\n let obj = { invoked: 0 };\n let firstRunLoop, secondRunLoop;\n\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop.getCurrentRunLoop)();\n\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n secondRunLoop = (0, _runloop.getCurrentRunLoop)();\n }, 10, 1);\n\n pauseUntil(+new Date() + 100);\n });\n\n assert.ok(firstRunLoop, 'first run loop captured');\n assert.ok(!(0, _runloop.getCurrentRunLoop)(), \"shouldn't be in a run loop after flush\");\n assert.equal(obj.invoked, 0, \"shouldn't have invoked later item yet\");\n\n wait(() => {\n assert.equal(obj.invoked, 10, 'should have invoked later item');\n assert.ok(secondRunLoop, 'second run loop took place');\n assert.ok(secondRunLoop !== firstRunLoop, 'two different run loops took place');\n done();\n });\n }\n\n // Our current implementation doesn't allow us to correctly enforce this ordering.\n // We should probably implement a queue to provide this guarantee.\n // See https://github.com/emberjs/ember.js/issues/3526 for more information.\n\n // asyncTest('callback order', function() {\n // let array = [];\n // function fn(val) { array.push(val); }\n\n // run(function() {\n // later(this, fn, 4, 5);\n // later(this, fn, 1, 1);\n // later(this, fn, 5, 10);\n // later(this, fn, 2, 3);\n // later(this, fn, 3, 3);\n // });\n\n // deepEqual(array, []);\n\n // wait(function() {\n // QUnit.start();\n // deepEqual(array, [1,2,3,4,5], 'callbacks were called in expected order');\n // });\n // });\n\n // Out current implementation doesn't allow us to properly enforce what is tested here.\n // We should probably fix it, but it's not technically a bug right now.\n // See https://github.com/emberjs/ember.js/issues/3522 for more information.\n\n // asyncTest('callbacks coalesce into same run loop if expiring at the same time', function() {\n // let array = [];\n // function fn(val) { array.push(getCurrentRunLoop()); }\n\n // run(function() {\n\n // // Force +new Date to return the same result while scheduling\n // // later timers. Otherwise: non-determinism!\n // let now = +new Date();\n // Date.prototype.valueOf = function() { return now; };\n\n // later(this, fn, 10);\n // later(this, fn, 200);\n // later(this, fn, 200);\n\n // Date.prototype.valueOf = originalDateValueOf;\n // });\n\n // deepEqual(array, []);\n\n // wait(function() {\n // QUnit.start();\n // equal(array.length, 3, 'all callbacks called');\n // ok(array[0] !== array[1], 'first two callbacks have different run loops');\n // ok(array[0], 'first runloop present');\n // ok(array[1], 'second runloop present');\n // equal(array[1], array[2], 'last two callbacks got the same run loop');\n // });\n // });\n\n ['@test inception calls to later should run callbacks in separate run loops'](assert) {\n let done = assert.async();\n let runLoop, finished;\n\n (0, _runloop.run)(() => {\n runLoop = (0, _runloop.getCurrentRunLoop)();\n assert.ok(runLoop);\n\n (0, _runloop.later)(() => {\n assert.ok((0, _runloop.getCurrentRunLoop)() && (0, _runloop.getCurrentRunLoop)() !== runLoop, 'first later callback has own run loop');\n runLoop = (0, _runloop.getCurrentRunLoop)();\n\n (0, _runloop.later)(() => {\n assert.ok((0, _runloop.getCurrentRunLoop)() && (0, _runloop.getCurrentRunLoop)() !== runLoop, 'second later callback has own run loop');\n finished = true;\n }, 40);\n }, 40);\n });\n\n wait(() => {\n assert.ok(finished, 'all .later callbacks run');\n done();\n });\n }\n\n ['@test setTimeout should never run with a negative wait'](assert) {\n let done = assert.async();\n // Rationale: The old run loop code was susceptible to an occasional\n // bug where invokeLaterTimers would be scheduled with a setTimeout\n // with a negative wait. Modern browsers normalize this to 0, but\n // older browsers (IE <= 8) break with a negative wait, which\n // happens when an expired timer callback takes a while to run,\n // which is what we simulate here.\n let newSetTimeoutUsed;\n _runloop.backburner._platform = (0, _polyfills.assign)({}, originalPlatform, {\n setTimeout() {\n let wait = arguments[arguments.length - 1];\n newSetTimeoutUsed = true;\n assert.ok(!isNaN(wait) && wait >= 0, 'wait is a non-negative number');\n\n return originalPlatform.setTimeout.apply(originalPlatform, arguments);\n }\n });\n\n let count = 0;\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => {\n count++;\n\n // This will get run first. Waste some time.\n // This is intended to break invokeLaterTimers code by taking a\n // long enough time that other timers should technically expire. It's\n // fine that they're not called in this run loop; just need to\n // make sure that invokeLaterTimers doesn't end up scheduling\n // a negative setTimeout.\n pauseUntil(+new Date() + 60);\n }, 1);\n\n (0, _runloop.later)(() => {\n assert.equal(count, 1, 'callbacks called in order');\n }, 50);\n });\n\n wait(() => {\n assert.ok(newSetTimeoutUsed, 'stub setTimeout was used');\n done();\n });\n }\n });\n});","enifed('@ember/runloop/tests/next_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('run.next', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should invoke immediately on next timeout'](assert) {\n let done = assert.async();\n let invoked = false;\n\n (0, _runloop.run)(() => (0, _runloop.next)(() => invoked = true));\n\n assert.equal(invoked, false, 'should not have invoked yet');\n\n setTimeout(() => {\n assert.equal(invoked, true, 'should have invoked later item');\n done();\n }, 20);\n }\n\n ['@test callback should be called from within separate loop'](assert) {\n let done = assert.async();\n let firstRunLoop, secondRunLoop;\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop.getCurrentRunLoop)();\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop.getCurrentRunLoop)());\n });\n\n setTimeout(() => {\n assert.ok(secondRunLoop, 'callback was called from within run loop');\n assert.ok(firstRunLoop && secondRunLoop !== firstRunLoop, 'two separate run loops were invoked');\n done();\n }, 20);\n }\n\n ['@test multiple calls to next share coalesce callbacks into same run loop'](assert) {\n let done = assert.async();\n let secondRunLoop, thirdRunLoop;\n (0, _runloop.run)(() => {\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop.getCurrentRunLoop)());\n (0, _runloop.next)(() => thirdRunLoop = (0, _runloop.getCurrentRunLoop)());\n });\n\n setTimeout(() => {\n assert.ok(secondRunLoop && secondRunLoop === thirdRunLoop, 'callbacks coalesced into same run loop');\n done();\n }, 20);\n }\n });\n});","enifed('@ember/runloop/tests/once_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/once_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test calling invokeOnce more than once invokes only once'](assert) {\n let count = 0;\n (0, _runloop.run)(() => {\n function F() {\n count++;\n }\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n });\n\n assert.equal(count, 1, 'should have invoked once');\n }\n\n ['@test should differentiate based on target'](assert) {\n let A = { count: 0 };\n let B = { count: 0 };\n (0, _runloop.run)(() => {\n function F() {\n this.count++;\n }\n (0, _runloop.once)(A, F);\n (0, _runloop.once)(B, F);\n (0, _runloop.once)(A, F);\n (0, _runloop.once)(B, F);\n });\n\n assert.equal(A.count, 1, 'should have invoked once on A');\n assert.equal(B.count, 1, 'should have invoked once on B');\n }\n\n ['@test should ignore other arguments - replacing previous ones'](assert) {\n let A = { count: 0 };\n let B = { count: 0 };\n\n (0, _runloop.run)(() => {\n function F(amt) {\n this.count += amt;\n }\n (0, _runloop.once)(A, F, 10);\n (0, _runloop.once)(B, F, 20);\n (0, _runloop.once)(A, F, 30);\n (0, _runloop.once)(B, F, 40);\n });\n\n assert.equal(A.count, 30, 'should have invoked once on A');\n assert.equal(B.count, 40, 'should have invoked once on B');\n }\n\n ['@test should be inside of a runloop when running'](assert) {\n (0, _runloop.run)(() => {\n (0, _runloop.once)(() => assert.ok(!!(0, _runloop.getCurrentRunLoop)(), 'should have a runloop'));\n });\n }\n });\n});","enifed('@ember/runloop/tests/onerror_test', ['@ember/runloop', '@ember/-internals/error-handling', '@ember/debug', 'internal-test-helpers'], function (_runloop, _errorHandling, _debug, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/onerror_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test With Ember.onerror undefined, errors in run are thrown'](assert) {\n let thrown = new Error('Boom!');\n let original = (0, _errorHandling.getOnerror)();\n\n let caught;\n (0, _errorHandling.setOnerror)(undefined);\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } catch (error) {\n caught = error;\n } finally {\n (0, _errorHandling.setOnerror)(original);\n }\n\n assert.deepEqual(caught, thrown);\n }\n\n ['@test With Ember.onerror set, errors in run are caught'](assert) {\n let thrown = new Error('Boom!');\n let original = (0, _errorHandling.getOnerror)();\n let originalDispatchOverride = (0, _errorHandling.getDispatchOverride)();\n let originalIsTesting = (0, _debug.isTesting)();\n\n let caught;\n (0, _errorHandling.setOnerror)(error => {\n caught = error;\n });\n (0, _errorHandling.setDispatchOverride)(null);\n (0, _debug.setTesting)(false);\n\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } finally {\n (0, _errorHandling.setOnerror)(original);\n (0, _errorHandling.setDispatchOverride)(originalDispatchOverride);\n (0, _debug.setTesting)(originalIsTesting);\n }\n\n assert.deepEqual(caught, thrown);\n }\n });\n});","enifed('@ember/runloop/tests/run_bind_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/run_bind_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test bind builds a run-loop wrapped callback handler'](assert) {\n assert.expect(3);\n\n let obj = {\n value: 0,\n increment(increment) {\n assert.ok((0, _runloop.getCurrentRunLoop)(), 'expected a run-loop');\n return this.value += increment;\n }\n };\n\n let proxiedFunction = (0, _runloop.bind)(obj, obj.increment, 1);\n assert.equal(proxiedFunction(), 1);\n assert.equal(obj.value, 1);\n }\n\n ['@test bind keeps the async callback arguments'](assert) {\n assert.expect(4);\n\n function asyncCallback(increment, increment2, increment3) {\n assert.ok((0, _runloop.getCurrentRunLoop)(), 'expected a run-loop');\n assert.equal(increment, 1);\n assert.equal(increment2, 2);\n assert.equal(increment3, 3);\n }\n\n function asyncFunction(fn) {\n fn(2, 3);\n }\n\n asyncFunction((0, _runloop.bind)(asyncCallback, asyncCallback, 1));\n }\n\n ['@test [GH#16652] bind throws an error if callback is undefined']() {\n let assertBindThrows = (msg, ...args) => {\n expectAssertion(function () {\n (0, _runloop.bind)(...args);\n }, /could not find a suitable method to bind/, msg);\n };\n assertBindThrows('without arguments');\n assertBindThrows('with one arguments that is not a function', 'myMethod');\n assertBindThrows('if second parameter is not a function and not a property in first parameter', Object.create(null), 'myMethod');\n }\n });\n});","enifed('@ember/runloop/tests/run_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/run_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test run invokes passed function, returning value'](assert) {\n let obj = {\n foo() {\n return [this.bar, 'FOO'];\n },\n bar: 'BAR',\n checkArgs(arg1, arg2) {\n return [arg1, this.bar, arg2];\n }\n };\n\n assert.equal((0, _runloop.run)(() => 'FOO'), 'FOO', 'pass function only');\n assert.deepEqual((0, _runloop.run)(obj, obj.foo), ['BAR', 'FOO'], 'pass obj and obj.method');\n assert.deepEqual((0, _runloop.run)(obj, 'foo'), ['BAR', 'FOO'], 'pass obj and \"method\"');\n assert.deepEqual((0, _runloop.run)(obj, obj.checkArgs, 'hello', 'world'), ['hello', 'BAR', 'world'], 'pass obj, obj.method, and extra arguments');\n }\n });\n});","enifed('@ember/runloop/tests/schedule_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/schedule_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test scheduling item in queue should defer until finished'](assert) {\n let cnt = 0;\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n (0, _runloop.schedule)('actions', () => cnt++);\n assert.equal(cnt, 0, 'should not run action yet');\n });\n\n assert.equal(cnt, 2, 'should flush actions now');\n }\n\n ['@test a scheduled item can be canceled'](assert) {\n let hasRan = false;\n\n (0, _runloop.run)(() => {\n let cancelId = (0, _runloop.schedule)('actions', () => hasRan = true);\n (0, _runloop.cancel)(cancelId);\n });\n\n assert.notOk(hasRan, 'should not have ran callback run');\n }\n\n ['@test nested runs should queue each phase independently'](assert) {\n let cnt = 0;\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n assert.equal(cnt, 0, 'should not run action yet');\n\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n });\n assert.equal(cnt, 1, 'should not run action yet');\n });\n\n assert.equal(cnt, 2, 'should flush actions now');\n }\n\n ['@test prior queues should be flushed before moving on to next queue'](assert) {\n let order = [];\n\n (0, _runloop.run)(() => {\n let runLoop = (0, _runloop.getCurrentRunLoop)();\n assert.ok(runLoop, 'run loop present');\n\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', () => {\n order.push('sync');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\n\n (0, _runloop.schedule)('actions', () => {\n order.push('actions');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n\n (0, _runloop.schedule)('actions', () => {\n order.push('actions');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', () => {\n order.push('sync');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\n });\n\n (0, _runloop.schedule)('destroy', () => {\n order.push('destroy');\n assert.equal(runLoop, (0, _runloop.getCurrentRunLoop)(), 'same run loop used');\n });\n });\n\n assert.deepEqual(order, ['sync', 'actions', 'sync', 'actions', 'destroy']);\n }\n });\n});","enifed('@ember/runloop/tests/sync_test', ['@ember/runloop', 'internal-test-helpers'], function (_runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/sync_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test sync() will immediately flush the sync queue only'](assert) {\n let cnt = 0;\n\n (0, _runloop.run)(() => {\n function cntup() {\n cnt++;\n }\n\n function syncfunc() {\n if (++cnt < 5) {\n expectDeprecation(() => {\n (0, _runloop.schedule)('sync', syncfunc);\n }, `Scheduling into the 'sync' run loop queue is deprecated.`);\n }\n (0, _runloop.schedule)('actions', cntup);\n }\n\n syncfunc();\n\n assert.equal(cnt, 1, 'should not run action yet');\n });\n\n assert.equal(cnt, 10, 'should flush actions now too');\n }\n });\n});","enifed('@ember/runloop/tests/unwind_test', ['@ember/runloop', '@ember/error', 'internal-test-helpers'], function (_runloop, _error, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/unwind_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test RunLoop unwinds despite unhandled exception'](assert) {\n let initialRunLoop = (0, _runloop.getCurrentRunLoop)();\n\n assert.throws(() => {\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', function () {\n throw new _error.default('boom!');\n });\n });\n }, Error, 'boom!');\n\n // The real danger at this point is that calls to autorun will stick\n // tasks into the already-dead runloop, which will never get\n // flushed. I can't easily demonstrate this in a unit test because\n // autorun explicitly doesn't work in test mode. - ef4\n assert.equal((0, _runloop.getCurrentRunLoop)(), initialRunLoop, 'Previous run loop should be cleaned up despite exception');\n }\n\n ['@test run unwinds despite unhandled exception'](assert) {\n var initialRunLoop = (0, _runloop.getCurrentRunLoop)();\n\n assert.throws(() => {\n (0, _runloop.run)(function () {\n throw new _error.default('boom!');\n });\n }, _error.default, 'boom!');\n\n assert.equal((0, _runloop.getCurrentRunLoop)(), initialRunLoop, 'Previous run loop should be cleaned up despite exception');\n }\n });\n});","enifed('@ember/string/tests/camelize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.camelize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.camelize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.camelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.camelize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.camelize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String camelize tests'](assert) {\n test(assert, 'my favorite items', 'myFavoriteItems', 'camelize normal string');\n test(assert, 'I Love Ramen', 'iLoveRamen', 'camelize capitalized string');\n test(assert, 'css-class-name', 'cssClassName', 'camelize dasherized string');\n test(assert, 'action_name', 'actionName', 'camelize underscored string');\n test(assert, 'action.name', 'actionName', 'camelize dot notation string');\n test(assert, 'innerHTML', 'innerHTML', 'does nothing with camelcased string');\n test(assert, 'PrivateDocs/OwnerInvoice', 'privateDocs/ownerInvoice', 'camelize namespaced classified string');\n test(assert, 'private_docs/owner_invoice', 'privateDocs/ownerInvoice', 'camelize namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'privateDocs/ownerInvoice', 'camelize namespaced dasherized string');\n }\n });\n});","enifed('@ember/string/tests/capitalize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.capitalize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.capitalize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.capitalize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.capitalize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.capitalize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String capitalize tests'](assert) {\n test(assert, 'my favorite items', 'My favorite items', 'capitalize normal string');\n test(assert, 'css-class-name', 'Css-class-name', 'capitalize dasherized string');\n test(assert, 'action_name', 'Action_name', 'capitalize underscored string');\n test(assert, 'innerHTML', 'InnerHTML', 'capitalize camelcased string');\n test(assert, 'Capitalized string', 'Capitalized string', 'does nothing with capitalized string');\n test(assert, 'privateDocs/ownerInvoice', 'PrivateDocs/OwnerInvoice', 'capitalize namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'Private_docs/Owner_invoice', 'capitalize namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'Private-docs/Owner-invoice', 'capitalize namespaced dasherized string');\n test(assert, 'šabc', 'Šabc', 'capitalize string with accent character');\n }\n });\n});","enifed('@ember/string/tests/classify_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.classify)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.classify(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.classify', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.classify is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.classify, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String classify tests'](assert) {\n test(assert, 'my favorite items', 'MyFavoriteItems', 'classify normal string');\n test(assert, 'css-class-name', 'CssClassName', 'classify dasherized string');\n test(assert, 'action_name', 'ActionName', 'classify underscored string');\n test(assert, 'privateDocs/ownerInvoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced dasherized string');\n test(assert, '-view-registry', '_ViewRegistry', 'classify prefixed dasherized string');\n test(assert, 'components/-text-field', 'Components/_TextField', 'classify namespaced prefixed dasherized string');\n test(assert, '_Foo_Bar', '_FooBar', 'classify underscore-prefixed underscored string');\n test(assert, '_Foo-Bar', '_FooBar', 'classify underscore-prefixed dasherized string');\n test(assert, '_foo/_bar', '_Foo/_Bar', 'classify underscore-prefixed-namespaced underscore-prefixed string');\n test(assert, '-foo/_bar', '_Foo/_Bar', 'classify dash-prefixed-namespaced underscore-prefixed string');\n test(assert, '-foo/-bar', '_Foo/_Bar', 'classify dash-prefixed-namespaced dash-prefixed string');\n test(assert, 'InnerHTML', 'InnerHTML', 'does nothing with classified string');\n test(assert, '_FooBar', '_FooBar', 'does nothing with classified prefixed string');\n }\n });\n});","enifed('@ember/string/tests/dasherize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.dasherize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.dasherize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.dasherize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.dasherize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.dasherize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String dasherize tests'](assert) {\n test(assert, 'my favorite items', 'my-favorite-items', 'dasherize normal string');\n test(assert, 'css-class-name', 'css-class-name', 'does nothing with dasherized string');\n test(assert, 'action_name', 'action-name', 'dasherize underscored string');\n test(assert, 'innerHTML', 'inner-html', 'dasherize camelcased string');\n test(assert, 'toString', 'to-string', 'dasherize string that is the property name of Object.prototype');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private-docs/owner-invoice', 'dasherize namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private-docs/owner-invoice', 'dasherize namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'private-docs/owner-invoice', 'dasherize namespaced underscored string');\n }\n });\n});","enifed('@ember/string/tests/decamelize_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.decamelize)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.decamelize(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.decamelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.decamelize is not modified without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.decamelize, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String decamelize tests'](assert) {\n test(assert, 'my favorite items', 'my favorite items', 'does nothing with normal string');\n test(assert, 'css-class-name', 'css-class-name', 'does nothing with dasherized string');\n test(assert, 'action_name', 'action_name', 'does nothing with underscored string');\n test(assert, 'innerHTML', 'inner_html', 'converts a camelized string into all lower case separated by underscores.');\n test(assert, 'size160Url', 'size160_url', 'decamelizes strings with numbers');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private_docs/owner_invoice', 'decamelize namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private_docs/owner_invoice', 'decamelize namespaced camelized string');\n }\n });\n});","enifed('@ember/string/tests/loc_test', ['@ember/-internals/environment', '@ember/string', '@ember/string/lib/string_registry', 'internal-test-helpers'], function (_environment, _string, _string_registry, _internalTestHelpers) {\n 'use strict';\n\n let oldString;\n\n function test(assert, given, args, expected, description) {\n assert.equal((0, _string.loc)(given, args), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.loc(...args), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.loc', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n oldString = (0, _string_registry.getStrings)();\n (0, _string_registry.setStrings)({\n '_Hello World': 'Bonjour le monde',\n '_Hello %@': 'Bonjour %@',\n '_Hello %@ %@': 'Bonjour %@ %@',\n '_Hello %@# %@#': 'Bonjour %@2 %@1'\n });\n }\n\n afterEach() {\n (0, _string_registry.setStrings)(oldString);\n }\n\n ['@test String.prototype.loc is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.loc, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String loc tests'](assert) {\n test(assert, '_Hello World', [], 'Bonjour le monde', `loc('_Hello World') => 'Bonjour le monde'`);\n test(assert, '_Hello %@ %@', ['John', 'Doe'], 'Bonjour John Doe', `loc('_Hello %@ %@', ['John', 'Doe']) => 'Bonjour John Doe'`);\n test(assert, '_Hello %@# %@#', ['John', 'Doe'], 'Bonjour Doe John', `loc('_Hello %@# %@#', ['John', 'Doe']) => 'Bonjour Doe John'`);\n test(assert, '_Not In Strings', [], '_Not In Strings', `loc('_Not In Strings') => '_Not In Strings'`);\n }\n\n ['@test works with argument form'](assert) {\n assert.equal((0, _string.loc)('_Hello %@', 'John'), 'Bonjour John');\n assert.equal((0, _string.loc)('_Hello %@ %@', ['John'], 'Doe'), 'Bonjour John Doe');\n }\n });\n});","enifed('@ember/string/tests/underscore_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.underscore)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.underscore(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.underscore', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.underscore is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.underscore, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String underscore tests'](assert) {\n test(assert, 'my favorite items', 'my_favorite_items', 'with normal string');\n test(assert, 'css-class-name', 'css_class_name', 'with dasherized string');\n test(assert, 'action_name', 'action_name', 'does nothing with underscored string');\n test(assert, 'innerHTML', 'inner_html', 'with camelcased string');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private_docs/owner_invoice', 'underscore namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private_docs/owner_invoice', 'underscore namespaced camelized string');\n test(assert, 'private-docs/owner-invoice', 'private_docs/owner_invoice', 'underscore namespaced dasherized string');\n }\n });\n});","enifed('@ember/string/tests/w_test', ['@ember/-internals/environment', '@ember/string', 'internal-test-helpers'], function (_environment, _string, _internalTestHelpers) {\n 'use strict';\n\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.w)(given), expected, description);\n if (_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.deepEqual(given.w(), expected, description);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.w', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String.prototype.w is not available without EXTEND_PROTOTYPES'](assert) {\n if (!_environment.ENV.EXTEND_PROTOTYPES.String) {\n assert.ok('undefined' === typeof String.prototype.w, 'String.prototype helper disabled');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test String w tests'](assert) {\n test(assert, 'one two three', ['one', 'two', 'three'], `w('one two three') => ['one','two','three']`);\n test(assert, 'one two three', ['one', 'two', 'three'], `w('one two three') with extra spaces between words => ['one','two','three']`);\n test(assert, 'one\\ttwo three', ['one', 'two', 'three'], `w('one two three') with tabs`);\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/assert-if-helper-without-arguments-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-if-helper-without-argument', class extends _internalTestHelpers.AbstractTestCase {\n [`@test block if helper expects one argument`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{#if}}aVal{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `#if requires a single argument. ('baz/foo-bar' @ L1:C0) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if val1 val2}}aVal{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `#if requires a single argument. ('baz/foo-bar' @ L1:C0) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if}}aVal{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `#if requires a single argument. ('baz/foo-bar' @ L1:C0) `);\n }\n\n [`@test inline if helper expects between one and three arguments`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `The inline form of the 'if' helper expects two or three arguments. ('baz/foo-bar' @ L1:C0) `);\n\n (0, _index.compile)(`{{if foo bar baz}}`, {\n moduleName: 'baz/foo-bar'\n });\n }\n\n ['@test subexpression if helper expects between one and three arguments']() {\n expectAssertion(() => {\n (0, _index.compile)(`{{input foo=(if)}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `The inline form of the 'if' helper expects two or three arguments. ('baz/foo-bar' @ L1:C12) `);\n\n (0, _index.compile)(`{{some-thing foo=(if foo bar baz)}}`, {\n moduleName: 'baz/foo-bar'\n });\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/assert-input-helper-without-block-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-input-helper-without-block', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Using {{#input}}{{/input}} is not valid']() {\n let expectedMessage = `The {{input}} helper cannot be used in block form. ('baz/foo-bar' @ L1:C0) `;\n\n expectAssertion(() => {\n (0, _index.compile)('{{#input value=\"123\"}}Completely invalid{{/input}}', {\n moduleName: 'baz/foo-bar'\n });\n }, expectedMessage);\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/assert-local-variable-shadowing-helper-invocation-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-local-variable-shadowing-helper-invocation', class extends _internalTestHelpers.AbstractTestCase {\n [`@test block statements shadowing sub-expression invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n {{concat (foo)}}\n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C21) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n {{concat (foo bar baz)}}\n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C21) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}{{/let}}\n {{concat (foo)}}\n {{concat (foo bar baz)}}`, { moduleName: 'baz/foo-bar' });\n\n // Not an invocation\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n {{concat foo}}\n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test element nodes shadowing sub-expression invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n \n {{concat (foo)}}\n `, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C21) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n \n {{concat (foo bar baz)}}\n `, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C21) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n \n {{concat (foo)}}\n {{concat (foo bar baz)}}`, { moduleName: 'baz/foo-bar' });\n\n // Not an invocation\n\n (0, _index.compile)(`\n \n {{concat foo}}\n `, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test deeply nested sub-expression invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{concat (foo)}}\n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L5:C25) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{concat (foo bar baz)}}\n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` helper because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L5:C25) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{/each}}\n {{concat (baz)}}\n {{concat (baz bat)}}\n \n {{concat (bar)}}\n {{concat (bar baz bat)}}\n {{/let}}\n {{concat (foo)}}\n {{concat (foo bar baz bat)}}`, { moduleName: 'baz/foo-bar' });\n\n // Not an invocation\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{concat foo}}\n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test block statements shadowing mustache invocations`](assert) {\n // These are fine, because they should already be considered contextual\n // component invocations, not helper invocations\n assert.expect(0);\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n {{foo}}\n {{/let}}`, { moduleName: 'baz/foo-bar' });\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n {{foo bar baz}}\n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test element nodes shadowing mustache invocations`](assert) {\n // These are fine, because they should already be considered contextual\n // component invocations, not helper invocations\n assert.expect(0);\n\n (0, _index.compile)(`\n \n {{foo}}\n `, { moduleName: 'baz/foo-bar' });\n\n (0, _index.compile)(`\n \n {{foo bar baz}}\n `, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test deeply nested mustache invocations`](assert) {\n // These are fine, because they should already be considered contextual\n // component invocations, not helper invocations\n assert.expect(0);\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{foo}}\n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{foo bar baz}}\n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test block statements shadowing modifier invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n
    \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C17) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n
    \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C17) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}{{/let}}\n
    \n
    `, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test element nodes shadowing modifier invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n \n
    \n `, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C17) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n \n
    \n `, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L3:C17) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n \n
    \n
    `, { moduleName: 'baz/foo-bar' });\n }\n\n [`@test deeply nested modifier invocations`]() {\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n
    \n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L5:C21) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n
    \n {{/each}}\n \n {{/let}}`, { moduleName: 'baz/foo-bar' });\n }, `Cannot invoke the \\`foo\\` modifier because it was shadowed by a local variable (i.e. a block param) with the same name. Please rename the local variable to resolve the conflict. ('baz/foo-bar' @ L5:C21) `);\n\n // Not shadowed\n\n (0, _index.compile)(`\n {{#let foo as |foo|}}\n \n {{#each items as |baz|}}\n {{/each}}\n
    \n
    \n \n
    \n
    \n {{/let}}\n
    \n
    `, { moduleName: 'baz/foo-bar' });\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n if (true /* EMBER_GLIMMER_NAMED_ARGUMENTS */) {\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-reserved-named-arguments (EMBER_GLIMMER_NAMED_ARGUMENTS) ', class extends _internalTestHelpers.AbstractTestCase {\n [`@test '@arguments' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@arguments}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @arguments}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @arguments \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@args' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@args}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @args}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @args \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@block' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@block}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @block}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @block \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@else' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@else}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @else}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @else \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n // anything else that doesn't start with a lower case letter\n [`@test '@Arguments' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Arguments}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Arguments}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Arguments \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@Args' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Args}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Args}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Args \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@FOO' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@FOO}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @FOO}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @FOO \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@Foo' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Foo}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Foo}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Foo \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@.' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@.}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@.' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @.}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@.' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @. \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@.' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@_' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@_}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @_}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @_ \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@-' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@-}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @-}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @- \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@$' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@$}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @$}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @$ \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @ \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@0' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@0}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @0}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @0 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@1' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@1}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @1}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @1 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@2' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@2}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @2}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @2 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@@' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@@}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @@}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @@ \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@=' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@=}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @=}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @= \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@!' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@!}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{#if @!}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @! \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n });\n } else {\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-reserved-named-arguments', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Paths beginning with @ are not valid']() {\n expectAssertion(() => {\n (0, _index.compile)('{{@foo}}', {\n moduleName: 'baz/foo-bar'\n });\n }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C2) `);\n\n expectAssertion(() => {\n (0, _index.compile)('{{#if @foo}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C6) `);\n\n expectAssertion(() => {\n (0, _index.compile)('{{input type=(if @foo \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C17) `);\n }\n });\n }\n});","enifed('ember-template-compiler/tests/plugins/assert-splattribute-expression-test', ['internal-test-helpers', 'ember-template-compiler/index'], function (_internalTestHelpers, _index) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-splattribute-expression', class extends _internalTestHelpers.AbstractTestCase {\n expectedMessage(locInfo) {\n return true /* EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION */ ? `Using \"...attributes\" can only be used in the element position e.g.
    . It cannot be used as a path. (${locInfo}) ` : `...attributes is an invalid path (${locInfo}) `;\n }\n\n '@test ...attributes is in element space'(assert) {\n if (true /* EMBER_GLIMMER_ANGLE_BRACKET_INVOCATION */) {\n assert.expect(0);\n\n (0, _index.compile)('
    Foo
    ');\n } else {\n expectAssertion(() => {\n (0, _index.compile)('
    Foo
    ');\n }, this.expectedMessage('L1:C5'));\n }\n }\n\n '@test {{...attributes}} is not valid'() {\n expectAssertion(() => {\n (0, _index.compile)('
    {{...attributes}}
    ', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n\n '@test {{...attributes}} is not valid path expression'() {\n expectAssertion(() => {\n (0, _index.compile)('
    {{...attributes}}
    ', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n '@test {{...attributes}} is not valid modifier'() {\n expectAssertion(() => {\n (0, _index.compile)('
    Wat
    ', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n\n '@test {{...attributes}} is not valid attribute'() {\n expectAssertion(() => {\n (0, _index.compile)('
    Wat
    ', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C13`));\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/deprecate-send-action-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n const EVENTS = ['insert-newline', 'enter', 'escape-press', 'focus-in', 'focus-out', 'key-press', 'key-up', 'key-down'];\n\n class DeprecateSendActionTest extends _internalTestHelpers.AbstractTestCase {}\n\n EVENTS.forEach(function (e) {\n DeprecateSendActionTest.prototype[`@test Using \\`{{input ${e}=\"actionName\"}}\\` provides a deprecation`] = function () {\n let expectedMessage = `Please refactor \\`{{input ${e}=\"foo-bar\"}}\\` to \\`{{input ${e}=(action \"foo-bar\")}}\\. ('baz/foo-bar' @ L1:C0) `;\n\n expectDeprecation(() => {\n (0, _index.compile)(`{{input ${e}=\"foo-bar\"}}`, { moduleName: 'baz/foo-bar' });\n }, expectedMessage);\n };\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: deprecate-send-action', DeprecateSendActionTest);\n});","enifed('ember-template-compiler/tests/plugins/transform-component-invocation-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: transforms component invocation', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Does not throw a compiler error for component invocations'](assert) {\n assert.expect(0);\n\n ['{{this.modal open}}', '{{this.modal isOpen=true}}', '{{#this.modal}}Woot{{/this.modal}}', '{{@modal open}}', // RFC#311\n '{{@modal isOpen=true}}', // RFC#311\n '{{#@modal}}Woot{{/@modal}}', // RFC#311\n '{{c.modal open}}', '{{c.modal isOpen=true}}', '{{#c.modal}}Woot{{/c.modal}}', '{{#my-component as |c|}}{{c name=\"Chad\"}}{{/my-component}}', // RFC#311\n '{{#my-component as |c|}}{{c \"Chad\"}}{{/my-component}}', // RFC#311\n '{{#my-component as |c|}}{{#c}}{{/c}}{{/my-component}}', // RFC#311\n '', // GH#15740\n ''].forEach((layout, i) => {\n (0, _index.compile)(layout, { moduleName: `example-${i}` });\n });\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/transform-inline-link-to-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: inline-link-to', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Can transform an inline {{link-to}} without error'](assert) {\n assert.expect(0);\n\n (0, _index.compile)(`{{link-to 'foo' 'index'}}`, {\n moduleName: 'foo/bar/baz'\n });\n }\n });\n});","enifed('ember-template-compiler/tests/plugins/transform-input-type-syntax-test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: input type syntax', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Can compile an {{input}} helper that has a sub-expression value as its type'](assert) {\n assert.expect(0);\n\n (0, _index.compile)(`{{input type=(if true 'password' 'text')}}`);\n }\n\n ['@test Can compile an {{input}} helper with a string literal type'](assert) {\n assert.expect(0);\n\n (0, _index.compile)(`{{input type='text'}}`);\n }\n\n ['@test Can compile an {{input}} helper with a type stored in a var'](assert) {\n assert.expect(0);\n\n (0, _index.compile)(`{{input type=_type}}`);\n }\n });\n});","enifed('ember-template-compiler/tests/system/bootstrap-test', ['@ember/runloop', '@ember/-internals/glimmer', 'ember-template-compiler/lib/system/bootstrap', 'internal-test-helpers'], function (_runloop, _glimmer, _bootstrap, _internalTestHelpers) {\n 'use strict';\n\n let component, fixture;\n\n function checkTemplate(templateName, assert) {\n (0, _runloop.run)(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }));\n\n let template = (0, _glimmer.getTemplate)(templateName);\n let qunitFixture = document.querySelector('#qunit-fixture');\n\n assert.ok(template, 'template is available on Ember.TEMPLATES');\n assert.notOk(qunitFixture.querySelector('script'), 'script removed');\n\n let owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('template:-top-level', template);\n owner.register('component:-top-level', _glimmer.Component.extend({\n layoutName: '-top-level',\n firstName: 'Tobias',\n drug: 'teamocil'\n }));\n\n component = owner.lookup('component:-top-level');\n (0, _internalTestHelpers.runAppend)(component);\n\n assert.equal(qunitFixture.textContent.trim(), 'Tobias takes teamocil', 'template works');\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-templates: bootstrap', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n\n fixture = document.getElementById('qunit-fixture');\n }\n\n teardown() {\n (0, _glimmer.setTemplates)({});\n fixture = component = null;\n }\n\n ['@test template with data-template-name should add a new template to Ember.TEMPLATES'](assert) {\n fixture.innerHTML = '';\n\n checkTemplate('funkyTemplate', assert);\n }\n\n ['@test template with id instead of data-template-name should add a new template to Ember.TEMPLATES'](assert) {\n fixture.innerHTML = '';\n\n checkTemplate('funkyTemplate', assert);\n }\n\n ['@test template without data-template-name or id should default to application'](assert) {\n fixture.innerHTML = '';\n\n checkTemplate('application', assert);\n }\n\n // Add this test case, only for typeof Handlebars === 'object';\n [`${typeof Handlebars === 'object' ? '@test' : '@skip'} template with type text/x-raw-handlebars should be parsed`](assert) {\n fixture.innerHTML = '';\n\n (0, _runloop.run)(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }));\n\n let template = (0, _glimmer.getTemplate)('funkyTemplate');\n\n assert.ok(template, 'template with name funkyTemplate available');\n\n // This won't even work with Ember templates\n assert.equal(template({ name: 'Tobias' }).trim(), 'Tobias');\n }\n\n ['@test duplicated default application templates should throw exception'](assert) {\n fixture.innerHTML = '';\n\n assert.throws(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test default default application template and id application template present should throw exception'](assert) {\n fixture.innerHTML = '';\n\n assert.throws(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test default application template and data-template-name application template present should throw exception'](assert) {\n fixture.innerHTML = '';\n\n assert.throws(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test duplicated template id should throw exception'](assert) {\n fixture.innerHTML = '';\n\n assert.throws(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test duplicated template data-template-name should throw exception'](assert) {\n fixture.innerHTML = '';\n\n assert.throws(() => (0, _bootstrap.default)({ context: fixture, hasTemplate: _glimmer.hasTemplate, setTemplate: _glimmer.setTemplate }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n });\n});","enifed('ember-template-compiler/tests/system/compile_options_test', ['ember-template-compiler/index', 'internal-test-helpers'], function (_index, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: default compile options', class extends _internalTestHelpers.AbstractTestCase {\n ['@test default options are a new copy'](assert) {\n assert.notEqual((0, _index.compileOptions)(), (0, _index.compileOptions)());\n }\n\n ['@test has default AST plugins'](assert) {\n assert.expect(_index.defaultPlugins.length);\n\n let plugins = (0, _index.compileOptions)().plugins.ast;\n\n for (let i = 0; i < _index.defaultPlugins.length; i++) {\n let plugin = _index.defaultPlugins[i];\n assert.ok(plugins.indexOf(plugin) > -1, `includes ${plugin}`);\n }\n }\n });\n\n let customTransformCounter = 0;\n class CustomTransform {\n constructor(options) {\n customTransformCounter++;\n this.options = options;\n this.syntax = null;\n }\n\n transform(ast) {\n let walker = new this.syntax.Walker();\n\n walker.visit(ast, node => {\n if (node.type !== 'ElementNode') {\n return;\n }\n\n for (var i = 0; i < node.attributes.length; i++) {\n let attribute = node.attributes[i];\n\n if (attribute.name === 'data-test') {\n node.attributes.splice(i, 1);\n }\n }\n });\n\n return ast;\n }\n }\n\n class CustomPluginsTests extends _internalTestHelpers.RenderingTestCase {\n afterEach() {\n customTransformCounter = 0;\n return super.afterEach();\n }\n\n ['@test custom plugins can be used']() {\n this.render('
    ');\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: { class: 'hahaha', 'data-blah': 'derp' },\n content: ''\n });\n }\n\n ['@test wrapped plugins are only invoked once per template'](assert) {\n this.render('
    {{#if falsey}}nope{{/if}}
    ');\n assert.equal(customTransformCounter, 1, 'transform should only be instantiated once');\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: registerPlugin with a custom plugins', class extends CustomPluginsTests {\n beforeEach() {\n (0, _index.registerPlugin)('ast', CustomTransform);\n }\n\n afterEach() {\n (0, _index.unregisterPlugin)('ast', CustomTransform);\n return super.afterEach();\n }\n\n ['@test custom registered plugins are deduplicated'](assert) {\n (0, _index.registerPlugin)('ast', CustomTransform);\n this.registerTemplate('application', '
    ');\n assert.equal(customTransformCounter, 1, 'transform should only be instantiated once');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: custom plugins passed to compile', class extends _internalTestHelpers.RenderingTestCase {\n // override so that we can provide custom AST plugins to compile\n compile(templateString) {\n return (0, _index.compile)(templateString, {\n plugins: {\n ast: [CustomTransform]\n }\n });\n }\n });\n});","enifed('ember-template-compiler/tests/system/dasherize-component-name-test', ['ember-template-compiler/lib/system/dasherize-component-name', 'internal-test-helpers'], function (_dasherizeComponentName, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('dasherize-component-name', class extends _internalTestHelpers.AbstractTestCase {\n ['@test names are correctly dasherized'](assert) {\n assert.equal(_dasherizeComponentName.default.get('Foo'), 'foo');\n assert.equal(_dasherizeComponentName.default.get('foo-bar'), 'foo-bar');\n assert.equal(_dasherizeComponentName.default.get('FooBar'), 'foo-bar');\n assert.equal(_dasherizeComponentName.default.get('XBlah'), 'x-blah');\n assert.equal(_dasherizeComponentName.default.get('X-Blah'), 'x-blah');\n assert.equal(_dasherizeComponentName.default.get('Foo::BarBaz'), 'foo::bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo::Bar-Baz'), 'foo::bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo@BarBaz'), 'foo@bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo@Bar-Baz'), 'foo@bar-baz');\n }\n });\n});","enifed('ember-testing/tests/acceptance_test', ['internal-test-helpers', '@ember/runloop', 'ember-testing/lib/test', 'ember-testing/lib/adapters/qunit', '@ember/-internals/routing', '@ember/-internals/runtime', '@ember/-internals/views', '@ember/debug'], function (_internalTestHelpers, _runloop, _test, _qunit, _routing, _runtime, _views, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n\n var originalConsoleError = console.error; // eslint-disable-line no-console\n let testContext;\n\n if (!_views.jQueryDisabled) {\n (0, _internalTestHelpers.moduleFor)('ember-testing Acceptance', class extends _internalTestHelpers.AutobootApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', function () {});\n super();\n this._originalAdapter = _test.default.adapter;\n\n testContext = this;\n\n this.runTask(() => {\n this.createApplication();\n this.router.map(function () {\n this.route('posts');\n this.route('comments');\n\n this.route('abort_transition');\n\n this.route('redirect');\n });\n\n this.indexHitCount = 0;\n this.currentRoute = 'index';\n\n this.add('route:index', _routing.Route.extend({\n model() {\n testContext.indexHitCount += 1;\n }\n }));\n\n this.add('route:posts', _routing.Route.extend({\n renderTemplate() {\n testContext.currentRoute = 'posts';\n this._super(...arguments);\n }\n }));\n\n this.addTemplate('posts', `\n
    \n \n
    \n {{#link-to \\'comments\\'}}Comments{{/link-to}}\n
    \n
    \n `);\n\n this.add('route:comments', _routing.Route.extend({\n renderTemplate() {\n testContext.currentRoute = 'comments';\n this._super(...arguments);\n }\n }));\n\n this.addTemplate('comments', `
    {{input type=\"text\"}}
    `);\n\n this.add('route:abort_transition', _routing.Route.extend({\n beforeModel(transition) {\n transition.abort();\n }\n }));\n\n this.add('route:redirect', _routing.Route.extend({\n beforeModel() {\n this.transitionTo('comments');\n }\n }));\n\n this.application.setupForTesting();\n\n _test.default.registerAsyncHelper('slowHelper', () => {\n return new _runtime.RSVP.Promise(resolve => (0, _runloop.later)(resolve, 10));\n });\n\n this.application.injectTestHelpers();\n });\n }\n afterEach() {\n console.error = originalConsoleError; // eslint-disable-line no-console\n super.afterEach();\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n _test.default.adapter = this._originalAdapter;\n _test.default.unregisterHelper('slowHelper');\n window.slowHelper = undefined;\n testContext = undefined;\n super.teardown();\n }\n\n [`@test helpers can be chained with then`](assert) {\n assert.expect(6);\n\n window.visit('/posts').then(() => {\n assert.equal(this.currentRoute, 'posts', 'Successfully visited posts route');\n assert.equal(window.currentURL(), '/posts', 'posts URL is correct');\n return window.click('a:contains(\"Comments\")');\n }).then(() => {\n assert.equal(this.currentRoute, 'comments', 'visit chained with click');\n return window.fillIn('.ember-text-field', 'yeah');\n }).then(() => {\n assert.equal(document.querySelector('.ember-text-field').value, 'yeah', 'chained with fillIn');\n return window.fillIn('.ember-text-field', '#qunit-fixture', 'context working');\n }).then(() => {\n assert.equal(document.querySelector('.ember-text-field').value, 'context working', 'chained with fillIn');\n return window.click('.does-not-exist');\n }).catch(e => {\n assert.equal(e.message, 'Element .does-not-exist not found.', 'Non-existent click exception caught');\n });\n }\n\n [`@test helpers can be chained to each other (legacy)`](assert) {\n assert.expect(7);\n\n window.visit('/posts').click('a:first', '#comments-link').fillIn('.ember-text-field', 'hello').then(() => {\n assert.equal(this.currentRoute, 'comments', 'Successfully visited comments route');\n assert.equal(window.currentURL(), '/comments', 'Comments URL is correct');\n assert.equal(document.querySelector('.ember-text-field').value, 'hello', 'Fillin successfully works');\n window.find('.ember-text-field').one('keypress', e => {\n assert.equal(e.keyCode, 13, 'keyevent chained with correct keyCode.');\n assert.equal(e.which, 13, 'keyevent chained with correct which.');\n });\n }).keyEvent('.ember-text-field', 'keypress', 13).visit('/posts').then(() => {\n assert.equal(this.currentRoute, 'posts', 'Thens can also be chained to helpers');\n assert.equal(window.currentURL(), '/posts', 'URL is set correct on chained helpers');\n });\n }\n\n [`@test helpers don't need to be chained`](assert) {\n assert.expect(5);\n\n window.visit('/posts');\n\n window.click('a:first', '#comments-link');\n\n window.fillIn('.ember-text-field', 'hello');\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'comments', 'Successfully visited comments route');\n assert.equal(window.currentURL(), '/comments', 'Comments URL is correct');\n assert.equal(window.find('.ember-text-field').val(), 'hello', 'Fillin successfully works');\n });\n\n window.visit('/posts');\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'posts');\n assert.equal(window.currentURL(), '/posts');\n });\n }\n\n [`@test Nested async helpers`](assert) {\n assert.expect(5);\n\n window.visit('/posts');\n\n window.andThen(() => {\n window.click('a:first', '#comments-link');\n window.fillIn('.ember-text-field', 'hello');\n });\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'comments', 'Successfully visited comments route');\n assert.equal(window.currentURL(), '/comments', 'Comments URL is correct');\n assert.equal(window.find('.ember-text-field').val(), 'hello', 'Fillin successfully works');\n });\n\n window.visit('/posts');\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'posts');\n assert.equal(window.currentURL(), '/posts');\n });\n }\n\n [`@test Multiple nested async helpers`](assert) {\n assert.expect(3);\n\n window.visit('/posts');\n\n window.andThen(() => {\n window.click('a:first', '#comments-link');\n\n window.fillIn('.ember-text-field', 'hello');\n window.fillIn('.ember-text-field', 'goodbye');\n });\n\n window.andThen(() => {\n assert.equal(window.find('.ember-text-field').val(), 'goodbye', 'Fillin successfully works');\n assert.equal(this.currentRoute, 'comments', 'Successfully visited comments route');\n assert.equal(window.currentURL(), '/comments', 'Comments URL is correct');\n });\n }\n\n [`@test Helpers nested in thens`](assert) {\n assert.expect(5);\n\n window.visit('/posts').then(() => {\n window.click('a:first', '#comments-link');\n });\n\n window.andThen(() => {\n window.fillIn('.ember-text-field', 'hello');\n });\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'comments', 'Successfully visited comments route');\n assert.equal(window.currentURL(), '/comments', 'Comments URL is correct');\n assert.equal(window.find('.ember-text-field').val(), 'hello', 'Fillin successfully works');\n });\n\n window.visit('/posts');\n\n window.andThen(() => {\n assert.equal(this.currentRoute, 'posts');\n assert.equal(window.currentURL(), '/posts', 'Posts URL is correct');\n });\n }\n\n [`@test Aborted transitions are not logged via Ember.Test.adapter#exception`](assert) {\n assert.expect(0);\n\n _test.default.adapter = _qunit.default.create({\n exception() {\n assert.ok(false, 'aborted transitions are not logged');\n }\n });\n\n window.visit('/abort_transition');\n }\n\n [`@test Unhandled exceptions are logged via Ember.Test.adapter#exception`](assert) {\n assert.expect(2);\n\n console.error = () => {}; // eslint-disable-line no-console\n let asyncHandled;\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.equal(error.message, 'Element .does-not-exist not found.', 'Exception successfully caught and passed to Ember.Test.adapter.exception');\n // handle the rejection so it doesn't leak later.\n asyncHandled.catch(() => {});\n }\n });\n\n window.visit('/posts');\n\n window.click('.invalid-element').catch(error => {\n assert.equal(error.message, 'Element .invalid-element not found.', 'Exception successfully handled in the rejection handler');\n });\n\n asyncHandled = window.click('.does-not-exist');\n }\n\n [`@test Unhandled exceptions in 'andThen' are logged via Ember.Test.adapter#exception`](assert) {\n assert.expect(1);\n\n console.error = () => {}; // eslint-disable-line no-console\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.equal(error.message, 'Catch me', 'Exception successfully caught and passed to Ember.Test.adapter.exception');\n }\n });\n\n window.visit('/posts');\n\n window.andThen(() => {\n throw new Error('Catch me');\n });\n }\n\n [`@test should not start routing on the root URL when visiting another`](assert) {\n assert.expect(4);\n\n window.visit('/posts');\n\n window.andThen(() => {\n assert.ok(window.find('#comments-link'), 'found comments-link');\n assert.equal(this.currentRoute, 'posts', 'Successfully visited posts route');\n assert.equal(window.currentURL(), '/posts', 'Posts URL is correct');\n assert.equal(this.indexHitCount, 0, 'should not hit index route when visiting another route');\n });\n }\n\n [`@test only enters the index route once when visiting `](assert) {\n assert.expect(1);\n\n window.visit('/');\n\n window.andThen(() => {\n assert.equal(this.indexHitCount, 1, 'should hit index once when visiting /');\n });\n }\n\n [`@test test must not finish while asyncHelpers are pending`](assert) {\n assert.expect(2);\n\n let async = 0;\n let innerRan = false;\n\n _test.default.adapter = _qunit.default.extend({\n asyncStart() {\n async++;\n this._super();\n },\n asyncEnd() {\n async--;\n this._super();\n }\n }).create();\n\n this.application.testHelpers.slowHelper();\n\n window.andThen(() => {\n innerRan = true;\n });\n\n assert.equal(innerRan, false, 'should not have run yet');\n assert.ok(async > 0, 'should have told the adapter to pause');\n\n if (async === 0) {\n // If we failed the test, prevent zalgo from escaping and breaking\n // our other tests.\n _test.default.adapter.asyncStart();\n _test.default.resolve().then(() => {\n _test.default.adapter.asyncEnd();\n });\n }\n }\n\n [`@test visiting a URL that causes another transition should yield the correct URL`](assert) {\n assert.expect(1);\n\n window.visit('/redirect');\n\n window.andThen(() => {\n assert.equal(window.currentURL(), '/comments', 'Redirected to Comments URL');\n });\n }\n\n [`@test visiting a URL and then visiting a second URL with a transition should yield the correct URL`](assert) {\n assert.expect(2);\n\n window.visit('/posts');\n\n window.andThen(function () {\n assert.equal(window.currentURL(), '/posts', 'First visited URL is correct');\n });\n\n window.visit('/redirect');\n\n window.andThen(() => {\n assert.equal(window.currentURL(), '/comments', 'Redirected to Comments URL');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing Acceptance - teardown', class extends _internalTestHelpers.AutobootApplicationTestCase {\n [`@test that the setup/teardown happens correctly`](assert) {\n assert.expect(2);\n\n this.runTask(() => {\n this.createApplication();\n });\n this.application.injectTestHelpers();\n\n assert.ok(typeof _test.default.Promise.prototype.click === 'function');\n\n this.runTask(() => {\n this.application.destroy();\n });\n\n assert.equal(_test.default.Promise.prototype.click, undefined);\n }\n });\n }\n});","enifed('ember-testing/tests/adapters/adapter_test', ['@ember/runloop', 'ember-testing/lib/adapters/adapter', 'internal-test-helpers'], function (_runloop, _adapter, _internalTestHelpers) {\n 'use strict';\n\n var adapter;\n\n (0, _internalTestHelpers.moduleFor)('ember-testing Adapter', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n adapter = _adapter.default.create();\n }\n\n teardown() {\n (0, _runloop.run)(adapter, adapter.destroy);\n }\n\n ['@test exception throws'](assert) {\n var error = 'Hai';\n var thrown;\n\n try {\n adapter.exception(error);\n } catch (e) {\n thrown = e;\n }\n assert.equal(thrown, error);\n }\n });\n});","enifed('ember-testing/tests/adapters/qunit_test', ['@ember/runloop', 'ember-testing/lib/adapters/qunit', 'internal-test-helpers'], function (_runloop, _qunit, _internalTestHelpers) {\n 'use strict';\n\n var adapter;\n\n (0, _internalTestHelpers.moduleFor)('ember-testing QUnitAdapter: QUnit 2.x', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.originalStart = QUnit.start;\n this.originalStop = QUnit.stop;\n\n delete QUnit.start;\n delete QUnit.stop;\n\n adapter = _qunit.default.create();\n }\n\n teardown() {\n (0, _runloop.run)(adapter, adapter.destroy);\n\n QUnit.start = this.originalStart;\n QUnit.stop = this.originalStop;\n }\n\n ['@test asyncStart waits for asyncEnd to finish a test'](assert) {\n adapter.asyncStart();\n\n setTimeout(function () {\n assert.ok(true);\n adapter.asyncEnd();\n }, 50);\n }\n\n ['@test asyncStart waits for equal numbers of asyncEnd to finish a test'](assert) {\n let adapter = _qunit.default.create();\n\n adapter.asyncStart();\n adapter.asyncStart();\n adapter.asyncEnd();\n\n setTimeout(function () {\n assert.ok(true);\n adapter.asyncEnd();\n }, 50);\n }\n });\n});","enifed('ember-testing/tests/adapters_test', ['@ember/runloop', '@ember/-internals/error-handling', 'ember-testing/lib/test', 'ember-testing/lib/adapters/adapter', 'ember-testing/lib/adapters/qunit', '@ember/application', 'internal-test-helpers', '@ember/-internals/runtime', '@ember/debug'], function (_runloop, _errorHandling, _test, _adapter, _qunit, _application, _internalTestHelpers, _runtime, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n var App, originalAdapter, originalQUnit, originalWindowOnerror;\n\n var originalConsoleError = console.error; // eslint-disable-line no-console\n\n function runThatThrowsSync(message = 'Error for testing error handling') {\n return (0, _runloop.run)(() => {\n throw new Error(message);\n });\n }\n\n function runThatThrowsAsync(message = 'Error for testing error handling') {\n return (0, _runloop.next)(() => {\n throw new Error(message);\n });\n }\n\n class AdapterSetupAndTearDown extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n originalAdapter = _test.default.adapter;\n originalQUnit = window.QUnit;\n originalWindowOnerror = window.onerror;\n }\n\n afterEach() {\n console.error = originalConsoleError; // eslint-disable-line no-console\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n if (App) {\n (0, _runloop.run)(App, App.destroy);\n App.removeTestHelpers();\n App = null;\n }\n\n _test.default.adapter = originalAdapter;\n window.QUnit = originalQUnit;\n window.onerror = originalWindowOnerror;\n (0, _errorHandling.setOnerror)(undefined);\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-testing Adapters', class extends AdapterSetupAndTearDown {\n ['@test Setting a test adapter manually'](assert) {\n assert.expect(1);\n var CustomAdapter;\n\n CustomAdapter = _adapter.default.extend({\n asyncStart() {\n assert.ok(true, 'Correct adapter was used');\n }\n });\n\n (0, _runloop.run)(function () {\n App = _application.default.create();\n _test.default.adapter = CustomAdapter.create();\n App.setupForTesting();\n });\n\n _test.default.adapter.asyncStart();\n }\n\n ['@test QUnitAdapter is used by default (if QUnit is available)'](assert) {\n assert.expect(1);\n\n _test.default.adapter = null;\n\n (0, _runloop.run)(function () {\n App = _application.default.create();\n App.setupForTesting();\n });\n\n assert.ok(_test.default.adapter instanceof _qunit.default);\n }\n\n ['@test Adapter is used by default (if QUnit is not available)'](assert) {\n assert.expect(2);\n\n delete window.QUnit;\n\n _test.default.adapter = null;\n\n (0, _runloop.run)(function () {\n App = _application.default.create();\n App.setupForTesting();\n });\n\n assert.ok(_test.default.adapter instanceof _adapter.default);\n assert.ok(!(_test.default.adapter instanceof _qunit.default));\n }\n\n ['@test With Ember.Test.adapter set, errors in synchronous Ember.run are bubbled out'](assert) {\n let thrown = new Error('Boom!');\n\n let caughtInAdapter, caughtInCatch;\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n caughtInAdapter = error;\n }\n });\n\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } catch (e) {\n caughtInCatch = e;\n }\n\n assert.equal(caughtInAdapter, undefined, 'test adapter should never receive synchronous errors');\n assert.equal(caughtInCatch, thrown, 'a \"normal\" try/catch should catch errors in sync run');\n }\n\n ['@test when both Ember.onerror (which rethrows) and TestAdapter are registered - sync run'](assert) {\n assert.expect(2);\n\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'adapter is not called for errors thrown in sync run loops');\n }\n };\n\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'onerror is called for sync errors even if TestAdapter is setup');\n throw error;\n });\n\n assert.throws(runThatThrowsSync, Error, 'error is thrown');\n }\n\n ['@test when both Ember.onerror (which does not rethrow) and TestAdapter are registered - sync run'](assert) {\n assert.expect(2);\n\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'adapter is not called for errors thrown in sync run loops');\n }\n };\n\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror is called for sync errors even if TestAdapter is setup');\n });\n\n runThatThrowsSync();\n assert.ok(true, 'no error was thrown, Ember.onerror can intercept errors');\n }\n\n ['@test when TestAdapter is registered and error is thrown - async run'](assert) {\n assert.expect(3);\n let done = assert.async();\n\n let caughtInAdapter, caughtInCatch, caughtByWindowOnerror;\n _test.default.adapter = {\n exception(error) {\n caughtInAdapter = error;\n }\n };\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message;\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n try {\n runThatThrowsAsync();\n } catch (e) {\n caughtInCatch = e;\n }\n\n setTimeout(() => {\n assert.equal(caughtInAdapter, undefined, 'test adapter should never catch errors in run loops');\n assert.equal(caughtInCatch, undefined, 'a \"normal\" try/catch should never catch errors in an async run');\n\n assert.pushResult({\n result: /Error for testing error handling/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `Error for testing error handling`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n done();\n }, 20);\n }\n\n ['@test when both Ember.onerror and TestAdapter are registered - async run'](assert) {\n assert.expect(1);\n let done = assert.async();\n\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'Adapter.exception is not called for errors thrown in next');\n }\n };\n\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror is invoked for errors thrown in next/later');\n });\n\n runThatThrowsAsync();\n setTimeout(done, 10);\n }\n });\n\n function testAdapter(message, generatePromise, timeout = 10) {\n return class PromiseFailureTests extends AdapterSetupAndTearDown {\n [`@test ${message} when TestAdapter without \\`exception\\` method is present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception: undefined\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n generatePromise(thrown);\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter without \\`exception\\` method are present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception: undefined\n });\n\n (0, _errorHandling.setOnerror)(function (error) {\n assert.pushResult({\n result: /the error/.test(error.message),\n actual: error.message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n });\n\n generatePromise(thrown);\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when TestAdapter is present - rsvp`](assert) {\n assert.expect(1);\n\n console.error = () => {}; // eslint-disable-line no-console\n let thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n }\n });\n\n generatePromise(thrown);\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter are present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n }\n });\n\n (0, _errorHandling.setOnerror)(function () {\n assert.notOk(true, 'Ember.onerror is not called if Test.adapter does not rethrow');\n });\n\n generatePromise(thrown);\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter are present - rsvp`](assert) {\n assert.expect(2);\n\n let thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n throw error;\n }\n });\n\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises if Test.adapter rethrows');\n });\n\n generatePromise(thrown);\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: .then callback', testAdapter('errors in promise constructor', error => {\n new _runtime.RSVP.Promise(() => {\n throw error;\n });\n }));\n\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: Promise Contructor', testAdapter('errors in promise constructor', error => {\n _runtime.RSVP.resolve().then(() => {\n throw error;\n });\n }));\n\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: Promise chain .then callback', testAdapter('errors in promise constructor', error => {\n new _runtime.RSVP.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw error;\n });\n }, 20));\n});","enifed('ember-testing/tests/ext/rsvp_test', ['ember-testing/lib/ext/rsvp', 'ember-testing/lib/test/adapter', 'ember-testing/lib/test/promise', '@ember/runloop', '@ember/debug', 'internal-test-helpers'], function (_rsvp, _adapter, _promise, _runloop, _debug, _internalTestHelpers) {\n 'use strict';\n\n const originalTestAdapter = (0, _adapter.getAdapter)();\n const originalTestingFlag = (0, _debug.isTesting)();\n\n let asyncStarted = 0;\n let asyncEnded = 0;\n\n (0, _internalTestHelpers.moduleFor)('ember-testing RSVP', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n (0, _debug.setTesting)(true);\n (0, _adapter.setAdapter)({\n asyncStart() {\n asyncStarted++;\n },\n asyncEnd() {\n asyncEnded++;\n }\n });\n }\n\n teardown() {\n asyncStarted = 0;\n asyncEnded = 0;\n (0, _adapter.setAdapter)(originalTestAdapter);\n (0, _debug.setTesting)(originalTestingFlag);\n }\n\n ['@test given `Ember.testing = true`, correctly informs the test suite about async steps'](assert) {\n let done = assert.async();\n assert.expect(19);\n\n assert.ok(!(0, _runloop.getCurrentRunLoop)(), 'expect no run-loop');\n\n (0, _debug.setTesting)(true);\n\n assert.equal(asyncStarted, 0);\n assert.equal(asyncEnded, 0);\n\n let user = _rsvp.default.Promise.resolve({ name: 'tomster' });\n\n assert.equal(asyncStarted, 0);\n assert.equal(asyncEnded, 0);\n\n user.then(function (user) {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n\n assert.equal(user.name, 'tomster');\n\n return _rsvp.default.Promise.resolve(1).then(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n });\n }).then(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n\n return new _rsvp.default.Promise(function (resolve) {\n setTimeout(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n\n resolve({ name: 'async tomster' });\n\n assert.equal(asyncStarted, 2);\n assert.equal(asyncEnded, 1);\n }, 0);\n });\n }).then(function (user) {\n assert.equal(user.name, 'async tomster');\n assert.equal(asyncStarted, 2);\n assert.equal(asyncEnded, 2);\n done();\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('TestPromise', class extends _internalTestHelpers.AbstractTestCase {\n ['does not throw error when falsy value passed to then'](assert) {\n assert.expect(1);\n return new _promise.default(function (resolve) {\n resolve();\n }).then(null).then(function () {\n assert.ok(true);\n });\n }\n\n ['able to get last Promise'](assert) {\n assert.expect(2);\n\n var p1 = new _promise.default(function (resolve) {\n resolve();\n }).then(function () {\n assert.ok(true);\n });\n\n var p2 = new _promise.default(function (resolve) {\n resolve();\n });\n\n assert.deepEqual((0, _promise.getLastPromise)(), p2);\n return p1;\n }\n });\n});","enifed('ember-testing/tests/helper_registration_test', ['@ember/runloop', 'ember-testing/lib/test', '@ember/application', 'internal-test-helpers'], function (_runloop, _test, _application, _internalTestHelpers) {\n 'use strict';\n\n var App, appBooted, helperContainer;\n\n function registerHelper() {\n _test.default.registerHelper('boot', function (app) {\n (0, _runloop.run)(app, app.advanceReadiness);\n appBooted = true;\n return app.testHelpers.wait();\n });\n }\n\n function unregisterHelper() {\n _test.default.unregisterHelper('boot');\n }\n\n var originalAdapter = _test.default.adapter;\n\n function setupApp() {\n appBooted = false;\n helperContainer = {};\n\n (0, _runloop.run)(function () {\n App = _application.default.create();\n App.setupForTesting();\n App.injectTestHelpers(helperContainer);\n });\n }\n\n function destroyApp() {\n if (App) {\n (0, _runloop.run)(App, 'destroy');\n App = null;\n helperContainer = null;\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Test - registerHelper/unregisterHelper', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n _test.default.adapter = originalAdapter;\n destroyApp();\n }\n\n ['@test Helper gets registered'](assert) {\n assert.expect(2);\n\n registerHelper();\n setupApp();\n\n assert.ok(App.testHelpers.boot);\n assert.ok(helperContainer.boot);\n }\n\n ['@test Helper is ran when called'](assert) {\n let done = assert.async();\n assert.expect(1);\n\n registerHelper();\n setupApp();\n\n App.testHelpers.boot().then(function () {\n assert.ok(appBooted);\n }).finally(done);\n }\n\n ['@test Helper can be unregistered'](assert) {\n assert.expect(4);\n\n registerHelper();\n setupApp();\n\n assert.ok(App.testHelpers.boot);\n assert.ok(helperContainer.boot);\n\n unregisterHelper();\n\n (0, _runloop.run)(App, 'destroy');\n setupApp();\n\n assert.ok(!App.testHelpers.boot, 'once unregistered the helper is not added to App.testHelpers');\n assert.ok(!helperContainer.boot, 'once unregistered the helper is not added to the helperContainer');\n }\n });\n});","enifed('ember-testing/tests/helpers_test', ['internal-test-helpers', '@ember/-internals/routing', '@ember/controller', '@ember/-internals/runtime', '@ember/runloop', '@ember/-internals/glimmer', '@ember/-internals/views', 'ember-testing/lib/test', 'ember-testing/lib/setup_for_testing', 'ember-testing/lib/test/pending_requests', 'ember-testing/lib/test/adapter', 'ember-testing/lib/test/waiters', '@ember/debug'], function (_internalTestHelpers, _routing, _controller, _runtime, _runloop, _glimmer, _views, _test, _setup_for_testing, _pending_requests, _adapter, _waiters, _debug) {\n 'use strict';\n\n var originalInfo = (0, _debug.getDebugFunction)('info');\n var noop = function () {};\n\n function registerHelper() {\n _test.default.registerHelper('LeakyMcLeakLeak', () => {});\n }\n\n function assertHelpers(assert, application, helperContainer, expected) {\n if (!helperContainer) {\n helperContainer = window;\n }\n if (expected === undefined) {\n expected = true;\n }\n\n function checkHelperPresent(helper, expected) {\n var presentInHelperContainer = !!helperContainer[helper];\n var presentInTestHelpers = !!application.testHelpers[helper];\n\n assert.ok(presentInHelperContainer === expected, \"Expected '\" + helper + \"' to be present in the helper container (defaults to window).\");\n assert.ok(presentInTestHelpers === expected, \"Expected '\" + helper + \"' to be present in App.testHelpers.\");\n }\n\n checkHelperPresent('visit', expected);\n checkHelperPresent('click', expected);\n checkHelperPresent('keyEvent', expected);\n checkHelperPresent('fillIn', expected);\n checkHelperPresent('wait', expected);\n checkHelperPresent('triggerEvent', expected);\n }\n\n function assertNoHelpers(assert, application, helperContainer) {\n assertHelpers(assert, application, helperContainer, false);\n }\n\n class HelpersTestCase extends _internalTestHelpers.AutobootApplicationTestCase {\n constructor() {\n super();\n this._originalAdapter = (0, _adapter.getAdapter)();\n }\n\n teardown() {\n (0, _adapter.setAdapter)(this._originalAdapter);\n document.removeEventListener('ajaxSend', _pending_requests.incrementPendingRequests);\n document.removeEventListener('ajaxComplete', _pending_requests.decrementPendingRequests);\n (0, _pending_requests.clearPendingRequests)();\n if (this.application) {\n this.application.removeTestHelpers();\n }\n super.teardown();\n }\n }\n\n class HelpersApplicationTestCase extends HelpersTestCase {\n constructor() {\n super();\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n this.application.injectTestHelpers();\n });\n }\n }\n\n if (!_views.jQueryDisabled) {\n (0, _internalTestHelpers.moduleFor)('ember-testing: Helper setup', class extends HelpersTestCase {\n [`@test Ember.Application#injectTestHelpers/#removeTestHelper`](assert) {\n this.runTask(() => {\n this.createApplication();\n });\n\n assertNoHelpers(assert, this.application);\n\n registerHelper();\n\n this.application.injectTestHelpers();\n\n assertHelpers(assert, this.application);\n\n assert.ok(_test.default.Promise.prototype.LeakyMcLeakLeak, 'helper in question SHOULD be present');\n\n this.application.removeTestHelpers();\n\n assertNoHelpers(assert, this.application);\n\n assert.equal(_test.default.Promise.prototype.LeakyMcLeakLeak, undefined, 'should NOT leak test promise extensions');\n }\n\n [`@test Ember.Application#setupForTesting`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n let routerInstance = this.applicationInstance.lookup('router:main');\n assert.equal(routerInstance.location, 'none');\n }\n\n [`@test Ember.Application.setupForTesting sets the application to 'testing'`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n assert.equal(this.application.testing, true, 'Application instance is set to testing.');\n }\n\n [`@test Ember.Application.setupForTesting leaves the system in a deferred state.`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n assert.equal(this.application._readinessDeferrals, 1, 'App is in deferred state after setupForTesting.');\n }\n\n [`@test App.reset() after Application.setupForTesting leaves the system in a deferred state.`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n assert.equal(this.application._readinessDeferrals, 1, 'App is in deferred state after setupForTesting.');\n\n this.application.reset();\n\n assert.equal(this.application._readinessDeferrals, 1, 'App is in deferred state after setupForTesting.');\n }\n\n [`@test Ember.Application#injectTestHelpers calls callbacks registered with onInjectHelpers`](assert) {\n let injected = 0;\n\n _test.default.onInjectHelpers(() => {\n injected++;\n });\n\n // bind(this) so Babel doesn't leak _this\n // into the context onInjectHelpers.\n this.runTask(function () {\n this.createApplication();\n this.application.setupForTesting();\n }.bind(this));\n\n assert.equal(injected, 0, 'onInjectHelpers are not called before injectTestHelpers');\n\n this.application.injectTestHelpers();\n\n assert.equal(injected, 1, 'onInjectHelpers are called after injectTestHelpers');\n }\n\n [`@test Ember.Application#injectTestHelpers adds helpers to provided object.`](assert) {\n let helpers = {};\n\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n this.application.injectTestHelpers(helpers);\n\n assertHelpers(assert, this.application, helpers);\n\n this.application.removeTestHelpers();\n\n assertNoHelpers(assert, this.application, helpers);\n }\n\n [`@test Ember.Application#removeTestHelpers resets the helperContainer\\'s original values`](assert) {\n let helpers = { visit: 'snazzleflabber' };\n\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n\n this.application.injectTestHelpers(helpers);\n\n assert.notEqual(helpers.visit, 'snazzleflabber', 'helper added to container');\n this.application.removeTestHelpers();\n\n assert.equal(helpers.visit, 'snazzleflabber', 'original value added back to container');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: Helper methods', class extends HelpersApplicationTestCase {\n [`@test 'wait' respects registerWaiters`](assert) {\n assert.expect(3);\n\n let counter = 0;\n function waiter() {\n return ++counter > 2;\n }\n\n let other = 0;\n function otherWaiter() {\n return ++other > 2;\n }\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n (0, _waiters.registerWaiter)(waiter);\n (0, _waiters.registerWaiter)(otherWaiter);\n\n let { application: { testHelpers } } = this;\n return testHelpers.wait().then(() => {\n assert.equal(waiter(), true, 'should not resolve until our waiter is ready');\n (0, _waiters.unregisterWaiter)(waiter);\n counter = 0;\n return testHelpers.wait();\n }).then(() => {\n assert.equal(counter, 0, 'unregistered waiter was not checked');\n assert.equal(otherWaiter(), true, 'other waiter is still registered');\n }).finally(() => {\n (0, _waiters.unregisterWaiter)(otherWaiter);\n });\n }\n\n [`@test 'visit' advances readiness.`](assert) {\n assert.expect(2);\n\n assert.equal(this.application._readinessDeferrals, 1, 'App is in deferred state after setupForTesting.');\n\n return this.application.testHelpers.visit('/').then(() => {\n assert.equal(this.application._readinessDeferrals, 0, `App's readiness was advanced by visit.`);\n });\n }\n\n [`@test 'wait' helper can be passed a resolution value`](assert) {\n assert.expect(4);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let promiseObjectValue = {};\n let objectValue = {};\n let { application: { testHelpers } } = this;\n return testHelpers.wait('text').then(val => {\n assert.equal(val, 'text', 'can resolve to a string');\n return testHelpers.wait(1);\n }).then(val => {\n assert.equal(val, 1, 'can resolve to an integer');\n return testHelpers.wait(objectValue);\n }).then(val => {\n assert.equal(val, objectValue, 'can resolve to an object');\n return testHelpers.wait(_runtime.RSVP.resolve(promiseObjectValue));\n }).then(val => {\n assert.equal(val, promiseObjectValue, 'can resolve to a promise resolution value');\n });\n }\n\n [`@test 'click' triggers appropriate events in order`](assert) {\n assert.expect(5);\n\n this.add('component:index-wrapper', _glimmer.Component.extend({\n classNames: 'index-wrapper',\n\n didInsertElement() {\n let wrapper = document.querySelector('.index-wrapper');\n wrapper.addEventListener('mousedown', e => events.push(e.type));\n wrapper.addEventListener('mouseup', e => events.push(e.type));\n wrapper.addEventListener('click', e => events.push(e.type));\n wrapper.addEventListener('focusin', e => {\n // IE11 _sometimes_ triggers focusin **twice** in a row\n // (we believe this is when it is under higher load)\n //\n // the goal here is to only push a single focusin when running on\n // IE11\n if (_internalTestHelpers.isIE11) {\n if (events[events.length - 1] !== 'focusin') {\n events.push(e.type);\n }\n } else {\n events.push(e.type);\n }\n });\n }\n }));\n\n this.add('component:x-checkbox', _glimmer.Component.extend({\n tagName: 'input',\n attributeBindings: ['type'],\n type: 'checkbox',\n click() {\n events.push('click:' + this.get('checked'));\n },\n change() {\n events.push('change:' + this.get('checked'));\n }\n }));\n\n this.addTemplate('index', `\n {{#index-wrapper}}\n {{input type=\"text\"}}\n {{x-checkbox type=\"checkbox\"}}\n {{textarea}}\n
    \n {{/index-wrapper}}'));\n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let events;\n let { application: { testHelpers } } = this;\n return testHelpers.wait().then(() => {\n events = [];\n return testHelpers.click('.index-wrapper');\n }).then(() => {\n assert.deepEqual(events, ['mousedown', 'mouseup', 'click'], 'fires events in order');\n }).then(() => {\n events = [];\n return testHelpers.click('.index-wrapper input[type=text]');\n }).then(() => {\n assert.deepEqual(events, ['mousedown', 'focusin', 'mouseup', 'click'], 'fires focus events on inputs');\n }).then(() => {\n events = [];\n return testHelpers.click('.index-wrapper textarea');\n }).then(() => {\n assert.deepEqual(events, ['mousedown', 'focusin', 'mouseup', 'click'], 'fires focus events on textareas');\n }).then(() => {\n events = [];\n return testHelpers.click('.index-wrapper div');\n }).then(() => {\n assert.deepEqual(events, ['mousedown', 'focusin', 'mouseup', 'click'], 'fires focus events on contenteditable');\n }).then(() => {\n events = [];\n return testHelpers.click('.index-wrapper input[type=checkbox]');\n }).then(() => {\n // i.e. mousedown, mouseup, change:true, click, click:true\n // Firefox differs so we can't assert the exact ordering here.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=843554.\n assert.equal(events.length, 5, 'fires click and change on checkboxes');\n });\n }\n\n [`@test 'click' triggers native events with simulated X/Y coordinates`](assert) {\n assert.expect(15);\n\n this.add('component:index-wrapper', _glimmer.Component.extend({\n classNames: 'index-wrapper',\n\n didInsertElement() {\n let pushEvent = e => events.push(e);\n this.element.addEventListener('mousedown', pushEvent);\n this.element.addEventListener('mouseup', pushEvent);\n this.element.addEventListener('click', pushEvent);\n }\n }));\n\n this.addTemplate('index', `\n {{#index-wrapper}}some text{{/index-wrapper}}\n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let events;\n let { application: { testHelpers: { wait, click } } } = this;\n return wait().then(() => {\n events = [];\n return click('.index-wrapper');\n }).then(() => {\n events.forEach(e => {\n assert.ok(e instanceof window.Event, 'The event is an instance of MouseEvent');\n assert.ok(typeof e.screenX === 'number', 'screenX is correct');\n assert.ok(typeof e.screenY === 'number', 'screenY is correct');\n assert.ok(typeof e.clientX === 'number', 'clientX is correct');\n assert.ok(typeof e.clientY === 'number', 'clientY is correct');\n });\n });\n }\n\n [`@test 'triggerEvent' with mouseenter triggers native events with simulated X/Y coordinates`](assert) {\n assert.expect(5);\n\n let evt;\n this.add('component:index-wrapper', _glimmer.Component.extend({\n classNames: 'index-wrapper',\n didInsertElement() {\n this.element.addEventListener('mouseenter', e => evt = e);\n }\n }));\n\n this.addTemplate('index', `{{#index-wrapper}}some text{{/index-wrapper}}`);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { wait, triggerEvent } } } = this;\n return wait().then(() => {\n return triggerEvent('.index-wrapper', 'mouseenter');\n }).then(() => {\n assert.ok(evt instanceof window.Event, 'The event is an instance of MouseEvent');\n assert.ok(typeof evt.screenX === 'number', 'screenX is correct');\n assert.ok(typeof evt.screenY === 'number', 'screenY is correct');\n assert.ok(typeof evt.clientX === 'number', 'clientX is correct');\n assert.ok(typeof evt.clientY === 'number', 'clientY is correct');\n });\n }\n\n [`@test 'wait' waits for outstanding timers`](assert) {\n assert.expect(1);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let waitDone = false;\n (0, _runloop.later)(() => {\n waitDone = true;\n }, 20);\n\n return this.application.testHelpers.wait().then(() => {\n assert.equal(waitDone, true, 'should wait for the timer to be fired.');\n });\n }\n\n [`@test 'wait' respects registerWaiters with optional context`](assert) {\n assert.expect(3);\n\n let obj = {\n counter: 0,\n ready() {\n return ++this.counter > 2;\n }\n };\n\n let other = 0;\n function otherWaiter() {\n return ++other > 2;\n }\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n (0, _waiters.registerWaiter)(obj, obj.ready);\n (0, _waiters.registerWaiter)(otherWaiter);\n\n let { application: { testHelpers: { wait } } } = this;\n return wait().then(() => {\n assert.equal(obj.ready(), true, 'should not resolve until our waiter is ready');\n (0, _waiters.unregisterWaiter)(obj, obj.ready);\n obj.counter = 0;\n return wait();\n }).then(() => {\n assert.equal(obj.counter, 0, 'the unregistered waiter should still be at 0');\n assert.equal(otherWaiter(), true, 'other waiter should still be registered');\n }).finally(() => {\n (0, _waiters.unregisterWaiter)(otherWaiter);\n });\n }\n\n [`@test 'wait' does not error if routing has not begun`](assert) {\n assert.expect(1);\n\n return this.application.testHelpers.wait().then(() => {\n assert.ok(true, 'should not error without `visit`');\n });\n }\n\n [`@test 'triggerEvent' accepts an optional options hash without context`](assert) {\n assert.expect(3);\n\n let event;\n this.add('component:index-wrapper', _glimmer.Component.extend({\n didInsertElement() {\n let domElem = document.querySelector('.input');\n domElem.addEventListener('change', e => event = e);\n domElem.addEventListener('keydown', e => event = e);\n }\n }));\n\n this.addTemplate('index', `{{index-wrapper}}`);\n this.addTemplate('components/index-wrapper', `\n {{input type=\"text\" id=\"scope\" class=\"input\"}}\n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { wait, triggerEvent } } } = this;\n return wait().then(() => {\n return triggerEvent('.input', 'keydown', { keyCode: 13 });\n }).then(() => {\n assert.equal(event.keyCode, 13, 'options were passed');\n assert.equal(event.type, 'keydown', 'correct event was triggered');\n assert.equal(event.target.getAttribute('id'), 'scope', 'triggered on the correct element');\n });\n }\n\n [`@test 'triggerEvent' can limit searching for a selector to a scope`](assert) {\n assert.expect(2);\n\n let event;\n this.add('component:index-wrapper', _glimmer.Component.extend({\n didInsertElement() {\n let firstInput = document.querySelector('.input');\n firstInput.addEventListener('blur', e => event = e);\n firstInput.addEventListener('change', e => event = e);\n let secondInput = document.querySelector('#limited .input');\n secondInput.addEventListener('blur', e => event = e);\n secondInput.addEventListener('change', e => event = e);\n }\n }));\n\n this.addTemplate('components/index-wrapper', `\n {{input type=\"text\" id=\"outside-scope\" class=\"input\"}}\n
    \n {{input type=\"text\" id=\"inside-scope\" class=\"input\"}}\n
    \n `);\n this.addTemplate('index', `{{index-wrapper}}`);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { wait, triggerEvent } } } = this;\n return wait().then(() => {\n return triggerEvent('.input', '#limited', 'blur');\n }).then(() => {\n assert.equal(event.type, 'blur', 'correct event was triggered');\n assert.equal(event.target.getAttribute('id'), 'inside-scope', 'triggered on the correct element');\n });\n }\n\n [`@test 'triggerEvent' can be used to trigger arbitrary events`](assert) {\n assert.expect(2);\n\n let event;\n this.add('component:index-wrapper', _glimmer.Component.extend({\n didInsertElement() {\n let foo = document.getElementById('foo');\n foo.addEventListener('blur', e => event = e);\n foo.addEventListener('change', e => event = e);\n }\n }));\n\n this.addTemplate('components/index-wrapper', `\n {{input type=\"text\" id=\"foo\"}}\n `);\n this.addTemplate('index', `{{index-wrapper}}`);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { wait, triggerEvent } } } = this;\n return wait().then(() => {\n return triggerEvent('#foo', 'blur');\n }).then(() => {\n assert.equal(event.type, 'blur', 'correct event was triggered');\n assert.equal(event.target.getAttribute('id'), 'foo', 'triggered on the correct element');\n });\n }\n\n [`@test 'fillIn' takes context into consideration`](assert) {\n assert.expect(2);\n\n this.addTemplate('index', `\n
    \n {{input type=\"text\" id=\"first\" class=\"current\"}}\n
    \n {{input type=\"text\" id=\"second\" class=\"current\"}}\n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { visit, fillIn, andThen, find } } } = this;\n visit('/');\n fillIn('.current', '#parent', 'current value');\n\n return andThen(() => {\n assert.equal(find('#first')[0].value, 'current value');\n assert.equal(find('#second')[0].value, '');\n });\n }\n\n [`@test 'fillIn' focuses on the element`](assert) {\n let wasFocused = false;\n\n this.add('controller:index', _controller.default.extend({\n actions: {\n wasFocused() {\n wasFocused = true;\n }\n }\n }));\n\n this.addTemplate('index', `\n
    \n {{input type=\"text\" id=\"first\" focus-in=(action \"wasFocused\")}}\n
    '\n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { visit, fillIn, andThen, find, wait } } } = this;\n visit('/');\n fillIn('#first', 'current value');\n andThen(() => {\n assert.ok(wasFocused, 'focusIn event was triggered');\n\n assert.equal(find('#first')[0].value, 'current value');\n });\n\n return wait();\n }\n\n [`@test 'fillIn' fires 'input' and 'change' events in the proper order`](assert) {\n assert.expect(1);\n\n let events = [];\n this.add('controller:index', _controller.default.extend({\n actions: {\n oninputHandler(e) {\n events.push(e.type);\n },\n onchangeHandler(e) {\n events.push(e.type);\n }\n }\n }));\n\n this.addTemplate('index', `\n \n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { visit, fillIn, andThen, wait } } } = this;\n\n visit('/');\n fillIn('#first', 'current value');\n andThen(() => {\n assert.deepEqual(events, ['input', 'change'], '`input` and `change` events are fired in the proper order');\n });\n\n return wait();\n }\n\n [`@test 'fillIn' only sets the value in the first matched element`](assert) {\n this.addTemplate('index', `\n \n \n `);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { visit, fillIn, find, andThen, wait } } } = this;\n\n visit('/');\n fillIn('input.in-test', 'new value');\n andThen(() => {\n assert.equal(find('#first')[0].value, 'new value');\n assert.equal(find('#second')[0].value, '');\n });\n\n return wait();\n }\n\n [`@test 'triggerEvent' accepts an optional options hash and context`](assert) {\n assert.expect(3);\n\n let event;\n this.add('component:index-wrapper', _glimmer.Component.extend({\n didInsertElement() {\n let firstInput = document.querySelector('.input');\n firstInput.addEventListener('keydown', e => event = e, false);\n firstInput.addEventListener('change', e => event = e, false);\n let secondInput = document.querySelector('#limited .input');\n secondInput.addEventListener('keydown', e => event = e, false);\n secondInput.addEventListener('change', e => event = e, false);\n }\n }));\n\n this.addTemplate('components/index-wrapper', `\n {{input type=\"text\" id=\"outside-scope\" class=\"input\"}}\n
    \n {{input type=\"text\" id=\"inside-scope\" class=\"input\"}}\n
    \n `);\n this.addTemplate('index', `{{index-wrapper}}`);\n\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n\n let { application: { testHelpers: { wait, triggerEvent } } } = this;\n return wait().then(() => {\n return triggerEvent('.input', '#limited', 'keydown', {\n keyCode: 13\n });\n }).then(() => {\n assert.equal(event.keyCode, 13, 'options were passed');\n assert.equal(event.type, 'keydown', 'correct event was triggered');\n assert.equal(event.target.getAttribute('id'), 'inside-scope', 'triggered on the correct element');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: debugging helpers', class extends HelpersApplicationTestCase {\n afterEach() {\n super.afterEach();\n (0, _debug.setDebugFunction)('info', originalInfo);\n }\n\n constructor() {\n super();\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n }\n\n [`@test pauseTest pauses`](assert) {\n assert.expect(1);\n // overwrite info to supress the console output (see https://github.com/emberjs/ember.js/issues/16391)\n (0, _debug.setDebugFunction)('info', noop);\n\n let { andThen, pauseTest } = this.application.testHelpers;\n\n andThen(() => {\n _test.default.adapter.asyncStart = () => {\n assert.ok(true, 'Async start should be called after waiting for other helpers');\n };\n });\n\n pauseTest();\n }\n\n [`@test resumeTest resumes paused tests`](assert) {\n assert.expect(1);\n // overwrite info to supress the console output (see https://github.com/emberjs/ember.js/issues/16391)\n (0, _debug.setDebugFunction)('info', noop);\n\n let { application: { testHelpers: { pauseTest, resumeTest } } } = this;\n\n (0, _runloop.later)(() => resumeTest(), 20);\n return pauseTest().then(() => {\n assert.ok(true, 'pauseTest promise was resolved');\n });\n }\n\n [`@test resumeTest throws if nothing to resume`](assert) {\n assert.expect(1);\n\n assert.throws(() => {\n this.application.testHelpers.resumeTest();\n }, /Testing has not been paused. There is nothing to resume./);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: routing helpers', class extends HelpersTestCase {\n constructor() {\n super();\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n this.application.injectTestHelpers();\n this.router.map(function () {\n this.route('posts', { resetNamespace: true }, function () {\n this.route('new');\n this.route('edit', { resetNamespace: true });\n });\n });\n });\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n }\n\n [`@test currentRouteName for '/'`](assert) {\n assert.expect(3);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'index', `should equal 'index'.`);\n assert.equal(testHelpers.currentPath(), 'index', `should equal 'index'.`);\n assert.equal(testHelpers.currentURL(), '/', `should equal '/'.`);\n });\n }\n\n [`@test currentRouteName for '/posts'`](assert) {\n assert.expect(3);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/posts').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'posts.index', `should equal 'posts.index'.`);\n assert.equal(testHelpers.currentPath(), 'posts.index', `should equal 'posts.index'.`);\n assert.equal(testHelpers.currentURL(), '/posts', `should equal '/posts'.`);\n });\n }\n\n [`@test currentRouteName for '/posts/new'`](assert) {\n assert.expect(3);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/posts/new').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'posts.new', `should equal 'posts.new'.`);\n assert.equal(testHelpers.currentPath(), 'posts.new', `should equal 'posts.new'.`);\n assert.equal(testHelpers.currentURL(), '/posts/new', `should equal '/posts/new'.`);\n });\n }\n\n [`@test currentRouteName for '/posts/edit'`](assert) {\n assert.expect(3);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/posts/edit').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'edit', `should equal 'edit'.`);\n assert.equal(testHelpers.currentPath(), 'posts.edit', `should equal 'posts.edit'.`);\n assert.equal(testHelpers.currentURL(), '/posts/edit', `should equal '/posts/edit'.`);\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: pendingRequests', class extends HelpersApplicationTestCase {\n trigger(type, xhr) {\n (0, _views.jQuery)(document).trigger(type, xhr);\n }\n\n [`@test pendingRequests is maintained for ajaxSend and ajaxComplete events`](assert) {\n let done = assert.async();\n assert.equal((0, _pending_requests.pendingRequests)(), 0);\n\n let xhr = { some: 'xhr' };\n\n this.trigger('ajaxSend', xhr);\n assert.equal((0, _pending_requests.pendingRequests)(), 1, 'Ember.Test.pendingRequests was incremented');\n\n this.trigger('ajaxComplete', xhr);\n setTimeout(function () {\n assert.equal((0, _pending_requests.pendingRequests)(), 0, 'Ember.Test.pendingRequests was decremented');\n done();\n }, 0);\n }\n\n [`@test pendingRequests is ignores ajaxComplete events from past setupForTesting calls`](assert) {\n assert.equal((0, _pending_requests.pendingRequests)(), 0);\n\n let xhr = { some: 'xhr' };\n\n this.trigger('ajaxSend', xhr);\n assert.equal((0, _pending_requests.pendingRequests)(), 1, 'Ember.Test.pendingRequests was incremented');\n\n (0, _setup_for_testing.default)();\n\n assert.equal((0, _pending_requests.pendingRequests)(), 0, 'Ember.Test.pendingRequests was reset');\n\n let altXhr = { some: 'more xhr' };\n\n this.trigger('ajaxSend', altXhr);\n assert.equal((0, _pending_requests.pendingRequests)(), 1, 'Ember.Test.pendingRequests was incremented');\n\n this.trigger('ajaxComplete', xhr);\n assert.equal((0, _pending_requests.pendingRequests)(), 1, 'Ember.Test.pendingRequests is not impressed with your unexpected complete');\n }\n\n [`@test pendingRequests is reset by setupForTesting`](assert) {\n (0, _pending_requests.incrementPendingRequests)();\n\n (0, _setup_for_testing.default)();\n\n assert.equal((0, _pending_requests.pendingRequests)(), 0, 'pendingRequests is reset');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: async router', class extends HelpersTestCase {\n constructor() {\n super();\n\n this.runTask(() => {\n this.createApplication();\n\n this.router.map(function () {\n this.route('user', { resetNamespace: true }, function () {\n this.route('profile');\n this.route('edit');\n });\n });\n\n // Emulate a long-running unscheduled async operation.\n let resolveLater = () => new _runtime.RSVP.Promise(resolve => {\n /*\n * The wait() helper has a 10ms tick. We should resolve() after\n * at least one tick to test whether wait() held off while the\n * async router was still loading. 20ms should be enough.\n */\n (0, _runloop.later)(resolve, { firstName: 'Tom' }, 20);\n });\n\n this.add('route:user', _routing.Route.extend({\n model() {\n return resolveLater();\n }\n }));\n\n this.add('route:user.profile', _routing.Route.extend({\n beforeModel() {\n return resolveLater().then(() => this.transitionTo('user.edit'));\n }\n }));\n\n this.application.setupForTesting();\n });\n\n this.application.injectTestHelpers();\n this.runTask(() => {\n this.application.advanceReadiness();\n });\n }\n\n [`@test currentRouteName for '/user'`](assert) {\n assert.expect(4);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/user').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'user.index', `should equal 'user.index'.`);\n assert.equal(testHelpers.currentPath(), 'user.index', `should equal 'user.index'.`);\n assert.equal(testHelpers.currentURL(), '/user', `should equal '/user'.`);\n let userRoute = this.applicationInstance.lookup('route:user');\n assert.equal(userRoute.get('controller.model.firstName'), 'Tom', `should equal 'Tom'.`);\n });\n }\n\n [`@test currentRouteName for '/user/profile'`](assert) {\n assert.expect(4);\n\n let { application: { testHelpers } } = this;\n return testHelpers.visit('/user/profile').then(() => {\n assert.equal(testHelpers.currentRouteName(), 'user.edit', `should equal 'user.edit'.`);\n assert.equal(testHelpers.currentPath(), 'user.edit', `should equal 'user.edit'.`);\n assert.equal(testHelpers.currentURL(), '/user/edit', `should equal '/user/edit'.`);\n let userRoute = this.applicationInstance.lookup('route:user');\n assert.equal(userRoute.get('controller.model.firstName'), 'Tom', `should equal 'Tom'.`);\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: can override built-in helpers', class extends HelpersTestCase {\n constructor() {\n super();\n this.runTask(() => {\n this.createApplication();\n this.application.setupForTesting();\n });\n this._originalVisitHelper = _test.default._helpers.visit;\n this._originalFindHelper = _test.default._helpers.find;\n }\n\n teardown() {\n _test.default._helpers.visit = this._originalVisitHelper;\n _test.default._helpers.find = this._originalFindHelper;\n super.teardown();\n }\n\n [`@test can override visit helper`](assert) {\n assert.expect(1);\n\n _test.default.registerHelper('visit', () => {\n assert.ok(true, 'custom visit helper was called');\n });\n\n this.application.injectTestHelpers();\n\n return this.application.testHelpers.visit();\n }\n\n [`@test can override find helper`](assert) {\n assert.expect(1);\n\n _test.default.registerHelper('find', () => {\n assert.ok(true, 'custom find helper was called');\n\n return ['not empty array'];\n });\n\n this.application.injectTestHelpers();\n\n return this.application.testHelpers.findWithAssert('.who-cares');\n }\n });\n }\n});","enifed('ember-testing/tests/integration_test', ['internal-test-helpers', 'ember-testing/lib/test', '@ember/-internals/runtime', '@ember/-internals/routing', '@ember/-internals/views'], function (_internalTestHelpers, _test, _runtime, _routing, _views) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember-testing Integration tests of acceptance', class extends _internalTestHelpers.AutobootApplicationTestCase {\n constructor() {\n super();\n\n this.modelContent = [];\n this._originalAdapter = _test.default.adapter;\n\n this.runTask(() => {\n this.createApplication();\n\n this.addTemplate('people', `\n
    \n {{#each model as |person|}}\n
    {{person.firstName}}
    \n {{/each}}\n
    \n `);\n\n this.router.map(function () {\n this.route('people', { path: '/' });\n });\n\n this.add('route:people', _routing.Route.extend({\n model: () => this.modelContent\n }));\n\n this.application.setupForTesting();\n });\n\n this.runTask(() => {\n this.application.reset();\n });\n\n this.application.injectTestHelpers();\n }\n\n teardown() {\n super.teardown();\n _test.default.adapter = this._originalAdapter;\n }\n\n [`@test template is bound to empty array of people`](assert) {\n if (!_views.jQueryDisabled) {\n this.runTask(() => this.application.advanceReadiness());\n window.visit('/').then(() => {\n let rows = window.find('.name').length;\n assert.equal(rows, 0, 'successfully stubbed an empty array of people');\n });\n } else {\n this.runTask(() => this.application.advanceReadiness());\n window.visit('/').then(() => {\n expectAssertion(() => window.find('.name'), 'If jQuery is disabled, please import and use helpers from @ember/test-helpers [https://github.com/emberjs/ember-test-helpers]. Note: `find` is not an available helper.');\n });\n }\n }\n\n [`@test template is bound to array of 2 people`](assert) {\n if (!_views.jQueryDisabled) {\n this.modelContent = (0, _runtime.A)([]);\n this.modelContent.pushObject({ firstName: 'x' });\n this.modelContent.pushObject({ firstName: 'y' });\n\n this.runTask(() => this.application.advanceReadiness());\n window.visit('/').then(() => {\n let rows = window.find('.name').length;\n assert.equal(rows, 2, 'successfully stubbed a non empty array of people');\n });\n } else {\n assert.expect(0);\n }\n }\n\n [`@test 'visit' can be called without advanceReadiness.`](assert) {\n if (!_views.jQueryDisabled) {\n window.visit('/').then(() => {\n let rows = window.find('.name').length;\n assert.equal(rows, 0, 'stubbed an empty array of people without calling advanceReadiness.');\n });\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('ember-testing/tests/reexports_test', ['ember', 'internal-test-helpers'], function (_ember, _internalTestHelpers) {\n 'use strict';\n\n class ReexportsTestCase extends _internalTestHelpers.AbstractTestCase {}\n\n [\n // ember-testing\n ['Test', 'ember-testing'], ['Test.Adapter', 'ember-testing', 'Adapter'], ['Test.QUnitAdapter', 'ember-testing', 'QUnitAdapter'], ['setupForTesting', 'ember-testing']].forEach(reexport => {\n let [path, moduleId, exportName] = reexport;\n\n // default path === exportName if none present\n if (!exportName) {\n exportName = path;\n }\n\n ReexportsTestCase.prototype[`@test Ember.${path} exports correctly`] = function (assert) {\n (0, _internalTestHelpers.confirmExport)(_ember.default, assert, path, moduleId, exportName);\n };\n });\n\n (0, _internalTestHelpers.moduleFor)('ember-testing reexports', ReexportsTestCase);\n});","enifed('ember-testing/tests/test/waiters-test', ['ember-testing/lib/test/waiters', 'internal-test-helpers'], function (_waiters, _internalTestHelpers) {\n 'use strict';\n\n class Waiters {\n constructor() {\n this._waiters = [];\n }\n\n add() {\n this._waiters.push([...arguments]);\n }\n\n register() {\n this.forEach((...args) => {\n (0, _waiters.registerWaiter)(...args);\n });\n }\n\n unregister() {\n this.forEach((...args) => {\n (0, _waiters.unregisterWaiter)(...args);\n });\n }\n\n forEach(callback) {\n for (let i = 0; i < this._waiters.length; i++) {\n let args = this._waiters[i];\n\n callback(...args);\n }\n }\n\n check() {\n this.register();\n let result = (0, _waiters.checkWaiters)();\n this.unregister();\n\n return result;\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: waiters', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.waiters = new Waiters();\n }\n\n teardown() {\n this.waiters.unregister();\n }\n\n ['@test registering a waiter'](assert) {\n assert.expect(2);\n\n let obj = { foo: true };\n\n this.waiters.add(obj, function () {\n assert.ok(this.foo, 'has proper `this` context');\n return true;\n });\n\n this.waiters.add(function () {\n assert.ok(true, 'is called');\n return true;\n });\n\n this.waiters.check();\n }\n\n ['@test unregistering a waiter'](assert) {\n assert.expect(2);\n\n let obj = { foo: true };\n\n this.waiters.add(obj, function () {\n assert.ok(true, 'precond - waiter with context is registered');\n return true;\n });\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter without context is registered');\n return true;\n });\n\n this.waiters.check();\n this.waiters.unregister();\n\n (0, _waiters.checkWaiters)();\n }\n\n ['@test checkWaiters returns false if all waiters return true'](assert) {\n assert.expect(3);\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n\n return true;\n });\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n\n return true;\n });\n\n assert.notOk(this.waiters.check(), 'checkWaiters returns true if all waiters return true');\n }\n\n ['@test checkWaiters returns true if any waiters return false'](assert) {\n assert.expect(3);\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n\n return true;\n });\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n\n return false;\n });\n\n assert.ok(this.waiters.check(), 'checkWaiters returns false if any waiters return false');\n }\n\n ['@test checkWaiters short circuits after first falsey waiter'](assert) {\n assert.expect(2);\n\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n\n return false;\n });\n\n this.waiters.add(function () {\n assert.notOk(true, 'waiter should not be called');\n });\n\n assert.ok(this.waiters.check(), 'checkWaiters returns false if any waiters return false');\n }\n });\n});","enifed('ember/tests/application_lifecycle_test', ['internal-test-helpers', '@ember/application', '@ember/-internals/routing', '@ember/-internals/glimmer', '@ember/debug'], function (_internalTestHelpers, _application, _routing, _glimmer, _debug) {\n 'use strict';\n\n const originalDebug = (0, _debug.getDebugFunction)('debug');\n const noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - route hooks', class extends _internalTestHelpers.AutobootApplicationTestCase {\n createApplication() {\n let application = super.createApplication(...arguments);\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n return application;\n }\n\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n let menuItem = this.menuItem = {};\n\n this.runTask(() => {\n this.createApplication();\n\n let SettingRoute = _routing.Route.extend({\n setupController() {\n this.controller.set('selectedMenuItem', menuItem);\n },\n deactivate() {\n this.controller.set('selectedMenuItem', null);\n }\n });\n this.add('route:index', SettingRoute);\n this.add('route:application', SettingRoute);\n });\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n get indexController() {\n return this.applicationInstance.lookup('controller:index');\n }\n\n get applicationController() {\n return this.applicationInstance.lookup('controller:application');\n }\n\n [`@test Resetting the application allows controller properties to be set when a route deactivates`](assert) {\n let { indexController, applicationController } = this;\n assert.equal(indexController.get('selectedMenuItem'), this.menuItem);\n assert.equal(applicationController.get('selectedMenuItem'), this.menuItem);\n\n this.application.reset();\n\n assert.equal(indexController.get('selectedMenuItem'), null);\n assert.equal(applicationController.get('selectedMenuItem'), null);\n }\n\n [`@test Destroying the application resets the router before the appInstance is destroyed`](assert) {\n let { indexController, applicationController } = this;\n assert.equal(indexController.get('selectedMenuItem'), this.menuItem);\n assert.equal(applicationController.get('selectedMenuItem'), this.menuItem);\n\n this.runTask(() => {\n this.application.destroy();\n });\n\n assert.equal(indexController.get('selectedMenuItem'), null);\n assert.equal(applicationController.get('selectedMenuItem'), null);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle', class extends _internalTestHelpers.AutobootApplicationTestCase {\n createApplication() {\n let application = super.createApplication(...arguments);\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n return application;\n }\n\n [`@test Destroying a route after the router does create an undestroyed 'toplevelView'`](assert) {\n this.runTask(() => {\n this.createApplication();\n this.addTemplate('index', `Index!`);\n this.addTemplate('application', `Application! {{outlet}}`);\n });\n\n let router = this.applicationInstance.lookup('router:main');\n let route = this.applicationInstance.lookup('route:index');\n\n this.runTask(() => router.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was cleared');\n\n this.runTask(() => route.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n\n this.runTask(() => this.application.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n }\n\n [`@test initializers can augment an applications customEvents hash`](assert) {\n assert.expect(1);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'customize-things',\n initialize(application) {\n application.customEvents = {\n wowza: 'wowza'\n };\n }\n });\n\n this.runTask(() => {\n this.createApplication({}, MyApplication);\n\n this.add('component:foo-bar', _glimmer.Component.extend({\n wowza() {\n assert.ok(true, 'fired the event!');\n }\n }));\n\n this.addTemplate('application', `{{foo-bar}}`);\n this.addTemplate('components/foo-bar', `
    `);\n });\n\n this.$('#wowza-thingy').trigger('wowza');\n }\n\n [`@test instanceInitializers can augment an the customEvents hash`](assert) {\n assert.expect(1);\n\n let MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'customize-things',\n initialize(application) {\n application.customEvents = {\n herky: 'jerky'\n };\n }\n });\n this.runTask(() => {\n this.createApplication({}, MyApplication);\n\n this.add('component:foo-bar', _glimmer.Component.extend({\n jerky() {\n assert.ok(true, 'fired the event!');\n }\n }));\n\n this.addTemplate('application', `{{foo-bar}}`);\n this.addTemplate('components/foo-bar', `
    `);\n });\n\n this.$('#herky-thingy').trigger('herky');\n }\n });\n});","enifed('ember/tests/component_context_test', ['@ember/controller', '@ember/-internals/glimmer', 'internal-test-helpers'], function (_controller, _glimmer, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - Component Context', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Components with a block should have the proper content when a template is provided'](assert) {\n this.addTemplate('application', `\n
    \n {{#my-component}}{{text}}{{/my-component}}\n
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n }),\n template: `{{text}}-{{yield}}`\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n ['@test Components with a block should yield the proper content without a template provided'](assert) {\n this.addTemplate('application', `\n
    \n {{#my-component}}{{text}}{{/my-component}}\n
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n })\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'outer', 'The component is composed correctly');\n });\n }\n ['@test Components without a block should have the proper content when a template is provided'](assert) {\n this.addTemplate('application', `\n
    {{my-component}}
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n }),\n template: '{{text}}'\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'inner', 'The component is composed correctly');\n });\n }\n\n ['@test Components without a block should have the proper content'](assert) {\n this.addTemplate('application', `\n
    {{my-component}}
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = 'Some text inserted';\n }\n })\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test properties of a component without a template should not collide with internal structures [DEPRECATED]'](assert) {\n this.addTemplate('application', `\n
    {{my-component data=foo}}
    `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer',\n foo: 'Some text inserted'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = this.get('data');\n }\n })\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test attrs property of a component without a template should not collide with internal structures'](assert) {\n this.addTemplate('application', `\n
    {{my-component attrs=foo}}
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n text: 'outer',\n foo: 'Some text inserted'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = this.get('attrs.attrs.value');\n }\n })\n });\n\n return this.visit('/').then(() => {\n let text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test Components trigger actions in the parents context when called from within a block'](assert) {\n this.addTemplate('application', `\n
    \n {{#my-component}}\n Fizzbuzz\n {{/my-component}}\n
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n fizzbuzz() {\n assert.ok(true, 'action triggered on parent');\n }\n }\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({})\n });\n\n return this.visit('/').then(() => {\n this.$('#fizzbuzz', '#wrapper').click();\n });\n }\n\n ['@test Components trigger actions in the components context when called from within its template'](assert) {\n this.addTemplate('application', `\n
    {{#my-component}}{{text}}{{/my-component}}
    \n `);\n\n this.add('controller:application', _controller.default.extend({\n actions: {\n fizzbuzz() {\n assert.ok(false, 'action on the wrong context');\n }\n }\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n actions: {\n fizzbuzz() {\n assert.ok(true, 'action triggered on component');\n }\n }\n }),\n template: `Fizzbuzz`\n });\n\n return this.visit('/').then(() => {\n this.$('#fizzbuzz', '#wrapper').click();\n });\n }\n });\n});","enifed('ember/tests/component_registration_test', ['@ember/application', '@ember/controller', '@ember/-internals/glimmer', 'ember-template-compiler', 'internal-test-helpers', '@ember/-internals/environment'], function (_application, _controller, _glimmer, _emberTemplateCompiler, _internalTestHelpers, _environment) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - Component Registration', class extends _internalTestHelpers.ApplicationTestCase {\n // This is necessary for this.application.instanceInitializer to not leak between tests\n createApplication(options) {\n return super.createApplication(options, _application.default.extend());\n }\n\n ['@test The helper becomes the body of the component']() {\n this.addTemplate('components/expand-it', '

    hello {{yield}}

    ');\n this.addTemplate('application', 'Hello world {{#expand-it}}world{{/expand-it}}');\n\n return this.visit('/').then(() => {\n this.assertText('Hello world hello world');\n this.assertComponentElement(this.element.firstElementChild, {\n tagName: 'div',\n content: '

    hello world

    '\n });\n });\n }\n\n ['@test The helper becomes the body of the component (ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;)']() {\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;\n this.addTemplate('components/expand-it', '

    hello {{yield}}

    ');\n this.addTemplate('application', 'Hello world {{#expand-it}}world{{/expand-it}}');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello world

    hello world

    ');\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = false;\n });\n }\n\n ['@test If a component is registered, it is used'](assert) {\n this.addTemplate('components/expand-it', '

    hello {{yield}}

    ');\n this.addTemplate('application', `Hello world {{#expand-it}}world{{/expand-it}}`);\n\n this.application.instanceInitializer({\n name: 'expand-it-component',\n initialize(applicationInstance) {\n applicationInstance.register('component:expand-it', _glimmer.Component.extend({\n classNames: 'testing123'\n }));\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('div.testing123').text().trim();\n assert.equal(text, 'hello world', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with custom `layout` property'](assert) {\n this.addTemplate('application', `
    there goes {{my-hero}}
    `);\n\n this.application.instanceInitializer({\n name: 'my-hero-component',\n initialize(applicationInstance) {\n applicationInstance.register('component:my-hero', _glimmer.Component.extend({\n classNames: 'testing123',\n layout: (0, _emberTemplateCompiler.compile)('watch him as he GOES')\n }));\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('#wrapper').text().trim();\n assert.equal(text, 'there goes watch him as he GOES', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with template registered on the container'](assert) {\n this.addTemplate('application', `
    hello world {{sally-rutherford}}-{{#sally-rutherford}}!!!{{/sally-rutherford}}
    `);\n\n this.application.instanceInitializer({\n name: 'sally-rutherford-component-template',\n initialize(applicationInstance) {\n applicationInstance.register('template:components/sally-rutherford', (0, _emberTemplateCompiler.compile)('funkytowny{{yield}}'));\n }\n });\n this.application.instanceInitializer({\n name: 'sally-rutherford-component',\n initialize(applicationInstance) {\n applicationInstance.register('component:sally-rutherford', _glimmer.Component);\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('#wrapper').text().trim();\n assert.equal(text, 'hello world funkytowny-funkytowny!!!', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with ONLY the template registered on the container'](assert) {\n this.addTemplate('application', `
    hello world {{borf-snorlax}}-{{#borf-snorlax}}!!!{{/borf-snorlax}}
    `);\n\n this.application.instanceInitializer({\n name: 'borf-snorlax-component-template',\n initialize(applicationInstance) {\n applicationInstance.register('template:components/borf-snorlax', (0, _emberTemplateCompiler.compile)('goodfreakingTIMES{{yield}}'));\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('#wrapper').text().trim();\n assert.equal(text, 'hello world goodfreakingTIMES-goodfreakingTIMES!!!', 'The component is composed correctly');\n });\n }\n\n ['@test Assigning layoutName to a component should setup the template as a layout'](assert) {\n assert.expect(1);\n\n this.addTemplate('application', `
    {{#my-component}}{{text}}{{/my-component}}
    `);\n this.addTemplate('foo-bar-baz', '{{text}}-{{yield}}');\n\n this.application.instanceInitializer({\n name: 'application-controller',\n initialize(applicationInstance) {\n applicationInstance.register('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n }\n });\n this.application.instanceInitializer({\n name: 'my-component-component',\n initialize(applicationInstance) {\n applicationInstance.register('component:my-component', _glimmer.Component.extend({\n text: 'inner',\n layoutName: 'foo-bar-baz'\n }));\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('#wrapper').text().trim();\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n ['@test Assigning layoutName and layout to a component should use the `layout` value'](assert) {\n assert.expect(1);\n\n this.addTemplate('application', `
    {{#my-component}}{{text}}{{/my-component}}
    `);\n this.addTemplate('foo-bar-baz', 'No way!');\n\n this.application.instanceInitializer({\n name: 'application-controller-layout',\n initialize(applicationInstance) {\n applicationInstance.register('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n }\n });\n this.application.instanceInitializer({\n name: 'my-component-component-layout',\n initialize(applicationInstance) {\n applicationInstance.register('component:my-component', _glimmer.Component.extend({\n text: 'inner',\n layoutName: 'foo-bar-baz',\n layout: (0, _emberTemplateCompiler.compile)('{{text}}-{{yield}}')\n }));\n }\n });\n\n return this.visit('/').then(() => {\n let text = this.$('#wrapper').text().trim();\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n ['@test Using name of component that does not exist']() {\n this.addTemplate('application', `
    {{#no-good}} {{/no-good}}
    `);\n\n // TODO: Use the async form of expectAssertion here when it is available\n expectAssertion(() => {\n this.visit('/');\n }, /.* named \"no-good\" .*/);\n\n return this.runLoopSettled();\n }\n });\n});","enifed('ember/tests/controller_test', ['@ember/controller', 'internal-test-helpers', '@ember/-internals/glimmer'], function (_controller, _internalTestHelpers, _glimmer) {\n 'use strict';\n\n /*\n In Ember 1.x, controllers subtly affect things like template scope\n and action targets in exciting and often inscrutable ways. This test\n file contains integration tests that verify the correct behavior of\n the many parts of the system that change and rely upon controller scope,\n from the runtime up to the templating layer.\n */\n\n (0, _internalTestHelpers.moduleFor)('Template scoping examples', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Actions inside an outlet go to the associated controller'](assert) {\n this.add('controller:index', _controller.default.extend({\n actions: {\n componentAction() {\n assert.ok(true, 'controller received the action');\n }\n }\n }));\n\n this.addComponent('component-with-action', {\n ComponentClass: _glimmer.Component.extend({\n classNames: ['component-with-action'],\n click() {\n this.action();\n }\n })\n });\n\n this.addTemplate('index', '{{component-with-action action=(action \"componentAction\")}}');\n\n return this.visit('/').then(() => {\n this.runTask(() => this.$('.component-with-action').click());\n });\n }\n });\n});","enifed('ember/tests/error_handler_test', ['@ember/debug', '@ember/runloop', '@ember/-internals/error-handling', 'rsvp', 'internal-test-helpers'], function (_debug, _runloop, _errorHandling, _rsvp, _internalTestHelpers) {\n 'use strict';\n\n let WINDOW_ONERROR;\n\n function runThatThrowsSync(message = 'Error for testing error handling') {\n return (0, _runloop.run)(() => {\n throw new Error(message);\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('error_handler', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n // capturing this outside of module scope to ensure we grab\n // the test frameworks own window.onerror to reset it\n WINDOW_ONERROR = window.onerror;\n }\n\n afterEach() {\n (0, _debug.setTesting)(_debug.isTesting);\n window.onerror = WINDOW_ONERROR;\n\n (0, _errorHandling.setOnerror)(undefined);\n }\n\n ['@test by default there is no onerror - sync run'](assert) {\n assert.strictEqual((0, _errorHandling.getOnerror)(), undefined, 'precond - there should be no Ember.onerror set by default');\n assert.throws(runThatThrowsSync, Error, 'errors thrown sync are catchable');\n }\n\n ['@test when Ember.onerror (which rethrows) is registered - sync run'](assert) {\n assert.expect(2);\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'onerror called');\n throw error;\n });\n assert.throws(runThatThrowsSync, Error, 'error is thrown');\n }\n\n ['@test when Ember.onerror (which does not rethrow) is registered - sync run'](assert) {\n assert.expect(2);\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror called');\n });\n runThatThrowsSync();\n assert.ok(true, 'no error was thrown, Ember.onerror can intercept errors');\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = true, no Ember.onerror) - sync run'](assert) {\n (0, _debug.setTesting)(true);\n\n let error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = false, no Ember.onerror) - sync run'](assert) {\n (0, _debug.setTesting)(false);\n let error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test does not swallow exceptions (Ember.testing = false, Ember.onerror which rethrows) - sync run'](assert) {\n assert.expect(2);\n (0, _debug.setTesting)(false);\n\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'Ember.onerror was called');\n throw error;\n });\n\n let error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test Ember.onerror can intercept errors (aka swallow) by not rethrowing (Ember.testing = false) - sync run'](assert) {\n assert.expect(1);\n (0, _debug.setTesting)(false);\n\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'Ember.onerror was called');\n });\n\n let error = new Error('the error');\n try {\n (0, _runloop.run)(() => {\n throw error;\n });\n } catch (e) {\n assert.notOk(true, 'Ember.onerror that does not rethrow is intentionally swallowing errors, try / catch wrapping does not see error');\n }\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = true, no Ember.onerror) - async run'](assert) {\n let done = assert.async();\n let caughtByWindowOnerror;\n\n (0, _debug.setTesting)(true);\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message;\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n (0, _runloop.later)(() => {\n throw new Error('the error');\n }, 10);\n\n setTimeout(() => {\n assert.pushResult({\n result: /the error/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n done();\n }, 20);\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = false, no Ember.onerror) - async run'](assert) {\n let done = assert.async();\n let caughtByWindowOnerror;\n\n (0, _debug.setTesting)(false);\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message;\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n (0, _runloop.later)(() => {\n throw new Error('the error');\n }, 10);\n\n setTimeout(() => {\n assert.pushResult({\n result: /the error/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n done();\n }, 20);\n }\n\n ['@test Ember.onerror can intercept errors (aka swallow) by not rethrowing (Ember.testing = false) - async run'](assert) {\n let done = assert.async();\n\n (0, _debug.setTesting)(false);\n\n window.onerror = function () {\n assert.notOk(true, 'window.onerror is never invoked when Ember.onerror intentionally swallows errors');\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called with the error');\n });\n\n (0, _runloop.later)(() => {\n throw thrown;\n }, 10);\n\n setTimeout(done, 20);\n }\n\n [`@test errors in promise constructor when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does rethrow is present - rsvp`](assert) {\n assert.expect(2);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(2);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does rethrow is present - rsvp`](assert) {\n assert.expect(2);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(2);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does rethrow is present - rsvp`](assert) {\n assert.expect(2);\n\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(2);\n\n (0, _debug.setTesting)(false);\n let thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n });\n\n window.onerror = function (message) {\n assert.pushResult({\n result: /the error/.test(message),\n actual: message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n\n // prevent \"bubbling\" and therefore failing the test\n return true;\n };\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n });\n\n // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n });\n});","enifed('ember/tests/helpers/helper_registration_test', ['internal-test-helpers', '@ember/controller', '@ember/service', '@ember/-internals/glimmer'], function (_internalTestHelpers, _controller, _service, _glimmer) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - Helper Registration', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Unbound dashed helpers registered on the container can be late-invoked'](assert) {\n this.addTemplate('application', `
    {{x-borf}} {{x-borf 'YES'}}
    `);\n\n let myHelper = (0, _glimmer.helper)(params => params[0] || 'BORF');\n this.application.register('helper:x-borf', myHelper);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#wrapper').text(), 'BORF YES', 'The helper was invoked from the container');\n });\n }\n\n ['@test Bound helpers registered on the container can be late-invoked'](assert) {\n this.addTemplate('application', `
    {{x-reverse}} {{x-reverse foo}}
    `);\n\n this.add('controller:application', _controller.default.extend({\n foo: 'alex'\n }));\n\n this.application.register('helper:x-reverse', (0, _glimmer.helper)(function ([value]) {\n return value ? value.split('').reverse().join('') : '--';\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#wrapper').text(), '-- xela', 'The bound helper was invoked from the container');\n });\n }\n\n ['@test Undashed helpers registered on the container can be invoked'](assert) {\n this.addTemplate('application', `
    {{omg}}|{{yorp 'boo'}}|{{yorp 'ya'}}
    `);\n\n this.application.register('helper:omg', (0, _glimmer.helper)(() => 'OMG'));\n\n this.application.register('helper:yorp', (0, _glimmer.helper)(([value]) => value));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#wrapper').text(), 'OMG|boo|ya', 'The helper was invoked from the container');\n });\n }\n\n ['@test Helpers can receive injections'](assert) {\n this.addTemplate('application', `
    {{full-name}}
    `);\n\n let serviceCalled = false;\n\n this.add('service:name-builder', _service.default.extend({\n build() {\n serviceCalled = true;\n }\n }));\n\n this.add('helper:full-name', _glimmer.Helper.extend({\n nameBuilder: (0, _service.inject)('name-builder'),\n compute() {\n this.get('nameBuilder').build();\n }\n }));\n\n return this.visit('/').then(() => {\n assert.ok(serviceCalled, 'service was injected, method called');\n });\n }\n });\n});","enifed('ember/tests/helpers/link_to_test', ['internal-test-helpers', '@ember/controller', '@ember/-internals/runtime', '@ember/-internals/metal', '@ember/instrumentation', '@ember/-internals/routing'], function (_internalTestHelpers, _controller, _runtime, _metal, _instrumentation, _routing) {\n 'use strict';\n\n // IE includes the host name\n function normalizeUrl(url) {\n return url.replace(/https?:\\/\\/[^\\/]+/, '');\n }\n\n function shouldNotBeActive(assert, element) {\n checkActive(assert, element, false);\n }\n\n function shouldBeActive(assert, element) {\n checkActive(assert, element, true);\n }\n\n function checkActive(assert, element, active) {\n let classList = element.attr('class');\n assert.equal(classList.indexOf('active') > -1, active, `${element} active should be ${active}`);\n }\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper - basic tests', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'index' id='self-link'}}Self{{/link-to}}\n `);\n this.addTemplate('about', `\n

    About

    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n {{#link-to 'about' id='self-link'}}Self{{/link-to}}\n `);\n }\n\n ['@test The {{link-to}} helper moves into the named route'](assert) {\n return this.visit('/').then(() => {\n assert.equal(this.$('h3.home').length, 1, 'The home template was rendered');\n assert.equal(this.$('#self-link.active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#about-link:not(.active)').length, 1, 'The other link was rendered without active class');\n\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.$('h3.about').length, 1, 'The about template was rendered');\n assert.equal(this.$('#self-link.active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#home-link:not(.active)').length, 1, 'The other link was rendered without active class');\n });\n }\n\n [`@test the {{link-to}} helper doesn't add an href when the tagName isn't 'a'`](assert) {\n this.addTemplate('index', `\n {{#link-to 'about' id='about-link' tagName='div'}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#about-link').attr('href'), undefined, 'there is no href attribute');\n });\n }\n\n [`@test the {{link-to}} applies a 'disabled' class when disabled`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link-static\" disabledWhen=\"shouldDisable\"}}About{{/link-to}}\n {{#link-to \"about\" id=\"about-link-dynamic\" disabledWhen=dynamicDisabledWhen}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n shouldDisable: true,\n dynamicDisabledWhen: 'shouldDisable'\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#about-link-static.disabled').length, 1, 'The static link is disabled when its disabledWhen is true');\n assert.equal(this.$('#about-link-dynamic.disabled').length, 1, 'The dynamic link is disabled when its disabledWhen is true');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => controller.set('dynamicDisabledWhen', false));\n\n assert.equal(this.$('#about-link-dynamic.disabled').length, 0, 'The dynamic link is re-enabled when its disabledWhen becomes false');\n });\n }\n\n [`@test the {{link-to}} doesn't apply a 'disabled' class if disabledWhen is not provided`](assert) {\n this.addTemplate('index', `{{#link-to \"about\" id=\"about-link\"}}About{{/link-to}}`);\n\n return this.visit('/').then(() => {\n assert.ok(!this.$('#about-link').hasClass('disabled'), 'The link is not disabled if disabledWhen not provided');\n });\n }\n\n [`@test the {{link-to}} helper supports a custom disabledClass`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link\" disabledWhen=true disabledClass=\"do-not-want\"}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#about-link.do-not-want').length, 1, 'The link can apply a custom disabled class');\n });\n }\n\n [`@test the {{link-to}} helper supports a custom disabledClass set via bound param`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link\" disabledWhen=true disabledClass=disabledClass}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n disabledClass: 'do-not-want'\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#about-link.do-not-want').length, 1, 'The link can apply a custom disabled class via bound param');\n });\n }\n\n [`@test the {{link-to}} helper does not respond to clicks when disabledWhen`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link\" disabledWhen=true}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.$('h3.about').length, 0, 'Transitioning did not occur');\n });\n }\n\n [`@test the {{link-to}} helper does not respond to clicks when disabled`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link\" disabled=true}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.$('h3.about').length, 0, 'Transitioning did not occur');\n });\n }\n\n [`@test the {{link-to}} helper responds to clicks according to its disabledWhen bound param`](assert) {\n this.addTemplate('index', `\n {{#link-to \"about\" id=\"about-link\" disabledWhen=disabledWhen}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n disabledWhen: true\n }));\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.$('h3.about').length, 0, 'Transitioning did not occur');\n\n let controller = this.applicationInstance.lookup('controller:index');\n controller.set('disabledWhen', false);\n\n return this.runLoopSettled();\n }).then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.$('h3.about').length, 1, 'Transitioning did occur when disabledWhen became false');\n });\n }\n\n [`@test The {{link-to}} helper supports a custom activeClass`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'index' id='self-link' activeClass='zomg-active'}}Self{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('h3.home').length, 1, 'The home template was rendered');\n assert.equal(this.$('#self-link.zomg-active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#about-link:not(.active)').length, 1, 'The other link was rendered without active class');\n });\n }\n\n [`@test The {{link-to}} helper supports a custom activeClass from a bound param`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'index' id='self-link' activeClass=activeClass}}Self{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n activeClass: 'zomg-active'\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('h3.home').length, 1, 'The home template was rendered');\n assert.equal(this.$('#self-link.zomg-active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#about-link:not(.active)').length, 1, 'The other link was rendered without active class');\n });\n }\n\n [`@test The {{link-to}} helper supports 'classNameBindings' with custom values [GH #11699]`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link' classNameBindings='foo:foo-is-true:foo-is-false'}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n foo: false\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#about-link.foo-is-false').length, 1, 'The about-link was rendered with the falsy class');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => controller.set('foo', true));\n\n assert.equal(this.$('#about-link.foo-is-true').length, 1, 'The about-link was rendered with the truthy class after toggling the property');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper - location hooks', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.updateCount = 0;\n this.replaceCount = 0;\n\n let testContext = this;\n this.add('location:none', _routing.NoneLocation.extend({\n setURL() {\n testContext.updateCount++;\n return this._super(...arguments);\n },\n replaceURL() {\n testContext.replaceCount++;\n return this._super(...arguments);\n }\n }));\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'index' id='self-link'}}Self{{/link-to}}\n `);\n this.addTemplate('about', `\n

    About

    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n {{#link-to 'about' id='self-link'}}Self{{/link-to}}\n `);\n }\n\n visit() {\n return super.visit(...arguments).then(() => {\n this.updateCountAfterVisit = this.updateCount;\n this.replaceCountAfterVisit = this.replaceCount;\n });\n }\n\n ['@test The {{link-to}} helper supports URL replacement'](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link' replace=true}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.updateCount, this.updateCountAfterVisit, 'setURL should not be called');\n assert.equal(this.replaceCount, this.replaceCountAfterVisit + 1, 'replaceURL should be called once');\n });\n }\n\n ['@test The {{link-to}} helper supports URL replacement via replace=boundTruthyThing'](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link' replace=boundTruthyThing}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n boundTruthyThing: true\n }));\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.updateCount, this.updateCountAfterVisit, 'setURL should not be called');\n assert.equal(this.replaceCount, this.replaceCountAfterVisit + 1, 'replaceURL should be called once');\n });\n }\n\n ['@test The {{link-to}} helper supports setting replace=boundFalseyThing'](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link' replace=boundFalseyThing}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n boundFalseyThing: false\n }));\n\n return this.visit('/').then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(this.updateCount, this.updateCountAfterVisit + 1, 'setURL should be called');\n assert.equal(this.replaceCount, this.replaceCountAfterVisit, 'replaceURL should not be called');\n });\n }\n });\n\n if (false /* EMBER_IMPROVED_INSTRUMENTATION */) {\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper with EMBER_IMPROVED_INSTRUMENTATION', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'index' id='self-link'}}Self{{/link-to}}\n `);\n this.addTemplate('about', `\n

    About

    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n {{#link-to 'about' id='self-link'}}Self{{/link-to}}\n `);\n }\n\n beforeEach() {\n return this.visit('/');\n }\n\n afterEach() {\n (0, _instrumentation.reset)();\n\n return super.afterEach();\n }\n\n ['@test The {{link-to}} helper fires an interaction event'](assert) {\n assert.expect(2);\n\n (0, _instrumentation.subscribe)('interaction.link-to', {\n before() {\n assert.ok(true, 'instrumentation subscriber was called');\n },\n after() {\n assert.ok(true, 'instrumentation subscriber was called');\n }\n });\n\n return this.click('#about-link');\n }\n\n ['@test The {{link-to}} helper interaction event includes the route name'](assert) {\n assert.expect(2);\n\n (0, _instrumentation.subscribe)('interaction.link-to', {\n before(name, timestamp, { routeName }) {\n assert.equal(routeName, 'about', 'instrumentation subscriber was passed route name');\n },\n after(name, timestamp, { routeName }) {\n assert.equal(routeName, 'about', 'instrumentation subscriber was passed route name');\n }\n });\n\n return this.click('#about-link');\n }\n\n ['@test The {{link-to}} helper interaction event includes the transition in the after hook'](assert) {\n assert.expect(1);\n\n (0, _instrumentation.subscribe)('interaction.link-to', {\n before() {},\n after(name, timestamp, { transition }) {\n assert.equal(transition.targetName, 'about', 'instrumentation subscriber was passed route name');\n }\n });\n\n return this.click('#about-link');\n }\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper - nested routes and link-to arguments', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test The {{link-to}} helper supports leaving off .index for nested routes'](assert) {\n this.router.map(function () {\n this.route('about', function () {\n this.route('item');\n });\n });\n\n this.addTemplate('about', `

    About

    {{outlet}}`);\n this.addTemplate('about.index', `
    Index
    `);\n this.addTemplate('about.item', `
    {{#link-to 'about'}}About{{/link-to}}
    `);\n\n return this.visit('/about/item').then(() => {\n assert.equal(normalizeUrl(this.$('#item a').attr('href')), '/about');\n });\n }\n\n [`@test The {{link-to}} helper supports custom, nested, current-when`](assert) {\n this.router.map(function () {\n this.route('index', { path: '/' }, function () {\n this.route('about');\n });\n\n this.route('item');\n });\n\n this.addTemplate('index', `

    Home

    {{outlet}}`);\n this.addTemplate('index.about', `\n {{#link-to 'item' id='other-link' current-when='index'}}ITEM{{/link-to}}\n `);\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('#other-link.active').length, 1, 'The link is active since current-when is a parent route');\n });\n }\n\n [`@test The {{link-to}} helper does not disregard current-when when it is given explicitly for a route`](assert) {\n this.router.map(function () {\n this.route('index', { path: '/' }, function () {\n this.route('about');\n });\n\n this.route('items', function () {\n this.route('item');\n });\n });\n\n this.addTemplate('index', `

    Home

    {{outlet}}`);\n this.addTemplate('index.about', `\n {{#link-to 'items' id='other-link' current-when='index'}}ITEM{{/link-to}}\n `);\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('#other-link.active').length, 1, 'The link is active when current-when is given for explicitly for a route');\n });\n }\n\n ['@test The {{link-to}} helper does not disregard current-when when it is set via a bound param'](assert) {\n this.router.map(function () {\n this.route('index', { path: '/' }, function () {\n this.route('about');\n });\n\n this.route('items', function () {\n this.route('item');\n });\n });\n\n this.add('controller:index.about', _controller.default.extend({\n currentWhen: 'index'\n }));\n\n this.addTemplate('index', `

    Home

    {{outlet}}`);\n this.addTemplate('index.about', `{{#link-to 'items' id='other-link' current-when=currentWhen}}ITEM{{/link-to}}`);\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('#other-link.active').length, 1, 'The link is active when current-when is given for explicitly for a route');\n });\n }\n\n ['@test The {{link-to}} helper supports multiple current-when routes'](assert) {\n this.router.map(function () {\n this.route('index', { path: '/' }, function () {\n this.route('about');\n });\n this.route('item');\n this.route('foo');\n });\n\n this.addTemplate('index', `

    Home

    {{outlet}}`);\n this.addTemplate('index.about', `{{#link-to 'item' id='link1' current-when='item index'}}ITEM{{/link-to}}`);\n this.addTemplate('item', `{{#link-to 'item' id='link2' current-when='item index'}}ITEM{{/link-to}}`);\n this.addTemplate('foo', `{{#link-to 'item' id='link3' current-when='item index'}}ITEM{{/link-to}}`);\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('#link1.active').length, 1, 'The link is active since current-when contains the parent route');\n\n return this.visit('/item');\n }).then(() => {\n assert.equal(this.$('#link2.active').length, 1, 'The link is active since you are on the active route');\n\n return this.visit('/foo');\n }).then(() => {\n assert.equal(this.$('#link3.active').length, 0, 'The link is not active since current-when does not contain the active route');\n });\n }\n\n ['@test The {{link-to}} helper supports boolean values for current-when'](assert) {\n this.router.map(function () {\n this.route('index', { path: '/' }, function () {\n this.route('about');\n });\n this.route('item');\n });\n\n this.addTemplate('index.about', `\n {{#link-to 'index' id='index-link' current-when=isCurrent}}index{{/link-to}}\n {{#link-to 'item' id='about-link' current-when=true}}ITEM{{/link-to}}\n `);\n\n this.add('controller:index.about', _controller.default.extend({ isCurrent: false }));\n\n return this.visit('/about').then(() => {\n assert.ok(this.$('#about-link').hasClass('active'), 'The link is active since current-when is true');\n assert.notOk(this.$('#index-link').hasClass('active'), 'The link is not active since current-when is false');\n\n let controller = this.applicationInstance.lookup('controller:index.about');\n this.runTask(() => controller.set('isCurrent', true));\n\n assert.ok(this.$('#index-link').hasClass('active'), 'The link is active since current-when is true');\n });\n }\n\n ['@test The {{link-to}} helper defaults to bubbling'](assert) {\n this.addTemplate('about', `\n
    \n {{#link-to 'about.contact' id='about-contact'}}About{{/link-to}}\n
    \n {{outlet}}\n `);\n this.addTemplate('about.contact', `\n

    Contact

    \n `);\n\n this.router.map(function () {\n this.route('about', function () {\n this.route('contact');\n });\n });\n\n let hidden = 0;\n\n this.add('route:about', _routing.Route.extend({\n actions: {\n hide() {\n hidden++;\n }\n }\n }));\n\n return this.visit('/about').then(() => {\n return this.click('#about-contact');\n }).then(() => {\n assert.equal(this.$('#contact').text(), 'Contact', 'precond - the link worked');\n\n assert.equal(hidden, 1, 'The link bubbles');\n });\n }\n\n [`@test The {{link-to}} helper supports bubbles=false`](assert) {\n this.addTemplate('about', `\n
    \n {{#link-to 'about.contact' id='about-contact' bubbles=false}}\n About\n {{/link-to}}\n
    \n {{outlet}}\n `);\n this.addTemplate('about.contact', `

    Contact

    `);\n\n this.router.map(function () {\n this.route('about', function () {\n this.route('contact');\n });\n });\n\n let hidden = 0;\n\n this.add('route:about', _routing.Route.extend({\n actions: {\n hide() {\n hidden++;\n }\n }\n }));\n\n return this.visit('/about').then(() => {\n return this.click('#about-contact');\n }).then(() => {\n assert.equal(this.$('#contact').text(), 'Contact', 'precond - the link worked');\n\n assert.equal(hidden, 0, \"The link didn't bubble\");\n });\n }\n\n [`@test The {{link-to}} helper supports bubbles=boundFalseyThing`](assert) {\n this.addTemplate('about', `\n
    \n {{#link-to 'about.contact' id='about-contact' bubbles=boundFalseyThing}}\n About\n {{/link-to}}\n
    \n {{outlet}}\n `);\n this.addTemplate('about.contact', `

    Contact

    `);\n\n this.add('controller:about', _controller.default.extend({\n boundFalseyThing: false\n }));\n\n this.router.map(function () {\n this.route('about', function () {\n this.route('contact');\n });\n });\n\n let hidden = 0;\n\n this.add('route:about', _routing.Route.extend({\n actions: {\n hide() {\n hidden++;\n }\n }\n }));\n\n return this.visit('/about').then(() => {\n return this.click('#about-contact');\n }).then(() => {\n assert.equal(this.$('#contact').text(), 'Contact', 'precond - the link worked');\n assert.equal(hidden, 0, \"The link didn't bubble\");\n });\n }\n\n [`@test The {{link-to}} helper moves into the named route with context`](assert) {\n this.router.map(function () {\n this.route('about');\n this.route('item', { path: '/item/:id' });\n });\n\n this.addTemplate('about', `\n

    List

    \n
      \n {{#each model as |person|}}\n
    • \n {{#link-to 'item' person id=person.id}}\n {{person.name}}\n {{/link-to}}\n
    • \n {{/each}}\n
    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n `);\n\n this.addTemplate('item', `\n

    Item

    \n

    {{model.name}}

    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n `);\n\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n `);\n\n this.add('route:about', _routing.Route.extend({\n model() {\n return [{ id: 'yehuda', name: 'Yehuda Katz' }, { id: 'tom', name: 'Tom Dale' }, { id: 'erik', name: 'Erik Brynroflsson' }];\n }\n }));\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('h3.list').length, 1, 'The home template was rendered');\n assert.equal(normalizeUrl(this.$('#home-link').attr('href')), '/', 'The home link points back at /');\n\n return this.click('#yehuda');\n }).then(() => {\n assert.equal(this.$('h3.item').length, 1, 'The item template was rendered');\n assert.equal(this.$('p').text(), 'Yehuda Katz', 'The name is correct');\n\n return this.click('#home-link');\n }).then(() => {\n return this.click('#about-link');\n }).then(() => {\n assert.equal(normalizeUrl(this.$('li a#yehuda').attr('href')), '/item/yehuda');\n assert.equal(normalizeUrl(this.$('li a#tom').attr('href')), '/item/tom');\n assert.equal(normalizeUrl(this.$('li a#erik').attr('href')), '/item/erik');\n\n return this.click('#erik');\n }).then(() => {\n assert.equal(this.$('h3.item').length, 1, 'The item template was rendered');\n assert.equal(this.$('p').text(), 'Erik Brynroflsson', 'The name is correct');\n });\n }\n\n [`@test The {{link-to}} helper binds some anchor html tag common attributes`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'index' id='self-link' title='title-attr' rel='rel-attr' tabindex='-1'}}\n Self\n {{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let link = this.$('#self-link');\n assert.equal(link.attr('title'), 'title-attr', 'The self-link contains title attribute');\n assert.equal(link.attr('rel'), 'rel-attr', 'The self-link contains rel attribute');\n assert.equal(link.attr('tabindex'), '-1', 'The self-link contains tabindex attribute');\n });\n }\n\n [`@test The {{link-to}} helper supports 'target' attribute`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'index' id='self-link' target='_blank'}}Self{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let link = this.$('#self-link');\n assert.equal(link.attr('target'), '_blank', 'The self-link contains `target` attribute');\n });\n }\n\n [`@test The {{link-to}} helper supports 'target' attribute specified as a bound param`](assert) {\n this.addTemplate('index', `

    Home

    {{#link-to 'index' id='self-link' target=boundLinkTarget}}Self{{/link-to}}`);\n\n this.add('controller:index', _controller.default.extend({\n boundLinkTarget: '_blank'\n }));\n\n return this.visit('/').then(() => {\n let link = this.$('#self-link');\n assert.equal(link.attr('target'), '_blank', 'The self-link contains `target` attribute');\n });\n }\n\n [`@test the {{link-to}} helper calls preventDefault`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assertNav({ prevented: true }, () => this.$('#about-link').click(), assert);\n });\n }\n\n [`@test the {{link-to}} helper does not call preventDefault if 'preventDefault=false' is passed as an option`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to 'about' id='about-link' preventDefault=false}}About{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assertNav({ prevented: false }, () => this.$('#about-link').trigger('click'), assert);\n });\n }\n\n [`@test the {{link-to}} helper does not call preventDefault if 'preventDefault=boundFalseyThing' is passed as an option`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to 'about' id='about-link' preventDefault=boundFalseyThing}}About{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n boundFalseyThing: false\n }));\n\n return this.visit('/').then(() => {\n assertNav({ prevented: false }, () => this.$('#about-link').trigger('click'), assert);\n });\n }\n\n [`@test The {{link-to}} helper does not call preventDefault if 'target' attribute is provided`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'index' id='self-link' target='_blank'}}Self{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assertNav({ prevented: false }, () => this.$('#self-link').click(), assert);\n });\n }\n\n [`@test The {{link-to}} helper should preventDefault when 'target = _self'`](assert) {\n this.addTemplate('index', `\n

    Home

    \n {{#link-to 'index' id='self-link' target='_self'}}Self{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assertNav({ prevented: true }, () => this.$('#self-link').click(), assert);\n });\n }\n\n [`@test The {{link-to}} helper should not transition if target is not equal to _self or empty`](assert) {\n this.addTemplate('index', `\n {{#link-to 'about' id='about-link' replace=true target='_blank'}}\n About\n {{/link-to}}\n `);\n\n this.router.map(function () {\n this.route('about');\n });\n\n return this.visit('/').then(() => this.click('#about-link')).then(() => {\n let currentRouteName = this.applicationInstance.lookup('controller:application').get('currentRouteName');\n assert.notEqual(currentRouteName, 'about', 'link-to should not transition if target is not equal to _self or empty');\n });\n }\n\n [`@test The {{link-to}} helper accepts string/numeric arguments`](assert) {\n this.router.map(function () {\n this.route('filter', { path: '/filters/:filter' });\n this.route('post', { path: '/post/:post_id' });\n this.route('repo', { path: '/repo/:owner/:name' });\n });\n\n this.add('controller:filter', _controller.default.extend({\n filter: 'unpopular',\n repo: { owner: 'ember', name: 'ember.js' },\n post_id: 123\n }));\n\n this.addTemplate('filter', `\n

    {{filter}}

    \n {{#link-to \"filter\" \"unpopular\" id=\"link\"}}Unpopular{{/link-to}}\n {{#link-to \"filter\" filter id=\"path-link\"}}Unpopular{{/link-to}}\n {{#link-to \"post\" post_id id=\"post-path-link\"}}Post{{/link-to}}\n {{#link-to \"post\" 123 id=\"post-number-link\"}}Post{{/link-to}}\n {{#link-to \"repo\" repo id=\"repo-object-link\"}}Repo{{/link-to}}\n `);\n\n return this.visit('/filters/popular').then(() => {\n assert.equal(normalizeUrl(this.$('#link').attr('href')), '/filters/unpopular');\n assert.equal(normalizeUrl(this.$('#path-link').attr('href')), '/filters/unpopular');\n assert.equal(normalizeUrl(this.$('#post-path-link').attr('href')), '/post/123');\n assert.equal(normalizeUrl(this.$('#post-number-link').attr('href')), '/post/123');\n assert.equal(normalizeUrl(this.$('#repo-object-link').attr('href')), '/repo/ember/ember.js');\n });\n }\n\n [`@test Issue 4201 - Shorthand for route.index shouldn't throw errors about context arguments`](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('lobby', function () {\n this.route('index', { path: ':lobby_id' });\n this.route('list');\n });\n });\n\n this.add('route:lobby.index', _routing.Route.extend({\n model(params) {\n assert.equal(params.lobby_id, 'foobar');\n return params.lobby_id;\n }\n }));\n\n this.addTemplate('lobby.index', `\n {{#link-to 'lobby' 'foobar' id='lobby-link'}}Lobby{{/link-to}}\n `);\n this.addTemplate('lobby.list', `\n {{#link-to 'lobby' 'foobar' id='lobby-link'}}Lobby{{/link-to}}\n `);\n\n return this.visit('/lobby/list').then(() => this.click('#lobby-link')).then(() => shouldBeActive(assert, this.$('#lobby-link')));\n }\n\n [`@test Quoteless route param performs property lookup`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to 'index' id='string-link'}}string{{/link-to}}\n {{#link-to foo id='path-link'}}path{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n foo: 'index'\n }));\n\n let assertEquality = href => {\n assert.equal(normalizeUrl(this.$('#string-link').attr('href')), '/');\n assert.equal(normalizeUrl(this.$('#path-link').attr('href')), href);\n };\n\n return this.visit('/').then(() => {\n assertEquality('/');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => controller.set('foo', 'about'));\n\n assertEquality('/about');\n });\n }\n\n [`@test The {{link-to}} helper refreshes href element when one of params changes`](assert) {\n this.router.map(function () {\n this.route('post', { path: '/posts/:post_id' });\n });\n\n let post = { id: '1' };\n let secondPost = { id: '2' };\n\n this.addTemplate('index', `\n {{#link-to \"post\" post id=\"post\"}}post{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend());\n\n return this.visit('/').then(() => {\n let indexController = this.applicationInstance.lookup('controller:index');\n this.runTask(() => indexController.set('post', post));\n\n assert.equal(normalizeUrl(this.$('#post').attr('href')), '/posts/1', 'precond - Link has rendered href attr properly');\n\n this.runTask(() => indexController.set('post', secondPost));\n\n assert.equal(this.$('#post').attr('href'), '/posts/2', 'href attr was updated after one of the params had been changed');\n\n this.runTask(() => indexController.set('post', null));\n\n assert.equal(this.$('#post').attr('href'), '#', 'href attr becomes # when one of the arguments in nullified');\n });\n }\n\n [`@test The {{link-to}} helper is active when a route is active`](assert) {\n this.router.map(function () {\n this.route('about', function () {\n this.route('item');\n });\n });\n\n this.addTemplate('about', `\n
    \n {{#link-to 'about' id='about-link'}}About{{/link-to}}\n {{#link-to 'about.item' id='item-link'}}Item{{/link-to}}\n {{outlet}}\n
    \n `);\n\n return this.visit('/about').then(() => {\n assert.equal(this.$('#about-link.active').length, 1, 'The about route link is active');\n assert.equal(this.$('#item-link.active').length, 0, 'The item route link is inactive');\n\n return this.visit('/about/item');\n }).then(() => {\n assert.equal(this.$('#about-link.active').length, 1, 'The about route link is active');\n assert.equal(this.$('#item-link.active').length, 1, 'The item route link is active');\n });\n }\n\n [`@test The {{link-to}} helper works in an #each'd array of string route names`](assert) {\n this.router.map(function () {\n this.route('foo');\n this.route('bar');\n this.route('rar');\n });\n\n this.add('controller:index', _controller.default.extend({\n routeNames: (0, _runtime.A)(['foo', 'bar', 'rar']),\n route1: 'bar',\n route2: 'foo'\n }));\n\n this.addTemplate('index', `\n {{#each routeNames as |routeName|}}\n {{#link-to routeName}}{{routeName}}{{/link-to}}\n {{/each}}\n {{#each routeNames as |r|}}\n {{#link-to r}}{{r}}{{/link-to}}\n {{/each}}\n {{#link-to route1}}a{{/link-to}}\n {{#link-to route2}}b{{/link-to}}\n `);\n\n let linksEqual = (links, expected) => {\n assert.equal(links.length, expected.length, 'Has correct number of links');\n\n let idx;\n for (idx = 0; idx < links.length; idx++) {\n let href = this.$(links[idx]).attr('href');\n // Old IE includes the whole hostname as well\n assert.equal(href.slice(-expected[idx].length), expected[idx], `Expected link to be '${expected[idx]}', but was '${href}'`);\n }\n };\n\n return this.visit('/').then(() => {\n linksEqual(this.$('a'), ['/foo', '/bar', '/rar', '/foo', '/bar', '/rar', '/bar', '/foo']);\n\n let indexController = this.applicationInstance.lookup('controller:index');\n this.runTask(() => indexController.set('route1', 'rar'));\n\n linksEqual(this.$('a'), ['/foo', '/bar', '/rar', '/foo', '/bar', '/rar', '/rar', '/foo']);\n\n this.runTask(() => indexController.routeNames.shiftObject());\n\n linksEqual(this.$('a'), ['/bar', '/rar', '/bar', '/rar', '/rar', '/foo']);\n });\n }\n\n [`@test The non-block form {{link-to}} helper moves into the named route`](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('contact');\n });\n\n this.addTemplate('index', `\n

    Home

    \n {{link-to 'Contact us' 'contact' id='contact-link'}}\n {{#link-to 'index' id='self-link'}}Self{{/link-to}}\n `);\n this.addTemplate('contact', `\n

    Contact

    \n {{link-to 'Home' 'index' id='home-link'}}\n {{link-to 'Self' 'contact' id='self-link'}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#contact-link');\n }).then(() => {\n assert.equal(this.$('h3.contact').length, 1, 'The contact template was rendered');\n assert.equal(this.$('#self-link.active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#home-link:not(.active)').length, 1, 'The other link was rendered without active class');\n });\n }\n\n [`@test The non-block form {{link-to}} helper updates the link text when it is a binding`](assert) {\n assert.expect(8);\n this.router.map(function () {\n this.route('contact');\n });\n\n this.add('controller:index', _controller.default.extend({\n contactName: 'Jane'\n }));\n\n this.addTemplate('index', `\n

    Home

    \n {{link-to contactName 'contact' id='contact-link'}}\n {{#link-to 'index' id='self-link'}}Self{{/link-to}}\n `);\n this.addTemplate('contact', `\n

    Contact

    \n {{link-to 'Home' 'index' id='home-link'}}\n {{link-to 'Self' 'contact' id='self-link'}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#contact-link').text(), 'Jane', 'The link title is correctly resolved');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => controller.set('contactName', 'Joe'));\n\n assert.equal(this.$('#contact-link').text(), 'Joe', 'The link title is correctly updated when the bound property changes');\n\n this.runTask(() => controller.set('contactName', 'Robert'));\n\n assert.equal(this.$('#contact-link').text(), 'Robert', 'The link title is correctly updated when the bound property changes a second time');\n\n return this.click('#contact-link');\n }).then(() => {\n assert.equal(this.$('h3.contact').length, 1, 'The contact template was rendered');\n assert.equal(this.$('#self-link.active').length, 1, 'The self-link was rendered with active class');\n assert.equal(this.$('#home-link:not(.active)').length, 1, 'The other link was rendered without active class');\n\n return this.click('#home-link');\n }).then(() => {\n assert.equal(this.$('h3.home').length, 1, 'The index template was rendered');\n assert.equal(this.$('#contact-link').text(), 'Robert', 'The link title is correctly updated when the route changes');\n });\n }\n\n [`@test The non-block form {{link-to}} helper moves into the named route with context`](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('item', { path: '/item/:id' });\n });\n\n this.add('route:index', _routing.Route.extend({\n model() {\n return [{ id: 'yehuda', name: 'Yehuda Katz' }, { id: 'tom', name: 'Tom Dale' }, { id: 'erik', name: 'Erik Brynroflsson' }];\n }\n }));\n\n this.addTemplate('index', `\n

    Home

    \n
      \n {{#each model as |person|}}\n
    • \n {{link-to person.name 'item' person id=person.id}}\n
    • \n {{/each}}\n
    \n `);\n this.addTemplate('item', `\n

    Item

    \n

    {{model.name}}

    \n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#yehuda');\n }).then(() => {\n assert.equal(this.$('h3.item').length, 1, 'The item template was rendered');\n assert.equal(this.$('p').text(), 'Yehuda Katz', 'The name is correct');\n\n return this.click('#home-link');\n }).then(() => {\n assert.equal(normalizeUrl(this.$('li a#yehuda').attr('href')), '/item/yehuda');\n assert.equal(normalizeUrl(this.$('li a#tom').attr('href')), '/item/tom');\n assert.equal(normalizeUrl(this.$('li a#erik').attr('href')), '/item/erik');\n });\n }\n\n [`@test The non-block form {{link-to}} performs property lookup`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{link-to 'string' 'index' id='string-link'}}\n {{link-to path foo id='path-link'}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n foo: 'index'\n }));\n\n return this.visit('/').then(() => {\n let assertEquality = href => {\n assert.equal(normalizeUrl(this.$('#string-link').attr('href')), '/');\n assert.equal(normalizeUrl(this.$('#path-link').attr('href')), href);\n };\n\n assertEquality('/');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => controller.set('foo', 'about'));\n\n assertEquality('/about');\n });\n }\n\n [`@test The non-block form {{link-to}} protects against XSS`](assert) {\n this.addTemplate('application', `{{link-to display 'index' id='link'}}`);\n\n this.add('controller:application', _controller.default.extend({\n display: 'blahzorz'\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#link').text(), 'blahzorz');\n\n let controller = this.applicationInstance.lookup('controller:application');\n this.runTask(() => controller.set('display', 'BLAMMO'));\n\n assert.equal(this.$('#link').text(), 'BLAMMO');\n assert.equal(this.$('b').length, 0);\n });\n }\n\n [`@test the {{link-to}} helper throws a useful error if you invoke it wrong`](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('post', { path: 'post/:post_id' });\n });\n\n this.addTemplate('application', `{{#link-to 'post'}}Post{{/link-to}}`);\n\n assert.throws(() => {\n this.visit('/');\n }, /(You attempted to define a `\\{\\{link-to \"post\"\\}\\}` but did not pass the parameters required for generating its dynamic segments.|You must provide param `post_id` to `generate`)/);\n\n return this.runLoopSettled();\n }\n\n [`@test the {{link-to}} helper does not throw an error if its route has exited`](assert) {\n assert.expect(0);\n\n this.router.map(function () {\n this.route('post', { path: 'post/:post_id' });\n });\n\n this.addTemplate('application', `\n {{#link-to 'index' id='home-link'}}Home{{/link-to}}\n {{#link-to 'post' defaultPost id='default-post-link'}}Default Post{{/link-to}}\n {{#if currentPost}}\n {{#link-to 'post' currentPost id='current-post-link'}}Current Post{{/link-to}}\n {{/if}}\n `);\n\n this.add('controller:application', _controller.default.extend({\n defaultPost: { id: 1 },\n postController: (0, _controller.inject)('post'),\n currentPost: (0, _metal.alias)('postController.model')\n }));\n\n this.add('controller:post', _controller.default.extend());\n\n this.add('route:post', _routing.Route.extend({\n model() {\n return { id: 2 };\n },\n serialize(model) {\n return { post_id: model.id };\n }\n }));\n\n return this.visit('/').then(() => this.click('#default-post-link')).then(() => this.click('#home-link')).then(() => this.click('#current-post-link')).then(() => this.click('#home-link'));\n }\n\n [`@test {{link-to}} active property respects changing parent route context`](assert) {\n this.router.map(function () {\n this.route('things', { path: '/things/:name' }, function () {\n this.route('other');\n });\n });\n\n this.addTemplate('application', `\n {{link-to 'OMG' 'things' 'omg' id='omg-link'}}\n {{link-to 'LOL' 'things' 'lol' id='lol-link'}}\n `);\n\n return this.visit('/things/omg').then(() => {\n shouldBeActive(assert, this.$('#omg-link'));\n shouldNotBeActive(assert, this.$('#lol-link'));\n\n return this.visit('/things/omg/other');\n }).then(() => {\n shouldBeActive(assert, this.$('#omg-link'));\n shouldNotBeActive(assert, this.$('#lol-link'));\n });\n }\n\n [`@test {{link-to}} populates href with default query param values even without query-params object`](assert) {\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: '123'\n }));\n\n this.addTemplate('index', `{{#link-to 'index' id='the-link'}}Index{{/link-to}}`);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/', 'link has right href');\n });\n }\n\n [`@test {{link-to}} populates href with default query param values with empty query-params object`](assert) {\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: '123'\n }));\n\n this.addTemplate('index', `\n {{#link-to 'index' (query-params) id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/', 'link has right href');\n });\n }\n\n [`@test {{link-to}} with only query-params and a block updates when route changes`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.add('controller:application', _controller.default.extend({\n queryParams: ['foo', 'bar'],\n foo: '123',\n bar: 'yes'\n }));\n\n this.addTemplate('application', `\n {{#link-to (query-params foo='456' bar='NAW') id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/?bar=NAW&foo=456', 'link has right href');\n\n return this.visit('/about');\n }).then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/about?bar=NAW&foo=456', 'link has right href');\n });\n }\n\n [`@test Block-less {{link-to}} with only query-params updates when route changes`](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.add('controller:application', _controller.default.extend({\n queryParams: ['foo', 'bar'],\n foo: '123',\n bar: 'yes'\n }));\n\n this.addTemplate('application', `\n {{link-to \"Index\" (query-params foo='456' bar='NAW') id='the-link'}}\n `);\n\n return this.visit('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/?bar=NAW&foo=456', 'link has right href');\n\n return this.visit('/about');\n }).then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/about?bar=NAW&foo=456', 'link has right href');\n });\n }\n\n [`@test The {{link-to}} helper can use dynamic params`](assert) {\n this.router.map(function () {\n this.route('foo', { path: 'foo/:some/:thing' });\n this.route('bar', { path: 'bar/:some/:thing/:else' });\n });\n\n this.add('controller:index', _controller.default.extend({\n init() {\n this._super(...arguments);\n this.dynamicLinkParams = ['foo', 'one', 'two'];\n }\n }));\n\n this.addTemplate('index', `\n

    Home

    \n {{#link-to params=dynamicLinkParams id=\"dynamic-link\"}}Dynamic{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let link = this.$('#dynamic-link');\n\n assert.equal(link.attr('href'), '/foo/one/two');\n\n let controller = this.applicationInstance.lookup('controller:index');\n this.runTask(() => {\n controller.set('dynamicLinkParams', ['bar', 'one', 'two', 'three']);\n });\n\n assert.equal(link.attr('href'), '/bar/one/two/three');\n });\n }\n\n [`@test GJ: {{link-to}} to a parent root model hook which performs a 'transitionTo' has correct active class #13256`](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n\n this.add('route:parent', _routing.Route.extend({\n afterModel() {\n this.transitionTo('parent.child');\n }\n }));\n\n this.addTemplate('application', `\n {{link-to 'Parent' 'parent' id='parent-link'}}\n `);\n\n return this.visit('/').then(() => {\n return this.click('#parent-link');\n }).then(() => {\n shouldBeActive(assert, this.$('#parent-link'));\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper - loading states and warnings', class extends _internalTestHelpers.ApplicationTestCase {\n [`@test link-to with null/undefined dynamic parameters are put in a loading state`](assert) {\n assert.expect(19);\n let warningMessage = '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.';\n\n this.router.map(function () {\n this.route('thing', { path: '/thing/:thing_id' });\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to destinationRoute routeContext loadingClass='i-am-loading' id='context-link'}}\n string\n {{/link-to}}\n {{#link-to secondRoute loadingClass=loadingClass id='static-link'}}\n string\n {{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n destinationRoute: null,\n routeContext: null,\n loadingClass: 'i-am-loading'\n }));\n\n this.add('route:about', _routing.Route.extend({\n activate() {\n assert.ok(true, 'About was entered');\n }\n }));\n\n function assertLinkStatus(link, url) {\n if (url) {\n assert.equal(normalizeUrl(link.attr('href')), url, 'loaded link-to has expected href');\n assert.ok(!link.hasClass('i-am-loading'), 'loaded linkComponent has no loadingClass');\n } else {\n assert.equal(normalizeUrl(link.attr('href')), '#', \"unloaded link-to has href='#'\");\n assert.ok(link.hasClass('i-am-loading'), 'loading linkComponent has loadingClass');\n }\n }\n\n let contextLink, staticLink, controller;\n\n return this.visit('/').then(() => {\n contextLink = this.$('#context-link');\n staticLink = this.$('#static-link');\n controller = this.applicationInstance.lookup('controller:index');\n\n assertLinkStatus(contextLink);\n assertLinkStatus(staticLink);\n\n return expectWarning(() => {\n return this.click(contextLink[0]);\n }, warningMessage);\n }).then(() => {\n // Set the destinationRoute (context is still null).\n this.runTask(() => controller.set('destinationRoute', 'thing'));\n assertLinkStatus(contextLink);\n\n // Set the routeContext to an id\n this.runTask(() => controller.set('routeContext', '456'));\n assertLinkStatus(contextLink, '/thing/456');\n\n // Test that 0 isn't interpreted as falsy.\n this.runTask(() => controller.set('routeContext', 0));\n assertLinkStatus(contextLink, '/thing/0');\n\n // Set the routeContext to an object\n this.runTask(() => {\n controller.set('routeContext', { id: 123 });\n });\n assertLinkStatus(contextLink, '/thing/123');\n\n // Set the destinationRoute back to null.\n this.runTask(() => controller.set('destinationRoute', null));\n assertLinkStatus(contextLink);\n\n return expectWarning(() => {\n return this.click(staticLink[0]);\n }, warningMessage);\n }).then(() => {\n this.runTask(() => controller.set('secondRoute', 'about'));\n assertLinkStatus(staticLink, '/about');\n\n // Click the now-active link\n return this.click(staticLink[0]);\n });\n }\n });\n\n function assertNav(options, callback, assert) {\n let nav = false;\n\n function check(event) {\n assert.equal(event.defaultPrevented, options.prevented, `expected defaultPrevented=${options.prevented}`);\n nav = true;\n event.preventDefault();\n }\n\n try {\n document.addEventListener('click', check);\n callback();\n } finally {\n document.removeEventListener('click', check);\n assert.ok(nav, 'Expected a link to be clicked');\n }\n }\n});","enifed('ember/tests/helpers/link_to_test/link_to_transitioning_classes_test', ['@ember/-internals/runtime', '@ember/-internals/routing', 'internal-test-helpers'], function (_runtime, _routing, _internalTestHelpers) {\n 'use strict';\n\n function assertHasClass(assert, selector, label) {\n let testLabel = `${selector.attr('id')} should have class ${label}`;\n\n assert.equal(selector.hasClass(label), true, testLabel);\n }\n\n function assertHasNoClass(assert, selector, label) {\n let testLabel = `${selector.attr('id')} should not have class ${label}`;\n\n assert.equal(selector.hasClass(label), false, testLabel);\n }\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper: .transitioning-in .transitioning-out CSS classes', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n\n this.aboutDefer = _runtime.RSVP.defer();\n this.otherDefer = _runtime.RSVP.defer();\n this.newsDefer = _runtime.RSVP.defer();\n let _this = this;\n\n this.router.map(function () {\n this.route('about');\n this.route('other');\n this.route('news');\n });\n\n this.add('route:about', _routing.Route.extend({\n model() {\n return _this.aboutDefer.promise;\n }\n }));\n\n this.add('route:other', _routing.Route.extend({\n model() {\n return _this.otherDefer.promise;\n }\n }));\n\n this.add('route:news', _routing.Route.extend({\n model() {\n return _this.newsDefer.promise;\n }\n }));\n\n this.addTemplate('application', `\n {{outlet}}\n {{link-to 'Index' 'index' id='index-link'}}\n {{link-to 'About' 'about' id='about-link'}}\n {{link-to 'Other' 'other' id='other-link'}}\n {{link-to 'News' 'news' activeClass=false id='news-link'}}\n `);\n }\n\n beforeEach() {\n return this.visit('/');\n }\n\n afterEach() {\n super.afterEach();\n this.aboutDefer = null;\n this.otherDefer = null;\n this.newsDefer = null;\n }\n\n ['@test while a transition is underway'](assert) {\n let $index = this.$('#index-link');\n let $about = this.$('#about-link');\n let $other = this.$('#other-link');\n\n $about.click();\n\n assertHasClass(assert, $index, 'active');\n assertHasNoClass(assert, $about, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n this.runTask(() => this.aboutDefer.resolve());\n\n assertHasNoClass(assert, $index, 'active');\n assertHasClass(assert, $about, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n }\n\n ['@test while a transition is underway with activeClass is false'](assert) {\n let $index = this.$('#index-link');\n let $news = this.$('#news-link');\n let $other = this.$('#other-link');\n\n $news.click();\n\n assertHasClass(assert, $index, 'active');\n assertHasNoClass(assert, $news, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasClass(assert, $news, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $news, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n this.runTask(() => this.newsDefer.resolve());\n\n assertHasNoClass(assert, $index, 'active');\n assertHasNoClass(assert, $news, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $news, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $news, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)(`The {{link-to}} helper: .transitioning-in .transitioning-out CSS classes - nested link-to's`, class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n this.aboutDefer = _runtime.RSVP.defer();\n this.otherDefer = _runtime.RSVP.defer();\n let _this = this;\n\n this.router.map(function () {\n this.route('parent-route', function () {\n this.route('about');\n this.route('other');\n });\n });\n this.add('route:parent-route.about', _routing.Route.extend({\n model() {\n return _this.aboutDefer.promise;\n }\n }));\n\n this.add('route:parent-route.other', _routing.Route.extend({\n model() {\n return _this.otherDefer.promise;\n }\n }));\n\n this.addTemplate('application', `\n {{outlet}}\n {{#link-to 'index' tagName='li'}}\n {{link-to 'Index' 'index' id='index-link'}}\n {{/link-to}}\n {{#link-to 'parent-route.about' tagName='li'}}\n {{link-to 'About' 'parent-route.about' id='about-link'}}\n {{/link-to}}\n {{#link-to 'parent-route.other' tagName='li'}}\n {{link-to 'Other' 'parent-route.other' id='other-link'}}\n {{/link-to}}\n `);\n }\n\n beforeEach() {\n return this.visit('/');\n }\n\n resolveAbout() {\n return this.runTask(() => {\n this.aboutDefer.resolve();\n this.aboutDefer = _runtime.RSVP.defer();\n });\n }\n\n resolveOther() {\n return this.runTask(() => {\n this.otherDefer.resolve();\n this.otherDefer = _runtime.RSVP.defer();\n });\n }\n\n teardown() {\n super.teardown();\n this.aboutDefer = null;\n this.otherDefer = null;\n }\n\n [`@test while a transition is underway with nested link-to's`](assert) {\n // TODO undo changes to this test but currently this test navigates away if navigation\n // outlet is not stable and the second $about.click() is triggered.\n let $about = this.$('#about-link');\n\n $about.click();\n\n let $index = this.$('#index-link');\n $about = this.$('#about-link');\n let $other = this.$('#other-link');\n\n assertHasClass(assert, $index, 'active');\n assertHasNoClass(assert, $about, 'active');\n assertHasNoClass(assert, $about, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n this.resolveAbout();\n\n $index = this.$('#index-link');\n $about = this.$('#about-link');\n $other = this.$('#other-link');\n\n assertHasNoClass(assert, $index, 'active');\n assertHasClass(assert, $about, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n $other.click();\n\n $index = this.$('#index-link');\n $about = this.$('#about-link');\n $other = this.$('#other-link');\n\n assertHasNoClass(assert, $index, 'active');\n assertHasClass(assert, $about, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $about, 'ember-transitioning-in');\n assertHasClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n this.resolveOther();\n\n $index = this.$('#index-link');\n $about = this.$('#about-link');\n $other = this.$('#other-link');\n\n assertHasNoClass(assert, $index, 'active');\n assertHasNoClass(assert, $about, 'active');\n assertHasClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n\n $about.click();\n\n $index = this.$('#index-link');\n $about = this.$('#about-link');\n $other = this.$('#other-link');\n\n assertHasNoClass(assert, $index, 'active');\n assertHasNoClass(assert, $about, 'active');\n assertHasClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasClass(assert, $other, 'ember-transitioning-out');\n\n this.resolveAbout();\n\n $index = this.$('#index-link');\n $about = this.$('#about-link');\n $other = this.$('#other-link');\n\n assertHasNoClass(assert, $index, 'active');\n assertHasClass(assert, $about, 'active');\n assertHasNoClass(assert, $other, 'active');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-in');\n assertHasNoClass(assert, $about, 'ember-transitioning-in');\n assertHasNoClass(assert, $other, 'ember-transitioning-in');\n\n assertHasNoClass(assert, $index, 'ember-transitioning-out');\n assertHasNoClass(assert, $about, 'ember-transitioning-out');\n assertHasNoClass(assert, $other, 'ember-transitioning-out');\n }\n });\n});","enifed('ember/tests/helpers/link_to_test/link_to_with_query_params_test', ['@ember/controller', '@ember/-internals/runtime', '@ember/-internals/routing', 'internal-test-helpers'], function (_controller, _runtime, _routing, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('The {{link-to}} helper: invoking with query params', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n let indexProperties = {\n foo: '123',\n bar: 'abc'\n };\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo', 'bar', 'abool'],\n foo: indexProperties.foo,\n bar: indexProperties.bar,\n boundThing: 'OMG',\n abool: true\n }));\n this.add('controller:about', _controller.default.extend({\n queryParams: ['baz', 'bat'],\n baz: 'alex',\n bat: 'borf'\n }));\n this.indexProperties = indexProperties;\n }\n\n shouldNotBeActive(assert, selector) {\n this.checkActive(assert, selector, false);\n }\n\n shouldBeActive(assert, selector) {\n this.checkActive(assert, selector, true);\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n checkActive(assert, selector, active) {\n let classList = this.$(selector)[0].className;\n assert.equal(classList.indexOf('active') > -1, active, selector + ' active should be ' + active.toString());\n }\n\n [`@test doesn't update controller QP properties on current route when invoked`](assert) {\n this.addTemplate('index', `\n {{#link-to 'index' id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n this.click('#the-link');\n let indexController = this.getController('index');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar'), this.indexProperties, 'controller QP properties do not update');\n });\n }\n\n [`@test doesn't update controller QP properties on current route when invoked (empty query-params obj)`](assert) {\n this.addTemplate('index', `\n {{#link-to 'index' (query-params) id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n this.click('#the-link');\n let indexController = this.getController('index');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar'), this.indexProperties, 'controller QP properties do not update');\n });\n }\n\n [`@test doesn't update controller QP properties on current route when invoked (empty query-params obj, inferred route)`](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params) id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n this.click('#the-link');\n let indexController = this.getController('index');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar'), this.indexProperties, 'controller QP properties do not update');\n });\n }\n\n ['@test updates controller QP properties on current route when invoked'](assert) {\n this.addTemplate('index', `\n {{#link-to 'index' (query-params foo='456') id=\"the-link\"}}\n Index\n {{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n this.click('#the-link');\n let indexController = this.getController('index');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar'), { foo: '456', bar: 'abc' }, 'controller QP properties updated');\n });\n }\n\n ['@test updates controller QP properties on current route when invoked (inferred route)'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params foo='456') id=\"the-link\"}}\n Index\n {{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n this.click('#the-link');\n let indexController = this.getController('index');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar'), { foo: '456', bar: 'abc' }, 'controller QP properties updated');\n });\n }\n\n ['@test updates controller QP properties on other route after transitioning to that route'](assert) {\n this.router.map(function () {\n this.route('about');\n });\n\n this.addTemplate('index', `\n {{#link-to 'about' (query-params baz='lol') id='the-link'}}\n About\n {{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let theLink = this.$('#the-link');\n assert.equal(theLink.attr('href'), '/about?baz=lol');\n\n this.runTask(() => this.click('#the-link'));\n\n let aboutController = this.getController('about');\n\n assert.deepEqual(aboutController.getProperties('baz', 'bat'), { baz: 'lol', bat: 'borf' }, 'about controller QP properties updated');\n });\n }\n\n ['@test supplied QP properties can be bound'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params foo=boundThing) id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let indexController = this.getController('index');\n let theLink = this.$('#the-link');\n\n assert.equal(theLink.attr('href'), '/?foo=OMG');\n\n this.runTask(() => indexController.set('boundThing', 'ASL'));\n\n assert.equal(theLink.attr('href'), '/?foo=ASL');\n });\n }\n\n ['@test supplied QP properties can be bound (booleans)'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params abool=boundThing) id='the-link'}}\n Index\n {{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let indexController = this.getController('index');\n let theLink = this.$('#the-link');\n\n assert.equal(theLink.attr('href'), '/?abool=OMG');\n\n this.runTask(() => indexController.set('boundThing', false));\n\n assert.equal(theLink.attr('href'), '/?abool=false');\n\n this.click('#the-link');\n\n assert.deepEqual(indexController.getProperties('foo', 'bar', 'abool'), { foo: '123', bar: 'abc', abool: false }, 'bound bool QP properties update');\n });\n }\n ['@test href updates when unsupplied controller QP props change'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params foo='lol') id='the-link'}}Index{{/link-to}}\n `);\n\n return this.visit('/').then(() => {\n let indexController = this.getController('index');\n let theLink = this.$('#the-link');\n\n assert.equal(theLink.attr('href'), '/?foo=lol');\n\n this.runTask(() => indexController.set('bar', 'BORF'));\n\n assert.equal(theLink.attr('href'), '/?bar=BORF&foo=lol');\n\n this.runTask(() => indexController.set('foo', 'YEAH'));\n\n assert.equal(theLink.attr('href'), '/?bar=BORF&foo=lol');\n });\n }\n\n ['@test The {{link-to}} with only query params always transitions to the current route with the query params applied'](assert) {\n // Test harness for bug #12033\n this.addTemplate('cars', `\n {{#link-to 'cars.create' id='create-link'}}Create new car{{/link-to}}\n {{#link-to (query-params page='2') id='page2-link'}}Page 2{{/link-to}}\n {{outlet}}\n `);\n this.addTemplate('cars.create', `{{#link-to 'cars' id='close-link'}}Close create form{{/link-to}}`);\n\n this.router.map(function () {\n this.route('cars', function () {\n this.route('create');\n });\n });\n\n this.add('controller:cars', _controller.default.extend({\n queryParams: ['page'],\n page: 1\n }));\n\n return this.visit('/cars/create').then(() => {\n let router = this.appRouter;\n let carsController = this.getController('cars');\n\n assert.equal(router.currentRouteName, 'cars.create');\n\n this.runTask(() => this.click('#close-link'));\n\n assert.equal(router.currentRouteName, 'cars.index');\n assert.equal(router.get('url'), '/cars');\n assert.equal(carsController.get('page'), 1, 'The page query-param is 1');\n\n this.runTask(() => this.click('#page2-link'));\n\n assert.equal(router.currentRouteName, 'cars.index', 'The active route is still cars');\n assert.equal(router.get('url'), '/cars?page=2', 'The url has been updated');\n assert.equal(carsController.get('page'), 2, 'The query params have been updated');\n });\n }\n\n ['@test the {{link-to}} applies activeClass when query params are not changed'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params foo='cat') id='cat-link'}}Index{{/link-to}}\n {{#link-to (query-params foo='dog') id='dog-link'}}Index{{/link-to}}\n {{#link-to 'index' id='change-nothing'}}Index{{/link-to}}\n `);\n this.addTemplate('search', `\n {{#link-to (query-params search='same') id='same-search'}}Index{{/link-to}}\n {{#link-to (query-params search='change') id='change-search'}}Index{{/link-to}}\n {{#link-to (query-params search='same' archive=true) id='same-search-add-archive'}}Index{{/link-to}}\n {{#link-to (query-params archive=true) id='only-add-archive'}}Index{{/link-to}}\n {{#link-to (query-params search='same' archive=true) id='both-same'}}Index{{/link-to}}\n {{#link-to (query-params search='different' archive=true) id='change-one'}}Index{{/link-to}}\n {{#link-to (query-params search='different' archive=false) id='remove-one'}}Index{{/link-to}}\n {{outlet}}\n `);\n this.addTemplate('search.results', `\n {{#link-to (query-params sort='title') id='same-sort-child-only'}}Index{{/link-to}}\n {{#link-to (query-params search='same') id='same-search-parent-only'}}Index{{/link-to}}\n {{#link-to (query-params search='change') id='change-search-parent-only'}}Index{{/link-to}}\n {{#link-to (query-params search='same' sort='title') id='same-search-same-sort-child-and-parent'}}Index{{/link-to}}\n {{#link-to (query-params search='same' sort='author') id='same-search-different-sort-child-and-parent'}}Index{{/link-to}}\n {{#link-to (query-params search='change' sort='title') id='change-search-same-sort-child-and-parent'}}Index{{/link-to}}\n {{#link-to (query-params foo='dog') id='dog-link'}}Index{{/link-to}}\n `);\n\n this.router.map(function () {\n this.route('search', function () {\n this.route('results');\n });\n });\n\n this.add('controller:search', _controller.default.extend({\n queryParams: ['search', 'archive'],\n search: '',\n archive: false\n }));\n\n this.add('controller:search.results', _controller.default.extend({\n queryParams: ['sort', 'showDetails'],\n sort: 'title',\n showDetails: true\n }));\n\n return this.visit('/').then(() => {\n this.shouldNotBeActive(assert, '#cat-link');\n this.shouldNotBeActive(assert, '#dog-link');\n\n return this.visit('/?foo=cat');\n }).then(() => {\n this.shouldBeActive(assert, '#cat-link');\n this.shouldNotBeActive(assert, '#dog-link');\n\n return this.visit('/?foo=dog');\n }).then(() => {\n this.shouldBeActive(assert, '#dog-link');\n this.shouldNotBeActive(assert, '#cat-link');\n this.shouldBeActive(assert, '#change-nothing');\n\n return this.visit('/search?search=same');\n }).then(() => {\n this.shouldBeActive(assert, '#same-search');\n this.shouldNotBeActive(assert, '#change-search');\n this.shouldNotBeActive(assert, '#same-search-add-archive');\n this.shouldNotBeActive(assert, '#only-add-archive');\n this.shouldNotBeActive(assert, '#remove-one');\n\n return this.visit('/search?search=same&archive=true');\n }).then(() => {\n this.shouldBeActive(assert, '#both-same');\n this.shouldNotBeActive(assert, '#change-one');\n\n return this.visit('/search/results?search=same&sort=title&showDetails=true');\n }).then(() => {\n this.shouldBeActive(assert, '#same-sort-child-only');\n this.shouldBeActive(assert, '#same-search-parent-only');\n this.shouldNotBeActive(assert, '#change-search-parent-only');\n this.shouldBeActive(assert, '#same-search-same-sort-child-and-parent');\n this.shouldNotBeActive(assert, '#same-search-different-sort-child-and-parent');\n this.shouldNotBeActive(assert, '#change-search-same-sort-child-and-parent');\n });\n }\n\n ['@test the {{link-to}} applies active class when query-param is a number'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params page=pageNumber) id='page-link'}}\n Index\n {{/link-to}}\n `);\n this.add('controller:index', _controller.default.extend({\n queryParams: ['page'],\n page: 1,\n pageNumber: 5\n }));\n\n return this.visit('/').then(() => {\n this.shouldNotBeActive(assert, '#page-link');\n return this.visit('/?page=5');\n }).then(() => {\n this.shouldBeActive(assert, '#page-link');\n });\n }\n\n ['@test the {{link-to}} applies active class when query-param is an array'](assert) {\n this.addTemplate('index', `\n {{#link-to (query-params pages=pagesArray) id='array-link'}}Index{{/link-to}}\n {{#link-to (query-params pages=biggerArray) id='bigger-link'}}Index{{/link-to}}\n {{#link-to (query-params pages=emptyArray) id='empty-link'}}Index{{/link-to}}\n `);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: ['pages'],\n pages: [],\n pagesArray: [1, 2],\n biggerArray: [1, 2, 3],\n emptyArray: []\n }));\n\n return this.visit('/').then(() => {\n this.shouldNotBeActive(assert, '#array-link');\n\n return this.visit('/?pages=%5B1%2C2%5D');\n }).then(() => {\n this.shouldBeActive(assert, '#array-link');\n this.shouldNotBeActive(assert, '#bigger-link');\n this.shouldNotBeActive(assert, '#empty-link');\n\n return this.visit('/?pages=%5B2%2C1%5D');\n }).then(() => {\n this.shouldNotBeActive(assert, '#array-link');\n this.shouldNotBeActive(assert, '#bigger-link');\n this.shouldNotBeActive(assert, '#empty-link');\n\n return this.visit('/?pages=%5B1%2C2%2C3%5D');\n }).then(() => {\n this.shouldBeActive(assert, '#bigger-link');\n this.shouldNotBeActive(assert, '#array-link');\n this.shouldNotBeActive(assert, '#empty-link');\n });\n }\n ['@test the {{link-to}} helper applies active class to the parent route'](assert) {\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n\n this.addTemplate('application', `\n {{#link-to 'parent' id='parent-link'}}Parent{{/link-to}}\n {{#link-to 'parent.child' id='parent-child-link'}}Child{{/link-to}}\n {{#link-to 'parent' (query-params foo=cat) id='parent-link-qp'}}Parent{{/link-to}}\n {{outlet}}\n `);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['foo'],\n foo: 'bar'\n }));\n\n return this.visit('/').then(() => {\n this.shouldNotBeActive(assert, '#parent-link');\n this.shouldNotBeActive(assert, '#parent-child-link');\n this.shouldNotBeActive(assert, '#parent-link-qp');\n return this.visit('/parent/child?foo=dog');\n }).then(() => {\n this.shouldBeActive(assert, '#parent-link');\n this.shouldNotBeActive(assert, '#parent-link-qp');\n });\n }\n\n ['@test The {{link-to}} helper disregards query-params in activeness computation when current-when is specified'](assert) {\n let appLink;\n\n this.router.map(function () {\n this.route('parent');\n });\n this.addTemplate('application', `\n {{#link-to 'parent' (query-params page=1) current-when='parent' id='app-link'}}\n Parent\n {{/link-to}}\n {{outlet}}\n `);\n this.addTemplate('parent', `\n {{#link-to 'parent' (query-params page=1) current-when='parent' id='parent-link'}}\n Parent\n {{/link-to}}\n {{outlet}}\n `);\n this.add('controller:parent', _controller.default.extend({\n queryParams: ['page'],\n page: 1\n }));\n\n return this.visit('/').then(() => {\n appLink = this.$('#app-link');\n\n assert.equal(appLink.attr('href'), '/parent');\n this.shouldNotBeActive(assert, '#app-link');\n\n return this.visit('/parent?page=2');\n }).then(() => {\n appLink = this.$('#app-link');\n let router = this.appRouter;\n\n assert.equal(appLink.attr('href'), '/parent');\n this.shouldBeActive(assert, '#app-link');\n assert.equal(this.$('#parent-link').attr('href'), '/parent');\n this.shouldBeActive(assert, '#parent-link');\n\n let parentController = this.getController('parent');\n\n assert.equal(parentController.get('page'), 2);\n\n this.runTask(() => parentController.set('page', 3));\n\n assert.equal(router.get('location.path'), '/parent?page=3');\n this.shouldBeActive(assert, '#app-link');\n this.shouldBeActive(assert, '#parent-link');\n\n this.runTask(() => this.click('#app-link'));\n\n assert.equal(router.get('location.path'), '/parent');\n });\n }\n\n ['@test link-to default query params while in active transition regression test'](assert) {\n this.router.map(function () {\n this.route('foos');\n this.route('bars');\n });\n let foos = _runtime.RSVP.defer();\n let bars = _runtime.RSVP.defer();\n\n this.addTemplate('application', `\n {{link-to 'Foos' 'foos' id='foos-link'}}\n {{link-to 'Baz Foos' 'foos' (query-params baz=true) id='baz-foos-link'}}\n {{link-to 'Quux Bars' 'bars' (query-params quux=true) id='bars-link'}}\n `);\n this.add('controller:foos', _controller.default.extend({\n queryParams: ['status'],\n baz: false\n }));\n this.add('route:foos', _routing.Route.extend({\n model() {\n return foos.promise;\n }\n }));\n this.add('controller:bars', _controller.default.extend({\n queryParams: ['status'],\n quux: false\n }));\n this.add('route:bars', _routing.Route.extend({\n model() {\n return bars.promise;\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.appRouter;\n let foosLink = this.$('#foos-link');\n let barsLink = this.$('#bars-link');\n let bazLink = this.$('#baz-foos-link');\n\n assert.equal(foosLink.attr('href'), '/foos');\n assert.equal(bazLink.attr('href'), '/foos?baz=true');\n assert.equal(barsLink.attr('href'), '/bars?quux=true');\n assert.equal(router.get('location.path'), '/');\n this.shouldNotBeActive(assert, '#foos-link');\n this.shouldNotBeActive(assert, '#baz-foos-link');\n this.shouldNotBeActive(assert, '#bars-link');\n\n this.runTask(() => barsLink.click());\n this.shouldNotBeActive(assert, '#bars-link');\n\n this.runTask(() => foosLink.click());\n this.shouldNotBeActive(assert, '#foos-link');\n\n this.runTask(() => foos.resolve());\n\n assert.equal(router.get('location.path'), '/foos');\n this.shouldBeActive(assert, '#foos-link');\n });\n }\n\n [`@test the {{link-to}} helper throws a useful error if you invoke it wrong`](assert) {\n assert.expect(1);\n\n this.addTemplate('application', `{{#link-to id='the-link'}}Index{{/link-to}}`);\n\n expectAssertion(() => {\n this.visit('/');\n }, /You must provide one or more parameters to the link-to component/);\n\n return this.runLoopSettled();\n }\n });\n});","enifed('ember/tests/homepage_example_test', ['@ember/-internals/routing', '@ember/-internals/metal', '@ember/-internals/runtime', 'internal-test-helpers'], function (_routing, _metal, _runtime, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('The example renders correctly', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Render index template into application outlet'](assert) {\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', '

    People

      {{#each model as |person|}}
    • Hello, {{person.fullName}}!
    • {{/each}}
    ');\n\n let Person = _runtime.Object.extend({\n firstName: null,\n lastName: null,\n fullName: (0, _metal.computed)('firstName', 'lastName', function () {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n })\n });\n\n this.add('route:index', _routing.Route.extend({\n model() {\n return (0, _runtime.A)([Person.create({ firstName: 'Tom', lastName: 'Dale' }), Person.create({ firstName: 'Yehuda', lastName: 'Katz' })]);\n }\n }));\n\n return this.visit('/').then(() => {\n let $ = this.$();\n\n assert.equal($.findAll('h1').text(), 'People');\n assert.equal($.findAll('li').length, 2);\n assert.equal($.findAll('li:nth-of-type(1)').text(), 'Hello, Tom Dale!');\n assert.equal($.findAll('li:nth-of-type(2)').text(), 'Hello, Yehuda Katz!');\n });\n }\n });\n});","enifed('ember/tests/integration/multiple-app-test', ['internal-test-helpers', '@ember/application', '@ember/-internals/glimmer', '@ember/-internals/owner', '@ember/polyfills', 'rsvp'], function (_internalTestHelpers, _application, _glimmer, _owner, _polyfills, _rsvp) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('View Integration', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n document.getElementById('qunit-fixture').innerHTML = `\n
    \n
    \n `;\n super();\n this.runTask(() => {\n this.createSecondApplication();\n });\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n rootElement: '#one',\n router: null\n });\n }\n\n createSecondApplication(options) {\n let { applicationOptions } = this;\n let secondApplicationOptions = { rootElement: '#two' };\n let myOptions = (0, _polyfills.assign)(applicationOptions, secondApplicationOptions, options);\n this.secondApp = _application.default.create(myOptions);\n this.secondResolver = this.secondApp.__registry__.resolver;\n return this.secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n this.runTask(() => {\n this.secondApp.destroy();\n });\n }\n }\n\n addFactoriesToResolver(actions, resolver) {\n resolver.add('component:special-button', _glimmer.Component.extend({\n actions: {\n doStuff() {\n let rootElement = (0, _owner.getOwner)(this).application.rootElement;\n actions.push(rootElement);\n }\n }\n }));\n\n resolver.add('template:index', this.compile(`\n

    Node 1

    {{special-button}}\n `, {\n moduleName: 'my-app/templates/index.hbs'\n }));\n resolver.add('template:components/special-button', this.compile(`\n \n `, {\n moduleName: 'my-app/templates/components/special-button.hbs'\n }));\n }\n\n [`@test booting multiple applications can properly handle events`](assert) {\n let actions = [];\n this.addFactoriesToResolver(actions, this.resolver);\n this.addFactoriesToResolver(actions, this.secondResolver);\n\n return (0, _rsvp.resolve)().then(() => this.application.visit('/')).then(() => this.secondApp.visit('/')).then(() => {\n document.querySelector('#two .do-stuff').click();\n document.querySelector('#one .do-stuff').click();\n\n assert.deepEqual(actions, ['#two', '#one']);\n });\n }\n });\n});","enifed('ember/tests/production_build_test', ['@ember/debug', 'internal-test-helpers'], function (_debug, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('production builds', class extends _internalTestHelpers.AbstractTestCase {\n ['@test assert does not throw in production builds'](assert) {\n if (!true /* DEBUG */) {\n assert.expect(1);\n\n try {\n true && !false && (0, _debug.assert)('Should not throw');\n\n assert.ok(true, 'Ember.assert did not throw');\n } catch (e) {\n assert.ok(false, `Expected assert not to throw but it did: ${e.message}`);\n }\n } else {\n assert.expect(0);\n }\n }\n\n ['@test runInDebug does not run the callback in production builds'](assert) {\n if (!true /* DEBUG */) {\n let fired = false;\n (0, _debug.runInDebug)(() => fired = true);\n\n assert.equal(fired, false, 'runInDebug callback should not be ran');\n } else {\n assert.expect(0);\n }\n }\n });\n});","enifed('ember/tests/reexports_test', ['ember/index', '@ember/canary-features', 'internal-test-helpers', '@ember/-internals/views'], function (_index, _canaryFeatures, _internalTestHelpers, _views) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('ember reexports', class extends _internalTestHelpers.AbstractTestCase {\n [`@test Ember exports correctly`](assert) {\n allExports.forEach(reexport => {\n let [path, moduleId, exportName] = reexport;\n\n // default path === exportName if none present\n if (!exportName) {\n exportName = path;\n }\n\n (0, _internalTestHelpers.confirmExport)(_index.default, assert, path, moduleId, exportName, `Ember.${path} exports correctly`);\n });\n }\n\n ['@test Ember.String.isHTMLSafe exports correctly'](assert) {\n (0, _internalTestHelpers.confirmExport)(_index.default, assert, 'String.isHTMLSafe', '@ember/-internals/glimmer', 'isHTMLSafe');\n }\n\n ['@test Ember.EXTEND_PROTOTYPES is present (but deprecated)'](assert) {\n expectDeprecation(() => {\n assert.strictEqual(_index.default.ENV.EXTEND_PROTOTYPES, _index.default.EXTEND_PROTOTYPES, 'Ember.EXTEND_PROTOTYPES exists');\n }, /EXTEND_PROTOTYPES is deprecated/);\n }\n\n '@test Ember.FEATURES is exported'(assert) {\n for (let feature in _canaryFeatures.FEATURES) {\n assert.equal(_index.default.FEATURES[feature], _canaryFeatures.FEATURES[feature], 'Ember.FEATURES contains ${feature} with correct value');\n }\n }\n });\n\n let allExports = [\n // @ember/-internals/environment\n ['ENV', '@ember/-internals/environment', { get: 'getENV' }], ['lookup', '@ember/-internals/environment', { get: 'getLookup', set: 'setLookup' }], ['getOwner', '@ember/application', 'getOwner'], ['setOwner', '@ember/application', 'setOwner'], ['assign', '@ember/polyfills'],\n\n // @ember/-internals/utils\n ['GUID_KEY', '@ember/-internals/utils'], ['uuid', '@ember/-internals/utils'], ['generateGuid', '@ember/-internals/utils'], ['guidFor', '@ember/-internals/utils'], ['inspect', '@ember/-internals/utils'], ['makeArray', '@ember/-internals/utils'], ['canInvoke', '@ember/-internals/utils'], ['tryInvoke', '@ember/-internals/utils'], ['wrap', '@ember/-internals/utils'], ['NAME_KEY', '@ember/-internals/utils'],\n\n // @ember/-internals/container\n ['Registry', '@ember/-internals/container', 'Registry'], ['Container', '@ember/-internals/container', 'Container'],\n\n // @ember/debug\n ['deprecateFunc', '@ember/debug'], ['deprecate', '@ember/debug'], ['assert', '@ember/debug'], ['warn', '@ember/debug'], ['debug', '@ember/debug'], ['runInDebug', '@ember/debug'], ['Debug.registerDeprecationHandler', '@ember/debug', 'registerDeprecationHandler'], ['Debug.registerWarnHandler', '@ember/debug', 'registerWarnHandler'], ['Error', '@ember/error', 'default'],\n\n // @ember/-internals/metal\n ['computed', '@ember/-internals/metal', '_globalsComputed'], ['computed.alias', '@ember/-internals/metal', 'alias'], ['ComputedProperty', '@ember/-internals/metal'], ['cacheFor', '@ember/-internals/metal', 'getCachedValueFor'], ['merge', '@ember/polyfills'], ['instrument', '@ember/instrumentation'], ['subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.instrument', '@ember/instrumentation', 'instrument'], ['Instrumentation.subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.unsubscribe', '@ember/instrumentation', 'unsubscribe'], ['Instrumentation.reset', '@ember/instrumentation', 'reset'], ['testing', '@ember/debug', { get: 'isTesting', set: 'setTesting' }], ['onerror', '@ember/-internals/error-handling', { get: 'getOnerror', set: 'setOnerror' }], ['FEATURES.isEnabled', '@ember/canary-features', 'isEnabled'], ['meta', '@ember/-internals/meta'], ['get', '@ember/-internals/metal'], ['set', '@ember/-internals/metal'], ['_getPath', '@ember/-internals/metal'], ['getWithDefault', '@ember/-internals/metal'], ['trySet', '@ember/-internals/metal'], ['_Cache', '@ember/-internals/utils', 'Cache'], ['on', '@ember/-internals/metal'], ['addListener', '@ember/-internals/metal'], ['removeListener', '@ember/-internals/metal'], ['sendEvent', '@ember/-internals/metal'], ['hasListeners', '@ember/-internals/metal'], ['isNone', '@ember/-internals/metal'], ['isEmpty', '@ember/-internals/metal'], ['isBlank', '@ember/-internals/metal'], ['isPresent', '@ember/-internals/metal'], ['_Backburner', 'backburner', 'default'], ['run', '@ember/runloop', '_globalsRun'], ['run.backburner', '@ember/runloop', 'backburner'], ['run.begin', '@ember/runloop', 'begin'], ['run.bind', '@ember/runloop', 'bind'], ['run.cancel', '@ember/runloop', 'cancel'], ['run.debounce', '@ember/runloop', 'debounce'], ['run.end', '@ember/runloop', 'end'], ['run.hasScheduledTimers', '@ember/runloop', 'hasScheduledTimers'], ['run.join', '@ember/runloop', 'join'], ['run.later', '@ember/runloop', 'later'], ['run.next', '@ember/runloop', 'next'], ['run.once', '@ember/runloop', 'once'], ['run.schedule', '@ember/runloop', 'schedule'], ['run.scheduleOnce', '@ember/runloop', 'scheduleOnce'], ['run.throttle', '@ember/runloop', 'throttle'], ['run.currentRunLoop', '@ember/runloop', { get: 'getCurrentRunLoop' }], ['run.cancelTimers', '@ember/runloop', 'cancelTimers'], ['propertyWillChange', '@ember/-internals/metal'], ['propertyDidChange', '@ember/-internals/metal'], ['notifyPropertyChange', '@ember/-internals/metal'], ['overrideChains', '@ember/-internals/metal'], ['beginPropertyChanges', '@ember/-internals/metal'], ['endPropertyChanges', '@ember/-internals/metal'], ['changeProperties', '@ember/-internals/metal'], ['platform.defineProperty', null, { value: true }], ['platform.hasPropertyAccessors', null, { value: true }], ['defineProperty', '@ember/-internals/metal'], ['watchKey', '@ember/-internals/metal'], ['unwatchKey', '@ember/-internals/metal'], ['removeChainWatcher', '@ember/-internals/metal'], ['_ChainNode', '@ember/-internals/metal', 'ChainNode'], ['finishChains', '@ember/-internals/metal'], ['watchPath', '@ember/-internals/metal'], ['unwatchPath', '@ember/-internals/metal'], ['watch', '@ember/-internals/metal'], ['isWatching', '@ember/-internals/metal'], ['unwatch', '@ember/-internals/metal'], ['destroy', '@ember/-internals/meta', 'deleteMeta'], ['libraries', '@ember/-internals/metal'], ['OrderedSet', '@ember/map/lib/ordered-set', 'default'], ['Map', '@ember/map', 'default'], ['MapWithDefault', '@ember/map/with-default', 'default'], ['getProperties', '@ember/-internals/metal'], ['setProperties', '@ember/-internals/metal'], ['expandProperties', '@ember/-internals/metal'], ['addObserver', '@ember/-internals/metal'], ['removeObserver', '@ember/-internals/metal'], ['aliasMethod', '@ember/-internals/metal'], ['observer', '@ember/-internals/metal'], ['mixin', '@ember/-internals/metal'], ['Mixin', '@ember/-internals/metal'],\n\n // @ember/-internals/console\n ['Logger', '@ember/-internals/console', 'default'],\n\n // @ember/-internals/views\n !_views.jQueryDisabled && ['$', '@ember/-internals/views', 'jQuery'], ['ViewUtils.isSimpleClick', '@ember/-internals/views', 'isSimpleClick'], ['ViewUtils.getViewElement', '@ember/-internals/views', 'getViewElement'], ['ViewUtils.getViewBounds', '@ember/-internals/views', 'getViewBounds'], ['ViewUtils.getViewClientRects', '@ember/-internals/views', 'getViewClientRects'], ['ViewUtils.getViewBoundingClientRect', '@ember/-internals/views', 'getViewBoundingClientRect'], ['ViewUtils.getRootViews', '@ember/-internals/views', 'getRootViews'], ['ViewUtils.getChildViews', '@ember/-internals/views', 'getChildViews'], ['ViewUtils.isSerializationFirstNode', '@ember/-internals/glimmer', 'isSerializationFirstNode'], ['TextSupport', '@ember/-internals/views'], ['ComponentLookup', '@ember/-internals/views'], ['EventDispatcher', '@ember/-internals/views'],\n\n // @ember/-internals/glimmer\n ['Component', '@ember/-internals/glimmer', 'Component'], ['Helper', '@ember/-internals/glimmer', 'Helper'], ['Helper.helper', '@ember/-internals/glimmer', 'helper'], ['Checkbox', '@ember/-internals/glimmer', 'Checkbox'], ['LinkComponent', '@ember/-internals/glimmer', 'LinkComponent'], ['TextArea', '@ember/-internals/glimmer', 'TextArea'], ['TextField', '@ember/-internals/glimmer', 'TextField'], ['TEMPLATES', '@ember/-internals/glimmer', { get: 'getTemplates', set: 'setTemplates' }], ['Handlebars.template', '@ember/-internals/glimmer', 'template'], ['HTMLBars.template', '@ember/-internals/glimmer', 'template'], ['Handlebars.Utils.escapeExpression', '@ember/-internals/glimmer', 'escapeExpression'], ['String.htmlSafe', '@ember/-internals/glimmer', 'htmlSafe'], ['_setComponentManager', '@ember/-internals/glimmer', 'setComponentManager'], ['_componentManagerCapabilities', '@ember/-internals/glimmer', 'capabilities'],\n\n // @ember/-internals/runtime\n ['A', '@ember/-internals/runtime'], ['_RegistryProxyMixin', '@ember/-internals/runtime', 'RegistryProxyMixin'], ['_ContainerProxyMixin', '@ember/-internals/runtime', 'ContainerProxyMixin'], ['Object', '@ember/-internals/runtime'], ['String.loc', '@ember/string', 'loc'], ['String.w', '@ember/string', 'w'], ['String.dasherize', '@ember/string', 'dasherize'], ['String.decamelize', '@ember/string', 'decamelize'], ['String.camelize', '@ember/string', 'camelize'], ['String.classify', '@ember/string', 'classify'], ['String.underscore', '@ember/string', 'underscore'], ['String.capitalize', '@ember/string', 'capitalize'], ['compare', '@ember/-internals/runtime'], ['copy', '@ember/-internals/runtime'], ['isEqual', '@ember/-internals/runtime'], ['inject.controller', '@ember/controller', 'inject'], ['inject.service', '@ember/service', 'inject'], ['Array', '@ember/-internals/runtime'], ['Comparable', '@ember/-internals/runtime'], ['Namespace', '@ember/-internals/runtime'], ['Enumerable', '@ember/-internals/runtime'], ['ArrayProxy', '@ember/-internals/runtime'], ['ObjectProxy', '@ember/-internals/runtime'], ['ActionHandler', '@ember/-internals/runtime'], ['CoreObject', '@ember/-internals/runtime'], ['NativeArray', '@ember/-internals/runtime'], ['Copyable', '@ember/-internals/runtime'], ['MutableEnumerable', '@ember/-internals/runtime'], ['MutableArray', '@ember/-internals/runtime'], ['TargetActionSupport', '@ember/-internals/runtime'], ['Evented', '@ember/-internals/runtime'], ['PromiseProxyMixin', '@ember/-internals/runtime'], ['Observable', '@ember/-internals/runtime'], ['typeOf', '@ember/-internals/runtime'], ['isArray', '@ember/-internals/runtime'], ['Object', '@ember/-internals/runtime'], ['onLoad', '@ember/application'], ['runLoadHooks', '@ember/application'], ['Controller', '@ember/controller', 'default'], ['ControllerMixin', '@ember/controller/lib/controller_mixin', 'default'], ['Service', '@ember/service', 'default'], ['_ProxyMixin', '@ember/-internals/runtime'], ['RSVP', '@ember/-internals/runtime'], ['STRINGS', '@ember/string', { get: '_getStrings', set: '_setStrings' }], ['BOOTED', '@ember/-internals/metal', { get: 'isNamespaceSearchDisabled', set: 'setNamespaceSearchDisabled' }], ['computed.empty', '@ember/object/computed', 'empty'], ['computed.notEmpty', '@ember/object/computed', 'notEmpty'], ['computed.none', '@ember/object/computed', 'none'], ['computed.not', '@ember/object/computed', 'not'], ['computed.bool', '@ember/object/computed', 'bool'], ['computed.match', '@ember/object/computed', 'match'], ['computed.equal', '@ember/object/computed', 'equal'], ['computed.gt', '@ember/object/computed', 'gt'], ['computed.gte', '@ember/object/computed', 'gte'], ['computed.lt', '@ember/object/computed', 'lt'], ['computed.lte', '@ember/object/computed', 'lte'], ['computed.oneWay', '@ember/object/computed', 'oneWay'], ['computed.reads', '@ember/object/computed', 'oneWay'], ['computed.readOnly', '@ember/object/computed', 'readOnly'], ['computed.deprecatingAlias', '@ember/object/computed', 'deprecatingAlias'], ['computed.and', '@ember/object/computed', 'and'], ['computed.or', '@ember/object/computed', 'or'], ['computed.sum', '@ember/object/computed', 'sum'], ['computed.min', '@ember/object/computed', 'min'], ['computed.max', '@ember/object/computed', 'max'], ['computed.map', '@ember/object/computed', 'map'], ['computed.sort', '@ember/object/computed', 'sort'], ['computed.setDiff', '@ember/object/computed', 'setDiff'], ['computed.mapBy', '@ember/object/computed', 'mapBy'], ['computed.filter', '@ember/object/computed', 'filter'], ['computed.filterBy', '@ember/object/computed', 'filterBy'], ['computed.uniq', '@ember/object/computed', 'uniq'], ['computed.uniqBy', '@ember/object/computed', 'uniqBy'], ['computed.union', '@ember/object/computed', 'union'], ['computed.intersect', '@ember/object/computed', 'intersect'], ['computed.collect', '@ember/object/computed', 'collect'],\n\n // @ember/-internals/routing\n ['Location', '@ember/-internals/routing'], ['AutoLocation', '@ember/-internals/routing'], ['HashLocation', '@ember/-internals/routing'], ['HistoryLocation', '@ember/-internals/routing'], ['NoneLocation', '@ember/-internals/routing'], ['controllerFor', '@ember/-internals/routing'], ['generateControllerFactory', '@ember/-internals/routing'], ['generateController', '@ember/-internals/routing'], ['RouterDSL', '@ember/-internals/routing'], ['Router', '@ember/-internals/routing'], ['Route', '@ember/-internals/routing'],\n\n // ember-application\n ['Application', '@ember/application', 'default'], ['ApplicationInstance', '@ember/application/instance', 'default'], ['Engine', '@ember/engine', 'default'], ['EngineInstance', '@ember/engine/instance', 'default'], ['Resolver', '@ember/application/globals-resolver', 'default'], ['DefaultResolver', '@ember/application/globals-resolver', 'default'],\n\n // @ember/-internals/extension-support\n ['DataAdapter', '@ember/-internals/extension-support'], ['ContainerDebugAdapter', '@ember/-internals/extension-support']].filter(Boolean);\n});","enifed('ember/tests/routing/decoupled_basic_test', ['@ember/-internals/owner', 'rsvp', 'ember-template-compiler', '@ember/-internals/routing', '@ember/controller', '@ember/-internals/runtime', 'internal-test-helpers', '@ember/runloop', '@ember/-internals/metal', '@ember/-internals/glimmer', '@ember/engine', 'router_js'], function (_owner, _rsvp, _emberTemplateCompiler, _routing, _controller, _runtime, _internalTestHelpers, _runloop, _metal, _glimmer, _engine, _router_js) {\n 'use strict';\n\n let originalConsoleError; /* eslint-disable no-console */\n\n\n (0, _internalTestHelpers.moduleFor)('Basic Routing - Decoupled from global resolver', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.addTemplate('home', '

    Hours

    ');\n this.addTemplate('camelot', '

    Is a silly place

    ');\n this.addTemplate('homepage', '

    Megatroll

    {{model.home}}

    ');\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n originalConsoleError = console.error;\n }\n\n teardown() {\n super.teardown();\n console.error = originalConsoleError;\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n handleURLAborts(assert, path) {\n (0, _runloop.run)(() => {\n let router = this.applicationInstance.lookup('router:main');\n router.handleURL(path).then(function () {\n assert.ok(false, 'url: `' + path + '` was NOT to be handled');\n }, function (reason) {\n assert.ok(reason && reason.message === 'TransitionAborted', 'url: `' + path + '` was to be aborted');\n });\n });\n }\n\n get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n get currentURL() {\n return this.appRouter.get('currentURL');\n }\n\n handleURLRejectsWith(context, assert, path, expectedReason) {\n return context.visit(path).then(() => {\n assert.ok(false, 'expected handleURLing: `' + path + '` to fail');\n }).catch(reason => {\n assert.equal(reason.message, expectedReason);\n });\n }\n\n ['@test warn on URLs not included in the route set']() {\n return this.visit('/').then(() => {\n expectAssertion(() => {\n this.visit('/what-is-this-i-dont-even');\n }, /'\\/what-is-this-i-dont-even' did not match any routes/);\n });\n }\n\n ['@test The Homepage'](assert) {\n return this.visit('/').then(() => {\n assert.equal(this.currentPath, 'home', 'currently on the home route');\n\n let text = this.$('.hours').text();\n assert.equal(text, 'Hours', 'the home template was rendered');\n });\n }\n\n [`@test The Homepage and the Camelot page with multiple Router.map calls`](assert) {\n this.router.map(function () {\n this.route('camelot', { path: '/camelot' });\n });\n\n return this.visit('/camelot').then(() => {\n assert.equal(this.currentPath, 'camelot');\n\n let text = this.$('#camelot').text();\n assert.equal(text, 'Is a silly place', 'the camelot template was rendered');\n\n return this.visit('/');\n }).then(() => {\n assert.equal(this.currentPath, 'home');\n\n let text = this.$('.hours').text();\n assert.equal(text, 'Hours', 'the home template was rendered');\n });\n }\n\n [`@test The Homepage with explicit template name in renderTemplate`](assert) {\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('#troll').text();\n assert.equal(text, 'Megatroll', 'the homepage template was rendered');\n });\n }\n\n [`@test an alternate template will pull in an alternate controller`](assert) {\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n this.add('controller:homepage', _controller.default.extend({\n model: {\n home: 'Comes from homepage'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');\n });\n }\n\n [`@test An alternate template will pull in an alternate controller instead of controllerName`](assert) {\n this.add('route:home', _routing.Route.extend({\n controllerName: 'foo',\n renderTemplate() {\n this.render('homepage');\n }\n }));\n this.add('controller:foo', _controller.default.extend({\n model: {\n home: 'Comes from foo'\n }\n }));\n this.add('controller:homepage', _controller.default.extend({\n model: {\n home: 'Comes from homepage'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from homepage', 'the homepage template was rendered');\n });\n }\n\n [`@test The template will pull in an alternate controller via key/value`](assert) {\n this.router.map(function () {\n this.route('homepage', { path: '/' });\n });\n\n this.add('route:homepage', _routing.Route.extend({\n renderTemplate() {\n this.render({ controller: 'home' });\n }\n }));\n this.add('controller:home', _controller.default.extend({\n model: {\n home: 'Comes from home.'\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'Comes from home.', 'the homepage template was rendered from data from the HomeController');\n });\n }\n\n [`@test The Homepage with explicit template name in renderTemplate and controller`](assert) {\n this.add('controller:home', _controller.default.extend({\n model: {\n home: 'YES I AM HOME'\n }\n }));\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('homepage');\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'YES I AM HOME', 'The homepage template was rendered');\n });\n }\n\n [`@test Model passed via renderTemplate model is set as controller's model`](assert) {\n this.addTemplate('bio', '

    {{model.name}}

    ');\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('bio', {\n model: { name: 'emberjs' }\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'emberjs', `Passed model was set as controller's model`);\n });\n }\n\n ['@test render uses templateName from route'](assert) {\n this.addTemplate('the_real_home_template', '

    THIS IS THE REAL HOME

    ');\n this.add('route:home', _routing.Route.extend({\n templateName: 'the_real_home_template'\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');\n });\n }\n\n ['@test defining templateName allows other templates to be rendered'](assert) {\n this.addTemplate('alert', `
    Invader!
    `);\n this.addTemplate('the_real_home_template', `

    THIS IS THE REAL HOME

    {{outlet 'alert'}}`);\n this.add('route:home', _routing.Route.extend({\n templateName: 'the_real_home_template',\n actions: {\n showAlert() {\n this.render('alert', {\n into: 'home',\n outlet: 'alert'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('p').text();\n assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');\n\n return this.runTask(() => this.appRouter.send('showAlert'));\n }).then(() => {\n let text = this.$('.alert-box').text();\n\n assert.equal(text, 'Invader!', 'Template for alert was rendered into the outlet');\n });\n }\n\n ['@test templateName is still used when calling render with no name and options'](assert) {\n this.addTemplate('alert', `
    Invader!
    `);\n this.addTemplate('home', `

    THIS IS THE REAL HOME

    {{outlet 'alert'}}`);\n\n this.add('route:home', _routing.Route.extend({\n templateName: 'alert',\n renderTemplate() {\n this.render({});\n }\n }));\n\n return this.visit('/').then(() => {\n let text = this.$('.alert-box').text();\n\n assert.equal(text, 'Invader!', 'default templateName was rendered into outlet');\n });\n }\n\n ['@test The Homepage with a `setupController` hook'](assert) {\n this.addTemplate('home', `
      {{#each hours as |entry|}}\n
    • {{entry}}
    • \n {{/each}}\n
    \n `);\n\n this.add('route:home', _routing.Route.extend({\n setupController(controller) {\n controller.set('hours', ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm']);\n }\n }));\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The route controller is still set when overriding the setupController hook`](assert) {\n this.add('route:home', _routing.Route.extend({\n setupController() {\n // no-op\n // importantly, we are not calling this._super\n }\n }));\n\n this.add('controller:home', _controller.default.extend());\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let homeController = this.applicationInstance.lookup('controller:home');\n\n assert.equal(homeRoute.controller, homeController, 'route controller is the home controller');\n });\n }\n\n ['@test the route controller can be specified via controllerName'](assert) {\n this.addTemplate('home', '

    {{myValue}}

    ');\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController'\n }));\n this.add('controller:myController', _controller.default.extend({\n myValue: 'foo'\n }));\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n assert.equal(text, 'foo', 'The homepage template was rendered with data from the custom controller');\n });\n }\n\n [`@test The route controller specified via controllerName is used in render`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController',\n renderTemplate() {\n this.render('alternative_home');\n }\n }));\n\n this.add('controller:myController', _controller.default.extend({\n myValue: 'foo'\n }));\n\n this.addTemplate('alternative_home', '

    alternative home: {{myValue}}

    ');\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n\n assert.equal(text, 'alternative home: foo', 'The homepage template was rendered with data from the custom controller');\n });\n }\n\n [`@test The route controller specified via controllerName is used in render even when a controller with the routeName is available`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.addTemplate('home', '

    home: {{myValue}}

    ');\n\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController'\n }));\n\n this.add('controller:home', _controller.default.extend({\n myValue: 'home'\n }));\n\n this.add('controller:myController', _controller.default.extend({\n myValue: 'myController'\n }));\n\n return this.visit('/').then(() => {\n let homeRoute = this.applicationInstance.lookup('route:home');\n let myController = this.applicationInstance.lookup('controller:myController');\n let text = this.$('p').text();\n\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n\n assert.equal(text, 'home: myController', 'The homepage template was rendered with data from the custom controller');\n });\n }\n\n [`@test The Homepage with a 'setupController' hook modifying other controllers`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n setupController() /* controller */{\n this.controllerFor('home').set('hours', ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm']);\n }\n }));\n\n this.addTemplate('home', '
      {{#each hours as |entry|}}
    • {{entry}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The Homepage with a computed model that does not get overridden`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('controller:home', _controller.default.extend({\n model: (0, _metal.computed)(function () {\n return ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm'];\n })\n }));\n\n this.addTemplate('home', '
      {{#each model as |passage|}}
    • {{passage}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the context intact');\n });\n }\n\n [`@test The Homepage getting its controller context via model`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n model() {\n return ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm'];\n },\n\n setupController(controller, model) {\n assert.equal(this.controllerFor('home'), controller);\n\n this.controllerFor('home').set('hours', model);\n }\n }));\n\n this.addTemplate('home', '
      {{#each hours as |entry|}}
    • {{entry}}
    • {{/each}}
    ');\n\n return this.visit('/').then(() => {\n let text = this.$('ul li:nth-child(3)').text();\n\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The Specials Page getting its controller context by deserializing the params hash`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n this.add('route:special', _routing.Route.extend({\n model(params) {\n return _runtime.Object.create({\n menuItemId: params.menu_item_id\n });\n }\n }));\n\n this.addTemplate('special', '

    {{model.menuItemId}}

    ');\n\n return this.visit('/specials/1').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, '1', 'The model was used to render the template');\n });\n }\n\n ['@test The Specials Page defaults to looking models up via `find`']() {\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({ id });\n }\n });\n this.add('model:menu_item', MenuItem);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n this.addTemplate('special', '{{model.id}}');\n\n return this.visit('/specials/1').then(() => {\n this.assertText('1', 'The model was used to render the template');\n });\n }\n\n ['@test The Special Page returning a promise puts the app into a loading state until the promise is resolved']() {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, resolve;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n\n return new _rsvp.default.Promise(function (res) {\n resolve = res;\n });\n }\n });\n\n this.add('model:menu_item', MenuItem);\n\n this.addTemplate('special', '

    {{model.id}}

    ');\n this.addTemplate('loading', '

    LOADING!

    ');\n\n let visited = this.visit('/specials/1');\n this.assertText('LOADING!', 'The app is in the loading state');\n\n resolve(menuItem);\n\n return visited.then(() => {\n this.assertText('1', 'The app is now in the specials state');\n });\n }\n\n [`@test The loading state doesn't get entered for promises that resolve on the same run loop`](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return { id: id };\n }\n });\n\n this.add('model:menu_item', MenuItem);\n\n this.add('route:loading', _routing.Route.extend({\n enter() {\n assert.ok(false, \"LoadingRoute shouldn't have been entered.\");\n }\n }));\n\n this.addTemplate('special', '

    {{model.id}}

    ');\n this.addTemplate('loading', '

    LOADING!

    ');\n\n return this.visit('/specials/1').then(() => {\n let text = this.$('p').text();\n\n assert.equal(text, '1', 'The app is now in the specials state');\n });\n }\n\n [\"@test The Special page returning an error invokes SpecialRoute's error handler\"](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, promise, resolve;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n promise = new _rsvp.default.Promise(res => resolve = res);\n\n return promise;\n }\n });\n\n this.add('model:menu_item', MenuItem);\n\n this.add('route:special', _routing.Route.extend({\n setup() {\n throw new Error('Setup error');\n },\n actions: {\n error(reason) {\n assert.equal(reason.message, 'Setup error', 'SpecialRoute#error received the error thrown from setup');\n return true;\n }\n }\n }));\n\n this.handleURLRejectsWith(this, assert, 'specials/1', 'Setup error');\n\n (0, _runloop.run)(() => resolve(menuItem));\n }\n\n [\"@test ApplicationRoute's default error handler can be overridden\"](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let menuItem, resolve;\n\n let MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n return new _rsvp.default.Promise(res => resolve = res);\n }\n });\n this.add('model:menu_item', MenuItem);\n\n this.add('route:application', _routing.Route.extend({\n actions: {\n error(reason) {\n assert.equal(reason.message, 'Setup error', 'error was correctly passed to custom ApplicationRoute handler');\n return true;\n }\n }\n }));\n\n this.add('route:special', _routing.Route.extend({\n setup() {\n throw new Error('Setup error');\n }\n }));\n\n this.handleURLRejectsWith(this, assert, '/specials/1', 'Setup error');\n\n (0, _runloop.run)(() => resolve(menuItem));\n }\n\n ['@test Moving from one page to another triggers the correct callbacks'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('special', { path: '/specials/:menu_item_id' });\n });\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({ id: id });\n }\n });\n this.add('model:menu_item', MenuItem);\n\n this.addTemplate('home', '

    Home

    ');\n this.addTemplate('special', '

    {{model.id}}

    ');\n\n return this.visit('/').then(() => {\n this.assertText('Home', 'The app is now in the initial state');\n\n let promiseContext = MenuItem.create({ id: 1 });\n\n return this.visit('/specials/1', promiseContext);\n }).then(() => {\n assert.equal(this.currentURL, '/specials/1');\n this.assertText('1', 'The app is now transitioned');\n });\n }\n\n ['@test Nested callbacks are not exited when moving to siblings'](assert) {\n let rootSetup = 0;\n let rootRender = 0;\n let rootModel = 0;\n let rootSerialize = 0;\n let menuItem;\n let rootElement;\n\n let MenuItem = _runtime.Object.extend();\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({ id: id });\n return menuItem;\n }\n });\n\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('special', {\n path: '/specials/:menu_item_id',\n resetNamespace: true\n });\n });\n });\n\n this.add('route:root', _routing.Route.extend({\n model() {\n rootModel++;\n return this._super(...arguments);\n },\n\n setupController() {\n rootSetup++;\n },\n\n renderTemplate() {\n rootRender++;\n },\n\n serialize() {\n rootSerialize++;\n return this._super(...arguments);\n }\n }));\n\n this.add('route:loading', _routing.Route.extend({}));\n this.add('route:home', _routing.Route.extend({}));\n this.add('route:special', _routing.Route.extend({\n model({ menu_item_id }) {\n return MenuItem.find(menu_item_id);\n },\n setupController(controller, model) {\n (0, _metal.set)(controller, 'model', model);\n }\n }));\n\n this.addTemplate('root.index', '

    Home

    ');\n this.addTemplate('special', '

    {{model.id}}

    ');\n this.addTemplate('loading', '

    LOADING!

    ');\n\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('h3')), 'Home', 'The app is now in the initial state');\n assert.equal(rootSetup, 1, 'The root setup was triggered');\n assert.equal(rootRender, 1, 'The root render was triggered');\n assert.equal(rootSerialize, 0, 'The root serialize was not called');\n assert.equal(rootModel, 1, 'The root model was called');\n\n let router = this.applicationInstance.lookup('router:main');\n let menuItem = MenuItem.create({ id: 1 });\n\n return router.transitionTo('special', menuItem).then(function () {\n assert.equal(rootSetup, 1, 'The root setup was not triggered again');\n assert.equal(rootRender, 1, 'The root render was not triggered again');\n assert.equal(rootSerialize, 0, 'The root serialize was not called');\n\n // TODO: Should this be changed?\n assert.equal(rootModel, 1, 'The root model was called again');\n\n assert.deepEqual(router.location.path, '/specials/1');\n assert.equal(router.currentPath, 'root.special');\n });\n });\n }\n\n ['@test Events are triggered on the controller if a matching action name is implemented'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let stateIsNotCalled = true;\n\n this.add('route:home', _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff() {\n stateIsNotCalled = false;\n }\n }\n }));\n\n this.addTemplate('home', '{{name}}');\n this.add('controller:home', _controller.default.extend({\n actions: {\n showStuff(context) {\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n assert.deepEqual(context, { name: 'Tom Dale' }, 'an event with context is passed');\n done();\n }\n }\n }));\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events are triggered on the current state when defined in `actions` object'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let HomeRoute = _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff(obj) {\n assert.ok(this instanceof HomeRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj), { name: 'Tom Dale' }, 'the context is correct');\n done();\n }\n }\n });\n\n this.add('route:home', HomeRoute);\n this.addTemplate('home', '{{model.name}}');\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events defined in `actions` object are triggered on the current state when routes are nested'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n let model = { name: 'Tom Dale' };\n\n let RootRoute = _routing.Route.extend({\n actions: {\n showStuff(obj) {\n assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj), { name: 'Tom Dale' }, 'the context is correct');\n done();\n }\n }\n });\n this.add('route:root', RootRoute);\n this.add('route:root.index', _routing.Route.extend({\n model() {\n return model;\n }\n }));\n\n this.addTemplate('root.index', '{{model.name}}');\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test Events can be handled by inherited event handlers'](assert) {\n assert.expect(4);\n\n let SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar hander in super route');\n }\n }\n });\n\n let RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar handler in mixin');\n this._super(msg);\n }\n }\n });\n\n this.add('route:home', SuperRoute.extend(RouteMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz', 'baz hander in route');\n }\n }\n }));\n this.addTemplate('home', `\n Do foo\n Do bar with arg\n Do bar\n `);\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n rootElement.querySelector('.do-foo').click();\n rootElement.querySelector('.do-bar-with-arg').click();\n rootElement.querySelector('.do-baz').click();\n });\n }\n\n ['@test Actions are not triggered on the controller if a matching action name is implemented as a method'](assert) {\n let done = assert.async();\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let model = { name: 'Tom Dale' };\n let stateIsNotCalled = true;\n\n this.add('route:home', _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff(context) {\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n assert.deepEqual(context, { name: 'Tom Dale' }, 'an event with context is passed');\n done();\n }\n }\n }));\n\n this.addTemplate('home', '{{name}}');\n\n this.add('controller:home', _controller.default.extend({\n showStuff() {\n stateIsNotCalled = false;\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n }\n }));\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test actions can be triggered with multiple arguments'](assert) {\n let done = assert.async();\n this.router.map(function () {\n this.route('root', { path: '/' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n let model1 = { name: 'Tilde' };\n let model2 = { name: 'Tom Dale' };\n\n let RootRoute = _routing.Route.extend({\n actions: {\n showStuff(obj1, obj2) {\n assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj1), { name: 'Tilde' }, 'the first context is correct');\n assert.deepEqual(Object.assign({}, obj2), { name: 'Tom Dale' }, 'the second context is correct');\n done();\n }\n }\n });\n\n this.add('route:root', RootRoute);\n\n this.add('controller:root.index', _controller.default.extend({\n model1: model1,\n model2: model2\n }));\n\n this.addTemplate('root.index', '{{model1.name}}');\n\n this.visit('/').then(() => {\n document.getElementById('qunit-fixture').querySelector('a').click();\n });\n }\n\n ['@test transitioning multiple times in a single run loop only sets the URL once'](assert) {\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('foo');\n this.route('bar');\n });\n\n return this.visit('/').then(() => {\n let urlSetCount = 0;\n let router = this.applicationInstance.lookup('router:main');\n\n router.get('location').setURL = function (path) {\n urlSetCount++;\n (0, _metal.set)(this, 'path', path);\n };\n\n assert.equal(urlSetCount, 0);\n\n (0, _runloop.run)(function () {\n router.transitionTo('foo');\n router.transitionTo('bar');\n });\n\n assert.equal(urlSetCount, 1);\n assert.equal(router.get('location').getURL(), '/bar');\n });\n }\n\n ['@test navigating away triggers a url property change'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('foo', { path: '/foo' });\n this.route('bar', { path: '/bar' });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\n (0, _metal.addObserver)(router, 'url', function () {\n assert.ok(true, 'url change event was fired');\n });\n ['foo', 'bar', '/foo'].forEach(destination => (0, _runloop.run)(router, 'transitionTo', destination));\n });\n }\n\n ['@test using replaceWith calls location.replaceURL if available'](assert) {\n let setCount = 0;\n let replaceCount = 0;\n this.router.reopen({\n location: _routing.NoneLocation.create({\n setURL(path) {\n setCount++;\n (0, _metal.set)(this, 'path', path);\n },\n\n replaceURL(path) {\n replaceCount++;\n (0, _metal.set)(this, 'path', path);\n }\n })\n });\n\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('foo');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(setCount, 1);\n assert.equal(replaceCount, 0);\n\n (0, _runloop.run)(() => router.replaceWith('foo'));\n\n assert.equal(setCount, 1, 'should not call setURL');\n assert.equal(replaceCount, 1, 'should call replaceURL once');\n assert.equal(router.get('location').getURL(), '/foo');\n });\n }\n\n ['@test using replaceWith calls setURL if location.replaceURL is not defined'](assert) {\n let setCount = 0;\n\n this.router.reopen({\n location: _routing.NoneLocation.create({\n setURL(path) {\n setCount++;\n (0, _metal.set)(this, 'path', path);\n }\n })\n });\n\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('foo');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\n assert.equal(setCount, 1);\n (0, _runloop.run)(() => router.replaceWith('foo'));\n assert.equal(setCount, 2, 'should call setURL once');\n assert.equal(router.get('location').getURL(), '/foo');\n });\n }\n\n ['@test Route inherits model from parent route'](assert) {\n assert.expect(9);\n\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments');\n\n this.route('shares', { path: '/shares/:share_id', resetNamespace: true }, function () {\n this.route('share');\n });\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n let share1 = {};\n let share2 = {};\n let share3 = {};\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n let shares = {\n 1: share1,\n 2: share2,\n 3: share3\n };\n\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n }));\n\n this.add('route:the-post.comments', _routing.Route.extend({\n afterModel(post /*, transition */) {\n let parent_model = this.modelFor('the-post');\n\n assert.equal(post, parent_model);\n }\n }));\n\n this.add('route:shares', _routing.Route.extend({\n model(params) {\n return shares[params.share_id];\n }\n }));\n\n this.add('route:shares.share', _routing.Route.extend({\n afterModel(share /*, transition */) {\n let parent_model = this.modelFor('shares');\n\n assert.equal(share, parent_model);\n }\n }));\n\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, 'url: /posts/1/comments was handled');\n return this.visit('/posts/1/shares/1');\n }).then(() => {\n assert.ok(true, 'url: /posts/1/shares/1 was handled');\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, 'url: /posts/2/comments was handled');\n return this.visit('/posts/2/shares/2');\n }).then(() => {\n assert.ok(true, 'url: /posts/2/shares/2 was handled');\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, 'url: /posts/3/shares was handled');\n return this.visit('/posts/3/shares/3');\n }).then(() => {\n assert.ok(true, 'url: /posts/3/shares/3 was handled');\n });\n }\n\n ['@test Routes with { resetNamespace: true } inherits model from parent route'](assert) {\n assert.expect(6);\n\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments', { resetNamespace: true }, function () {});\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n }));\n\n this.add('route:comments', _routing.Route.extend({\n afterModel(post /*, transition */) {\n let parent_model = this.modelFor('the-post');\n\n assert.equal(post, parent_model);\n }\n }));\n\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, '/posts/1/comments');\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, '/posts/2/comments');\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, '/posts/3/comments');\n });\n }\n\n ['@test It is possible to get the model from a parent route'](assert) {\n assert.expect(6);\n\n this.router.map(function () {\n this.route('the-post', { path: '/posts/:post_id' }, function () {\n this.route('comments', { resetNamespace: true });\n });\n });\n\n let post1 = {};\n let post2 = {};\n let post3 = {};\n let currentPost;\n\n let posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n }));\n\n this.add('route:comments', _routing.Route.extend({\n model() {\n assert.equal(this.modelFor('the-post'), currentPost);\n }\n }));\n\n currentPost = post1;\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, '/posts/1/comments has been handled');\n currentPost = post2;\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, '/posts/2/comments has been handled');\n currentPost = post3;\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, '/posts/3/comments has been handled');\n });\n }\n\n ['@test A redirection hook is provided'](assert) {\n this.router.map(function () {\n this.route('choose', { path: '/' });\n this.route('home');\n });\n\n let chooseFollowed = 0;\n let destination = 'home';\n\n this.add('route:choose', _routing.Route.extend({\n redirect() {\n if (destination) {\n this.transitionTo(destination);\n }\n },\n\n setupController() {\n chooseFollowed++;\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(chooseFollowed, 0, \"The choose route wasn't entered since a transition occurred\");\n assert.equal(rootElement.querySelectorAll('h3.hours').length, 1, 'The home template was rendered');\n assert.equal(this.applicationInstance.lookup('controller:application').get('currentPath'), 'home');\n });\n }\n\n ['@test Redirecting from the middle of a route aborts the remainder of the routes'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n this.transitionTo('home');\n },\n setupController() {\n assert.ok(false, 'Should transition before setupController');\n }\n }));\n\n this.add('route:bar-baz', _routing.Route.extend({\n enter() {\n assert.ok(false, 'Should abort transition getting to next route');\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n this.handleURLAborts(assert, '/foo/bar/baz');\n assert.equal(this.applicationInstance.lookup('controller:application').get('currentPath'), 'home');\n assert.equal(router.get('location').getURL(), '/home');\n });\n }\n\n ['@test Redirecting to the current target in the middle of a route does not abort initial routing'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n let successCount = 0;\n\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n return this.transitionTo('bar.baz').then(function () {\n successCount++;\n });\n },\n\n setupController() {\n assert.ok(true, \"Should still invoke bar's setupController\");\n }\n }));\n\n this.add('route:bar.baz', _routing.Route.extend({\n setupController() {\n assert.ok(true, \"Should still invoke bar.baz's setupController\");\n }\n }));\n\n return this.visit('/foo/bar/baz').then(() => {\n assert.ok(true, '/foo/bar/baz has been handled');\n assert.equal(this.applicationInstance.lookup('controller:application').get('currentPath'), 'foo.bar.baz');\n assert.equal(successCount, 1, 'transitionTo success handler was called once');\n });\n }\n\n ['@test Redirecting to the current target with a different context aborts the remainder of the routes'](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', { path: 'bar/:id', resetNamespace: true }, function () {\n this.route('baz');\n });\n });\n });\n\n let model = { id: 2 };\n\n let count = 0;\n\n this.add('route:bar', _routing.Route.extend({\n afterModel() {\n if (count++ > 10) {\n assert.ok(false, 'infinite loop');\n } else {\n this.transitionTo('bar.baz', model);\n }\n }\n }));\n\n this.add('route:bar.baz', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'Should still invoke setupController');\n }\n }));\n\n return this.visit('/').then(() => {\n this.handleURLAborts(assert, '/foo/bar/1/baz');\n assert.equal(this.applicationInstance.lookup('controller:application').get('currentPath'), 'foo.bar.baz');\n assert.equal(this.applicationInstance.lookup('router:main').get('location').getURL(), '/foo/bar/2/baz');\n });\n }\n\n ['@test Transitioning from a parent event does not prevent currentPath from being set'](assert) {\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', { resetNamespace: true }, function () {\n this.route('baz');\n });\n this.route('qux');\n });\n });\n\n this.add('route:foo', _routing.Route.extend({\n actions: {\n goToQux() {\n this.transitionTo('foo.qux');\n }\n }\n }));\n\n return this.visit('/foo/bar/baz').then(() => {\n assert.ok(true, '/foo/bar/baz has been handled');\n let applicationController = this.applicationInstance.lookup('controller:application');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(applicationController.get('currentPath'), 'foo.bar.baz');\n (0, _runloop.run)(() => router.send('goToQux'));\n assert.equal(applicationController.get('currentPath'), 'foo.qux');\n assert.equal(router.get('location').getURL(), '/foo/qux');\n });\n }\n\n ['@test Generated names can be customized when providing routes with dot notation'](assert) {\n assert.expect(4);\n\n this.addTemplate('index', '
    Index
    ');\n this.addTemplate('application', \"

    Home

    {{outlet}}
    \");\n this.addTemplate('foo', \"
    {{outlet}}
    \");\n this.addTemplate('bar', \"
    {{outlet}}
    \");\n this.addTemplate('bar.baz', '

    {{name}}Bottom!

    ');\n\n this.router.map(function () {\n this.route('foo', { path: '/top' }, function () {\n this.route('bar', { path: '/middle', resetNamespace: true }, function () {\n this.route('baz', { path: '/bottom' });\n });\n });\n });\n\n this.add('route:foo', _routing.Route.extend({\n renderTemplate() {\n assert.ok(true, 'FooBarRoute was called');\n return this._super(...arguments);\n }\n }));\n\n this.add('route:bar.baz', _routing.Route.extend({\n renderTemplate() {\n assert.ok(true, 'BarBazRoute was called');\n return this._super(...arguments);\n }\n }));\n\n this.add('controller:bar', _controller.default.extend({\n name: 'Bar'\n }));\n\n this.add('controller:bar.baz', _controller.default.extend({\n name: 'BarBaz'\n }));\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle .bottom p')), 'BarBazBottom!', 'The templates were rendered into their appropriate parents');\n });\n }\n\n [\"@test Child routes render into their parent route's template by default\"](assert) {\n this.addTemplate('index', '
    Index
    ');\n this.addTemplate('application', \"

    Home

    {{outlet}}
    \");\n this.addTemplate('top', \"
    {{outlet}}
    \");\n this.addTemplate('middle', \"
    {{outlet}}
    \");\n this.addTemplate('middle.bottom', '

    Bottom!

    ');\n\n this.router.map(function () {\n this.route('top', function () {\n this.route('middle', { resetNamespace: true }, function () {\n this.route('bottom');\n });\n });\n });\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle .bottom p')), 'Bottom!', 'The templates were rendered into their appropriate parents');\n });\n }\n\n ['@test Child routes render into specified template'](assert) {\n this.addTemplate('index', '
    Index
    ');\n this.addTemplate('application', \"

    Home

    {{outlet}}
    \");\n this.addTemplate('top', \"
    {{outlet}}
    \");\n this.addTemplate('middle', \"
    {{outlet}}
    \");\n this.addTemplate('middle.bottom', '

    Bottom!

    ');\n\n this.router.map(function () {\n this.route('top', function () {\n this.route('middle', { resetNamespace: true }, function () {\n this.route('bottom');\n });\n });\n });\n\n this.add('route:middle.bottom', _routing.Route.extend({\n renderTemplate() {\n this.render('middle/bottom', { into: 'top' });\n }\n }));\n\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('.main .middle .bottom p').length, 0, 'should not render into the middle template');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle > p')), 'Bottom!', 'The template was rendered into the top template');\n });\n }\n\n ['@test Rendering into specified template with slash notation'](assert) {\n this.addTemplate('person.profile', 'profile {{outlet}}');\n this.addTemplate('person.details', 'details!');\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n this.render('person/profile');\n this.render('person/details', { into: 'person/profile' });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'profile details!', 'The templates were rendered');\n });\n }\n\n ['@test Parent route context change'](assert) {\n let editCount = 0;\n let editedPostIds = (0, _runtime.A)();\n\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('post', '{{outlet}}');\n this.addTemplate('post/index', 'showing');\n this.addTemplate('post/edit', 'editing');\n\n this.router.map(function () {\n this.route('posts', function () {\n this.route('post', { path: '/:postId', resetNamespace: true }, function () {\n this.route('edit');\n });\n });\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showPost(context) {\n this.transitionTo('post', context);\n }\n }\n }));\n\n this.add('route:post', _routing.Route.extend({\n model(params) {\n return { id: params.postId };\n },\n\n serialize(model) {\n return { postId: model.id };\n },\n\n actions: {\n editPost() {\n this.transitionTo('post.edit');\n }\n }\n }));\n\n this.add('route:post.edit', _routing.Route.extend({\n model() {\n let postId = this.modelFor('post').id;\n editedPostIds.push(postId);\n return null;\n },\n setup() {\n this._super(...arguments);\n editCount++;\n }\n }));\n\n return this.visit('/posts/1').then(() => {\n assert.ok(true, '/posts/1 has been handled');\n let router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(() => router.send('editPost'));\n (0, _runloop.run)(() => router.send('showPost', { id: '2' }));\n (0, _runloop.run)(() => router.send('editPost'));\n assert.equal(editCount, 2, 'set up the edit route twice without failure');\n assert.deepEqual(editedPostIds, ['1', '2'], 'modelFor posts.post returns the right context');\n });\n }\n\n ['@test Router accounts for rootURL on page load when using history location'](assert) {\n let rootURL = window.location.pathname + '/app';\n let postsTemplateRendered = false;\n let setHistory;\n\n setHistory = function (obj, path) {\n obj.set('history', { state: { path: path } });\n };\n\n let location = _routing.HistoryLocation.create({\n initState() {\n let path = rootURL + '/posts';\n\n setHistory(this, path);\n this.set('location', {\n pathname: path,\n href: 'http://localhost/' + path\n });\n },\n\n replaceState(path) {\n setHistory(this, path);\n },\n\n pushState(path) {\n setHistory(this, path);\n }\n });\n\n this.router.reopen({\n // location: 'historyTest',\n location,\n rootURL: rootURL\n });\n\n this.router.map(function () {\n this.route('posts', { path: '/posts' });\n });\n\n this.add('route:posts', _routing.Route.extend({\n model() {},\n renderTemplate() {\n postsTemplateRendered = true;\n }\n }));\n\n return this.visit('/').then(() => {\n assert.ok(postsTemplateRendered, 'Posts route successfully stripped from rootURL');\n\n (0, _internalTestHelpers.runDestroy)(location);\n location = null;\n });\n }\n\n ['@test The rootURL is passed properly to the location implementation'](assert) {\n assert.expect(1);\n let rootURL = '/blahzorz';\n this.add('location:history-test', _routing.HistoryLocation.extend({\n rootURL: 'this is not the URL you are looking for',\n history: {\n pushState() {}\n },\n initState() {\n assert.equal(this.get('rootURL'), rootURL);\n }\n }));\n\n this.router.reopen({\n location: 'history-test',\n rootURL: rootURL,\n // if we transition in this test we will receive failures\n // if the tests are run from a static file\n _doURLTransition() {\n return _rsvp.default.resolve('');\n }\n });\n\n return this.visit('/');\n }\n\n ['@test Only use route rendered into main outlet for default into property on child'](assert) {\n this.addTemplate('application', \"{{outlet 'menu'}}{{outlet}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('posts.index', '

    postsIndex

    ');\n this.addTemplate('posts.menu', '
    postsMenu
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('posts/menu', {\n into: 'application',\n outlet: 'menu'\n });\n }\n }));\n\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-menu')), 'postsMenu', 'The posts/menu template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n });\n }\n\n ['@test Generating a URL should not affect currentModel'](assert) {\n this.router.map(function () {\n this.route('post', { path: '/posts/:post_id' });\n });\n\n let posts = {\n 1: { id: 1 },\n 2: { id: 2 }\n };\n\n this.add('route:post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n }));\n\n return this.visit('/posts/1').then(() => {\n assert.ok(true, '/posts/1 has been handled');\n\n let route = this.applicationInstance.lookup('route:post');\n assert.equal(route.modelFor('post'), posts[1]);\n\n let url = this.applicationInstance.lookup('router:main').generate('post', posts[2]);\n assert.equal(url, '/posts/2');\n assert.equal(route.modelFor('post'), posts[1]);\n });\n }\n\n [\"@test Nested index route is not overridden by parent's implicit index route\"](assert) {\n this.router.map(function () {\n this.route('posts', function () {\n this.route('index', { path: ':category' });\n });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n return router.transitionTo('posts', { category: 'emberjs' });\n }).then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.deepEqual(router.location.path, '/posts/emberjs');\n });\n }\n\n ['@test Application template does not duplicate when re-rendered'](assert) {\n this.addTemplate('application', '

    I render once

    {{outlet}}');\n\n this.router.map(function () {\n this.route('posts');\n });\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return (0, _runtime.A)();\n }\n }));\n\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('h3.render-once')), 'I render once');\n });\n }\n\n ['@test Child routes should render inside the application template if the application template causes a redirect'](assert) {\n this.addTemplate('application', '

    App

    {{outlet}}');\n this.addTemplate('posts', 'posts');\n\n this.router.map(function () {\n this.route('posts');\n this.route('photos');\n });\n\n this.add('route:application', _routing.Route.extend({\n afterModel() {\n this.transitionTo('posts');\n }\n }));\n\n return this.visit('/posts').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'App posts');\n });\n }\n\n [\"@test The template is not re-rendered when the route's context changes\"](assert) {\n this.router.map(function () {\n this.route('page', { path: '/page/:name' });\n });\n\n this.add('route:page', _routing.Route.extend({\n model(params) {\n return _runtime.Object.create({ name: params.name });\n }\n }));\n\n let insertionCount = 0;\n this.add('component:foo-bar', _glimmer.Component.extend({\n didInsertElement() {\n insertionCount += 1;\n }\n }));\n\n this.addTemplate('page', '

    {{model.name}}{{foo-bar}}

    ');\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/page/first').then(() => {\n assert.ok(true, '/page/first has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'first');\n assert.equal(insertionCount, 1);\n return this.visit('/page/second');\n }).then(() => {\n assert.ok(true, '/page/second has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'second');\n assert.equal(insertionCount, 1, 'view should have inserted only once');\n let router = this.applicationInstance.lookup('router:main');\n return (0, _runloop.run)(() => router.transitionTo('page', _runtime.Object.create({ name: 'third' })));\n }).then(() => {\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'third');\n assert.equal(insertionCount, 1, 'view should still have inserted only once');\n });\n }\n\n ['@test The template is not re-rendered when two routes present the exact same template & controller'](assert) {\n this.router.map(function () {\n this.route('first');\n this.route('second');\n this.route('third');\n this.route('fourth');\n });\n\n // Note add a component to test insertion\n\n let insertionCount = 0;\n this.add('component:x-input', _glimmer.Component.extend({\n didInsertElement() {\n insertionCount += 1;\n }\n }));\n\n let SharedRoute = _routing.Route.extend({\n setupController() {\n this.controllerFor('shared').set('message', 'This is the ' + this.routeName + ' message');\n },\n\n renderTemplate() {\n this.render('shared', { controller: 'shared' });\n }\n });\n\n this.add('route:shared', SharedRoute);\n this.add('route:first', SharedRoute.extend());\n this.add('route:second', SharedRoute.extend());\n this.add('route:third', SharedRoute.extend());\n this.add('route:fourth', SharedRoute.extend());\n\n this.add('controller:shared', _controller.default.extend());\n\n this.addTemplate('shared', '

    {{message}}{{x-input}}

    ');\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/first').then(() => {\n assert.ok(true, '/first has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the first message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return this.visit('/second');\n }).then(() => {\n assert.ok(true, '/second has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the second message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return (0, _runloop.run)(() => {\n this.applicationInstance.lookup('router:main').transitionTo('third').then(function () {\n assert.ok(true, 'expected transition');\n }, function (reason) {\n assert.ok(false, 'unexpected transition failure: ', QUnit.jsDump.parse(reason));\n });\n });\n }).then(() => {\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the third message');\n assert.equal(insertionCount, 1, 'expected one assertion');\n return this.visit('fourth');\n }).then(() => {\n assert.ok(true, '/fourth has been handled');\n assert.equal(insertionCount, 1, 'expected one assertion');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'This is the fourth message');\n });\n }\n\n ['@test ApplicationRoute with model does not proxy the currentPath'](assert) {\n let model = {};\n let currentPath;\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return model;\n }\n }));\n\n this.add('controller:application', _controller.default.extend({\n currentPathDidChange: (0, _metal.observer)('currentPath', function () {\n currentPath = this.currentPath;\n })\n }));\n\n return this.visit('/').then(() => {\n assert.equal(currentPath, 'index', 'currentPath is index');\n assert.equal('currentPath' in model, false, 'should have defined currentPath on controller');\n });\n }\n\n ['@test Promises encountered on app load put app into loading state until resolved'](assert) {\n assert.expect(2);\n\n let deferred = _rsvp.default.defer();\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n\n this.add('route:index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n this.addTemplate('index', '

    INDEX

    ');\n this.addTemplate('loading', '

    LOADING

    ');\n\n (0, _runloop.run)(() => this.visit('/'));\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'LOADING', 'The loading state is displaying.');\n (0, _runloop.run)(deferred.resolve);\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'INDEX', 'The index route is display.');\n }\n\n ['@test Route should tear down multiple outlets'](assert) {\n this.addTemplate('application', \"{{outlet 'menu'}}{{outlet}}{{outlet 'footer'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '

    postsIndex

    ');\n this.addTemplate('posts.menu', '
    postsMenu
    ');\n this.addTemplate('posts.footer', '
    postsFooter
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n renderTemplate() {\n this.render('posts/menu', {\n into: 'application',\n outlet: 'menu'\n });\n\n this.render();\n\n this.render('posts/footer', {\n into: 'application',\n outlet: 'footer'\n });\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-menu')), 'postsMenu', 'The posts/menu template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-footer')), 'postsFooter', 'The posts/footer template was rendered');\n\n return this.visit('/users');\n }).then(() => {\n assert.ok(true, '/users has been handled');\n assert.equal(rootElement.querySelector('div.posts-menu'), null, 'The posts/menu template was removed');\n assert.equal(rootElement.querySelector('p.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-footer'), null, 'The posts/footer template was removed');\n });\n }\n\n ['@test Route supports clearing outlet explicitly'](assert) {\n this.addTemplate('application', \"{{outlet}}{{outlet 'modal'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '
    postsIndex {{outlet}}
    ');\n this.addTemplate('posts.modal', '
    postsModal
    ');\n this.addTemplate('posts.extra', '
    postsExtra
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showModal() {\n this.render('posts/modal', {\n into: 'application',\n outlet: 'modal'\n });\n },\n hideModal() {\n this.disconnectOutlet({\n outlet: 'modal',\n parentView: 'application'\n });\n }\n }\n }));\n\n this.add('route:posts.index', _routing.Route.extend({\n actions: {\n showExtra() {\n this.render('posts/extra', {\n into: 'posts/index'\n });\n },\n hideExtra() {\n this.disconnectOutlet({ parentView: 'posts/index' });\n }\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n\n return this.visit('/posts').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n (0, _runloop.run)(() => router.send('showModal'));\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(() => router.send('showExtra'));\n\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-extra')), 'postsExtra', 'The posts/extra template was rendered');\n (0, _runloop.run)(() => router.send('hideModal'));\n\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n (0, _runloop.run)(() => router.send('hideExtra'));\n\n assert.equal(rootElement.querySelector('div.posts-extra'), null, 'The posts/extra template was removed');\n (0, _runloop.run)(function () {\n router.send('showModal');\n });\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(function () {\n router.send('showExtra');\n });\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-extra')), 'postsExtra', 'The posts/extra template was rendered');\n return this.visit('/users');\n }).then(() => {\n assert.equal(rootElement.querySelector('div.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n assert.equal(rootElement.querySelector('div.posts-extra'), null, 'The posts/extra template was removed');\n });\n }\n\n ['@test Route supports clearing outlet using string parameter'](assert) {\n this.addTemplate('application', \"{{outlet}}{{outlet 'modal'}}\");\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('users', 'users');\n this.addTemplate('posts.index', '
    postsIndex {{outlet}}
    ');\n this.addTemplate('posts.modal', '
    postsModal
    ');\n\n this.router.map(function () {\n this.route('posts', function () {});\n this.route('users', function () {});\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showModal() {\n this.render('posts/modal', {\n into: 'application',\n outlet: 'modal'\n });\n },\n hideModal() {\n this.disconnectOutlet('modal');\n }\n }\n }));\n\n let rootElement = document.getElementById('qunit-fixture');\n return this.visit('/posts').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-index')), 'postsIndex', 'The posts/index template was rendered');\n (0, _runloop.run)(() => router.send('showModal'));\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('div.posts-modal')), 'postsModal', 'The posts/modal template was rendered');\n (0, _runloop.run)(() => router.send('hideModal'));\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n return this.visit('/users');\n }).then(() => {\n assert.equal(rootElement.querySelector('div.posts-index'), null, 'The posts/index template was removed');\n assert.equal(rootElement.querySelector('div.posts-modal'), null, 'The posts/modal template was removed');\n });\n }\n\n ['@test Route silently fails when cleaning an outlet from an inactive view'](assert) {\n assert.expect(1); // handleURL\n\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('posts', \"{{outlet 'modal'}}\");\n this.addTemplate('modal', 'A Yo.');\n\n this.router.map(function () {\n this.route('posts');\n });\n\n this.add('route:posts', _routing.Route.extend({\n actions: {\n hideSelf() {\n this.disconnectOutlet({\n outlet: 'main',\n parentView: 'application'\n });\n },\n showModal() {\n this.render('modal', { into: 'posts', outlet: 'modal' });\n },\n hideModal() {\n this.disconnectOutlet({ outlet: 'modal', parentView: 'posts' });\n }\n }\n }));\n\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n let router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(() => router.send('showModal'));\n (0, _runloop.run)(() => router.send('hideSelf'));\n (0, _runloop.run)(() => router.send('hideModal'));\n });\n }\n\n ['@test Router `willTransition` hook passes in cancellable transition'](assert) {\n // Should hit willTransition 3 times, once for the initial route, and then 2 more times\n // for the two handleURL calls below\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.expect(7);\n\n this.router.reopen({\n init() {\n this._super(...arguments);\n this.on('routeWillChange', transition => {\n assert.ok(true, 'routeWillChange was called');\n if (transition.intent && transition.intent.url !== '/') {\n transition.abort();\n }\n });\n }\n });\n } else {\n assert.expect(5);\n this.router.reopen({\n willTransition(_, _2, transition) {\n assert.ok(true, 'willTransition was called');\n if (transition.intent.url !== '/') {\n transition.abort();\n }\n }\n });\n }\n\n this.router.map(function () {\n this.route('nork');\n this.route('about');\n });\n\n this.add('route:loading', _routing.Route.extend({\n activate() {\n assert.ok(false, 'LoadingRoute was not entered');\n }\n }));\n\n this.add('route:nork', _routing.Route.extend({\n activate() {\n assert.ok(false, 'NorkRoute was not entered');\n }\n }));\n\n this.add('route:about', _routing.Route.extend({\n activate() {\n assert.ok(false, 'AboutRoute was not entered');\n }\n }));\n\n return this.visit('/').then(() => {\n this.handleURLAborts(assert, '/nork');\n this.handleURLAborts(assert, '/about');\n });\n }\n\n ['@test Aborting/redirecting the transition in `willTransition` prevents LoadingRoute from being entered'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('index');\n this.route('nork');\n this.route('about');\n });\n\n let redirect = false;\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition(transition) {\n assert.ok(true, 'willTransition was called');\n if (redirect) {\n // router.js won't refire `willTransition` for this redirect\n this.transitionTo('about');\n } else {\n transition.abort();\n }\n }\n }\n }));\n\n let deferred = null;\n\n this.add('route:loading', _routing.Route.extend({\n activate() {\n assert.ok(deferred, 'LoadingRoute should be entered at this time');\n },\n deactivate() {\n assert.ok(true, 'LoadingRoute was exited');\n }\n }));\n\n this.add('route:nork', _routing.Route.extend({\n activate() {\n assert.ok(true, 'NorkRoute was entered');\n }\n }));\n\n this.add('route:about', _routing.Route.extend({\n activate() {\n assert.ok(true, 'AboutRoute was entered');\n },\n model() {\n if (deferred) {\n return deferred.promise;\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n // Attempted transitions out of index should abort.\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'handleURL', '/nork');\n\n // Attempted transitions out of index should redirect to about\n redirect = true;\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'transitionTo', 'index');\n\n // Redirected transitions out of index to a route with a\n // promise model should pause the transition and\n // activate LoadingRoute\n deferred = _rsvp.default.defer();\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(deferred.resolve);\n });\n }\n\n ['@test `didTransition` event fires on the router'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('nork');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n router.one('didTransition', function () {\n assert.ok(true, 'didTransition fired on initial routing');\n });\n this.visit('/');\n }).then(() => {\n let router = this.applicationInstance.lookup('router:main');\n router.one('didTransition', function () {\n assert.ok(true, 'didTransition fired on the router');\n assert.equal(router.get('url'), '/nork', 'The url property is updated by the time didTransition fires');\n });\n\n return this.visit('/nork');\n });\n }\n\n ['@test `didTransition` can be reopened'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('nork');\n });\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.ok(true, 'no longer a valid test');\n return;\n } else {\n this.router.reopen({\n didTransition() {\n this._super(...arguments);\n assert.ok(true, 'reopened didTransition was called');\n }\n });\n }\n\n return this.visit('/');\n }\n\n ['@test `activate` event fires on the route'](assert) {\n assert.expect(2);\n\n let eventFired = 0;\n\n this.router.map(function () {\n this.route('nork');\n });\n\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('activate', function () {\n assert.equal(++eventFired, 1, 'activate event is fired once');\n });\n },\n\n activate() {\n assert.ok(true, 'activate hook is called');\n }\n }));\n\n return this.visit('/nork');\n }\n\n ['@test `deactivate` event fires on the route'](assert) {\n assert.expect(2);\n\n let eventFired = 0;\n\n this.router.map(function () {\n this.route('nork');\n this.route('dork');\n });\n\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('deactivate', function () {\n assert.equal(++eventFired, 1, 'deactivate event is fired once');\n });\n },\n\n deactivate() {\n assert.ok(true, 'deactivate hook is called');\n }\n }));\n\n return this.visit('/nork').then(() => this.visit('/dork'));\n }\n\n ['@test Actions can be handled by inherited action handlers'](assert) {\n assert.expect(4);\n\n let SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n }\n });\n\n let RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n this._super(msg);\n }\n }\n });\n\n this.add('route:home', SuperRoute.extend(RouteMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n }\n }));\n\n this.addTemplate('home', `\n Do foo\n Do bar with arg\n Do bar\n `);\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n rootElement.querySelector('.do-foo').click();\n rootElement.querySelector('.do-bar-with-arg').click();\n rootElement.querySelector('.do-baz').click();\n });\n }\n\n ['@test transitionTo returns Transition when passed a route name'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('bar');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let transition = (0, _runloop.run)(() => router.transitionTo('bar'));\n assert.equal(transition instanceof _router_js.InternalTransition, true);\n });\n }\n\n ['@test transitionTo returns Transition when passed a url'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('root', { path: '/' });\n this.route('bar', function () {\n this.route('baz');\n });\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let transition = (0, _runloop.run)(() => router.transitionTo('/bar/baz'));\n assert.equal(transition instanceof _router_js.InternalTransition, true);\n });\n }\n\n ['@test currentRouteName is a property installed on ApplicationController that can be used in transitionTo'](assert) {\n assert.expect(24);\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n this.route('be', function () {\n this.route('excellent', { resetNamespace: true }, function () {\n this.route('to', { resetNamespace: true }, function () {\n this.route('each', { resetNamespace: true }, function () {\n this.route('other');\n });\n });\n });\n });\n });\n\n return this.visit('/').then(() => {\n let appController = this.applicationInstance.lookup('controller:application');\n let router = this.applicationInstance.lookup('router:main');\n\n function transitionAndCheck(path, expectedPath, expectedRouteName) {\n if (path) {\n (0, _runloop.run)(router, 'transitionTo', path);\n }\n assert.equal(appController.get('currentPath'), expectedPath);\n assert.equal(appController.get('currentRouteName'), expectedRouteName);\n }\n\n transitionAndCheck(null, 'index', 'index');\n transitionAndCheck('/be', 'be.index', 'be.index');\n transitionAndCheck('/be/excellent', 'be.excellent.index', 'excellent.index');\n transitionAndCheck('/be/excellent/to', 'be.excellent.to.index', 'to.index');\n transitionAndCheck('/be/excellent/to/each', 'be.excellent.to.each.index', 'each.index');\n transitionAndCheck('/be/excellent/to/each/other', 'be.excellent.to.each.other', 'each.other');\n\n transitionAndCheck('index', 'index', 'index');\n transitionAndCheck('be', 'be.index', 'be.index');\n transitionAndCheck('excellent', 'be.excellent.index', 'excellent.index');\n transitionAndCheck('to.index', 'be.excellent.to.index', 'to.index');\n transitionAndCheck('each', 'be.excellent.to.each.index', 'each.index');\n transitionAndCheck('each.other', 'be.excellent.to.each.other', 'each.other');\n });\n }\n\n ['@test Route model hook finds the same model as a manual find'](assert) {\n let post;\n let Post = _runtime.Object.extend();\n this.add('model:post', Post);\n Post.reopenClass({\n find() {\n post = this;\n return {};\n }\n });\n\n this.router.map(function () {\n this.route('post', { path: '/post/:post_id' });\n });\n\n return this.visit('/post/1').then(() => {\n assert.equal(Post, post);\n });\n }\n\n ['@test Routes can refresh themselves causing their model hooks to be re-run'](assert) {\n this.router.map(function () {\n this.route('parent', { path: '/parent/:parent_id' }, function () {\n this.route('child');\n });\n });\n\n let appcount = 0;\n this.add('route:application', _routing.Route.extend({\n model() {\n ++appcount;\n }\n }));\n\n let parentcount = 0;\n this.add('route:parent', _routing.Route.extend({\n model(params) {\n assert.equal(params.parent_id, '123');\n ++parentcount;\n },\n actions: {\n refreshParent() {\n this.refresh();\n }\n }\n }));\n\n let childcount = 0;\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n ++childcount;\n }\n }));\n\n let router;\n return this.visit('/').then(() => {\n router = this.applicationInstance.lookup('router:main');\n assert.equal(appcount, 1);\n assert.equal(parentcount, 0);\n assert.equal(childcount, 0);\n return (0, _runloop.run)(router, 'transitionTo', 'parent.child', '123');\n }).then(() => {\n assert.equal(appcount, 1);\n assert.equal(parentcount, 1);\n assert.equal(childcount, 1);\n return (0, _runloop.run)(router, 'send', 'refreshParent');\n }).then(() => {\n assert.equal(appcount, 1);\n assert.equal(parentcount, 2);\n assert.equal(childcount, 2);\n });\n }\n\n ['@test Specifying non-existent controller name in route#render throws'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.add('route:home', _routing.Route.extend({\n renderTemplate() {\n expectAssertion(() => {\n this.render('homepage', {\n controller: 'stefanpenneristhemanforme'\n });\n }, \"You passed `controller: 'stefanpenneristhemanforme'` into the `render` method, but no such controller could be found.\");\n }\n }));\n\n return this.visit('/');\n }\n\n [\"@test Redirecting with null model doesn't error out\"](assert) {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('about', { path: '/about/:hurhurhur' });\n });\n\n this.add('route:about', _routing.Route.extend({\n serialize: function (model) {\n if (model === null) {\n return { hurhurhur: 'TreeklesMcGeekles' };\n }\n }\n }));\n\n this.add('route:home', _routing.Route.extend({\n beforeModel() {\n this.transitionTo('about', null);\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(router.get('location.path'), '/about/TreeklesMcGeekles');\n });\n }\n\n ['@test rejecting the model hooks promise with a non-error prints the `message` property'](assert) {\n assert.expect(5);\n\n let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n let rejectedStack = 'Yeah, buddy: stack gets printed too.';\n\n this.router.map(function () {\n this.route('yippie', { path: '/' });\n });\n\n console.error = function (initialMessage, errorMessage, errorStack) {\n assert.equal(initialMessage, 'Error while processing route: yippie', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n assert.equal(errorStack, rejectedStack, \"the rejected reason's stack property is logged\");\n };\n\n this.add('route:yippie', _routing.Route.extend({\n model() {\n return _rsvp.default.reject({\n message: rejectedMessage,\n stack: rejectedStack\n });\n }\n }));\n\n return assert.throws(() => {\n return this.visit('/');\n }, function (err) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n ['@test rejecting the model hooks promise with an error with `errorThrown` property prints `errorThrown.message` property'](assert) {\n assert.expect(5);\n let rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n let rejectedStack = 'Yeah, buddy: stack gets printed too.';\n\n this.router.map(function () {\n this.route('yippie', { path: '/' });\n });\n\n console.error = function (initialMessage, errorMessage, errorStack) {\n assert.equal(initialMessage, 'Error while processing route: yippie', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n assert.equal(errorStack, rejectedStack, \"the rejected reason's stack property is logged\");\n };\n\n this.add('route:yippie', _routing.Route.extend({\n model() {\n return _rsvp.default.reject({\n errorThrown: { message: rejectedMessage, stack: rejectedStack }\n });\n }\n }));\n\n assert.throws(() => this.visit('/'), function (err) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n ['@test rejecting the model hooks promise with no reason still logs error'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('wowzers', { path: '/' });\n });\n\n console.error = function (initialMessage) {\n assert.equal(initialMessage, 'Error while processing route: wowzers', 'a message with the current route name is printed');\n };\n\n this.add('route:wowzers', _routing.Route.extend({\n model() {\n return _rsvp.default.reject();\n }\n }));\n\n return assert.throws(() => this.visit('/'));\n }\n\n ['@test rejecting the model hooks promise with a string shows a good error'](assert) {\n assert.expect(3);\n let rejectedMessage = 'Supercalifragilisticexpialidocious';\n\n this.router.map(function () {\n this.route('yondo', { path: '/' });\n });\n\n console.error = function (initialMessage, errorMessage) {\n assert.equal(initialMessage, 'Error while processing route: yondo', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n };\n\n this.add('route:yondo', _routing.Route.extend({\n model() {\n return _rsvp.default.reject(rejectedMessage);\n }\n }));\n\n assert.throws(() => this.visit('/'), new RegExp(rejectedMessage), 'expected an exception');\n }\n\n [\"@test willLeave, willChangeContext, willChangeModel actions don't fire unless feature flag enabled\"](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('about');\n });\n\n function shouldNotFire() {\n assert.ok(false, \"this action shouldn't have been received\");\n }\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willChangeModel: shouldNotFire,\n willChangeContext: shouldNotFire,\n willLeave: shouldNotFire\n }\n }));\n\n this.add('route:about', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'about route was entered');\n }\n }));\n\n return this.visit('/about');\n }\n\n ['@test Errors in transitionTo within redirect hook are logged'](assert) {\n assert.expect(4);\n let actual = [];\n\n this.router.map(function () {\n this.route('yondo', { path: '/' });\n this.route('stink-bomb');\n });\n\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n this.transitionTo('stink-bomb', { something: 'goes boom' });\n }\n }));\n\n console.error = function () {\n // push the arguments onto an array so we can detect if the error gets logged twice\n actual.push(arguments);\n };\n\n assert.throws(() => this.visit('/'), /More context objects were passed/);\n\n assert.equal(actual.length, 1, 'the error is only logged once');\n assert.equal(actual[0][0], 'Error while processing route: yondo', 'source route is printed');\n assert.ok(actual[0][1].match(/More context objects were passed than there are dynamic segments for the route: stink-bomb/), 'the error is printed');\n }\n\n ['@test Errors in transition show error template if available'](assert) {\n this.addTemplate('error', \"
    Error!
    \");\n\n this.router.map(function () {\n this.route('yondo', { path: '/' });\n this.route('stink-bomb');\n });\n\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n this.transitionTo('stink-bomb', { something: 'goes boom' });\n }\n }));\n console.error = () => {};\n\n return this.visit('/').then(() => {\n let rootElement = document.querySelector('#qunit-fixture');\n assert.equal(rootElement.querySelectorAll('#error').length, 1, 'Error template was rendered.');\n });\n }\n\n ['@test Route#resetController gets fired when changing models and exiting routes'](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('a', function () {\n this.route('b', { path: '/b/:id', resetNamespace: true }, function () {});\n this.route('c', { path: '/c/:id', resetNamespace: true }, function () {});\n });\n this.route('out');\n });\n\n let calls = [];\n\n let SpyRoute = _routing.Route.extend({\n setupController() /* controller, model, transition */{\n calls.push(['setup', this.routeName]);\n },\n\n resetController() /* controller */{\n calls.push(['reset', this.routeName]);\n }\n });\n\n this.add('route:a', SpyRoute.extend());\n this.add('route:b', SpyRoute.extend());\n this.add('route:c', SpyRoute.extend());\n this.add('route:out', SpyRoute.extend());\n\n let router;\n return this.visit('/').then(() => {\n router = this.applicationInstance.lookup('router:main');\n assert.deepEqual(calls, []);\n return (0, _runloop.run)(router, 'transitionTo', 'b', 'b-1');\n }).then(() => {\n assert.deepEqual(calls, [['setup', 'a'], ['setup', 'b']]);\n calls.length = 0;\n return (0, _runloop.run)(router, 'transitionTo', 'c', 'c-1');\n }).then(() => {\n assert.deepEqual(calls, [['reset', 'b'], ['setup', 'c']]);\n calls.length = 0;\n return (0, _runloop.run)(router, 'transitionTo', 'out');\n }).then(() => {\n assert.deepEqual(calls, [['reset', 'c'], ['reset', 'a'], ['setup', 'out']]);\n });\n }\n\n ['@test Exception during initialization of non-initial route is not swallowed'](assert) {\n this.router.map(function () {\n this.route('boom');\n });\n this.add('route:boom', _routing.Route.extend({\n init() {\n throw new Error('boom!');\n }\n }));\n\n return assert.throws(() => this.visit('/boom'), /\\bboom\\b/);\n }\n\n ['@test Exception during initialization of initial route is not swallowed'](assert) {\n this.router.map(function () {\n this.route('boom', { path: '/' });\n });\n this.add('route:boom', _routing.Route.extend({\n init() {\n throw new Error('boom!');\n }\n }));\n return assert.throws(() => this.visit('/'), /\\bboom\\b/);\n }\n\n ['@test {{outlet}} works when created after initial render'](assert) {\n this.addTemplate('sample', 'Hi{{#if showTheThing}}{{outlet}}{{/if}}Bye');\n this.addTemplate('sample.inner', 'Yay');\n this.addTemplate('sample.inner2', 'Boo');\n this.router.map(function () {\n this.route('sample', { path: '/' }, function () {\n this.route('inner', { path: '/' });\n this.route('inner2', { path: '/2' });\n });\n });\n\n let rootElement;\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'HiBye', 'initial render');\n\n (0, _runloop.run)(() => this.applicationInstance.lookup('controller:sample').set('showTheThing', true));\n\n assert.equal(rootElement.textContent.trim(), 'HiYayBye', 'second render');\n return this.visit('/2');\n }).then(() => {\n assert.equal(rootElement.textContent.trim(), 'HiBooBye', 'third render');\n });\n }\n\n ['@test Can render into a named outlet at the top level'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'initial render');\n });\n }\n\n ['@test Can disconnect a named outlet at the top level'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n },\n actions: {\n banish() {\n this.disconnectOutlet({\n parentView: 'application',\n outlet: 'other'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'initial render');\n\n (0, _runloop.run)(this.applicationInstance.lookup('router:main'), 'send', 'banish');\n\n assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'second render');\n });\n }\n\n ['@test Can render into a named outlet at the top level, with empty main outlet'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n\n this.router.map(function () {\n this.route('hasNoTemplate', { path: '/' });\n });\n\n this.add('route:application', _routing.Route.extend({\n renderTemplate() {\n this.render();\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A--B-Hello world-C', 'initial render');\n });\n }\n\n ['@test Can render into a named outlet at the top level, later'](assert) {\n this.addTemplate('application', 'A-{{outlet}}-B-{{outlet \"other\"}}-C');\n this.addTemplate('modal', 'Hello world');\n this.addTemplate('index', 'The index');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n launch() {\n this.render('modal', {\n into: 'application',\n outlet: 'other'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B--C', 'initial render');\n (0, _runloop.run)(this.applicationInstance.lookup('router:main'), 'send', 'launch');\n assert.equal(rootElement.textContent.trim(), 'A-The index-B-Hello world-C', 'second render');\n });\n }\n\n [\"@test Can render routes with no 'main' outlet and their children\"](assert) {\n this.addTemplate('application', '
    {{outlet \"app\"}}
    ');\n this.addTemplate('app', '
    {{outlet \"common\"}}
    {{outlet \"sub\"}}
    ');\n this.addTemplate('common', '
    ');\n this.addTemplate('sub', '
    ');\n\n this.router.map(function () {\n this.route('app', { path: '/app' }, function () {\n this.route('sub', { path: '/sub', resetNamespace: true });\n });\n });\n\n this.add('route:app', _routing.Route.extend({\n renderTemplate() {\n this.render('app', {\n outlet: 'app',\n into: 'application'\n });\n this.render('common', {\n outlet: 'common',\n into: 'app'\n });\n }\n }));\n\n this.add('route:sub', _routing.Route.extend({\n renderTemplate() {\n this.render('sub', {\n outlet: 'sub',\n into: 'app'\n });\n }\n }));\n\n let rootElement;\n return this.visit('/app').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('#app-common #common').length, 1, 'Finds common while viewing /app');\n return this.visit('/app/sub');\n }).then(() => {\n assert.equal(rootElement.querySelectorAll('#app-common #common').length, 1, 'Finds common while viewing /app/sub');\n assert.equal(rootElement.querySelectorAll('#app-sub #sub').length, 1, 'Finds sub while viewing /app/sub');\n });\n }\n\n ['@test Tolerates stacked renders'](assert) {\n this.addTemplate('application', '{{outlet}}{{outlet \"modal\"}}');\n this.addTemplate('index', 'hi');\n this.addTemplate('layer', 'layer');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n openLayer() {\n this.render('layer', {\n into: 'application',\n outlet: 'modal'\n });\n },\n close() {\n this.disconnectOutlet({\n outlet: 'modal',\n parentView: 'application'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(rootElement.textContent.trim(), 'hi');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'close');\n assert.equal(rootElement.textContent.trim(), 'hi');\n });\n }\n\n ['@test Renders child into parent with non-default template name'](assert) {\n this.addTemplate('application', '
    {{outlet}}
    ');\n this.addTemplate('exports.root', '
    {{outlet}}
    ');\n this.addTemplate('exports.index', '
    ');\n\n this.router.map(function () {\n this.route('root', function () {});\n });\n\n this.add('route:root', _routing.Route.extend({\n renderTemplate() {\n this.render('exports/root');\n }\n }));\n\n this.add('route:root.index', _routing.Route.extend({\n renderTemplate() {\n this.render('exports/index');\n }\n }));\n\n return this.visit('/root').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.querySelectorAll('.a .b .c').length, 1);\n });\n }\n\n [\"@test Allows any route to disconnectOutlet another route's templates\"](assert) {\n this.addTemplate('application', '{{outlet}}{{outlet \"modal\"}}');\n this.addTemplate('index', 'hi');\n this.addTemplate('layer', 'layer');\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n openLayer() {\n this.render('layer', {\n into: 'application',\n outlet: 'modal'\n });\n }\n }\n }));\n this.add('route:index', _routing.Route.extend({\n actions: {\n close() {\n this.disconnectOutlet({\n parentView: 'application',\n outlet: 'modal'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let rootElement = document.getElementById('qunit-fixture');\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(rootElement.textContent.trim(), 'hi');\n (0, _runloop.run)(router, 'send', 'openLayer');\n assert.equal(rootElement.textContent.trim(), 'hilayer');\n (0, _runloop.run)(router, 'send', 'close');\n assert.equal(rootElement.textContent.trim(), 'hi');\n });\n }\n\n ['@test Components inside an outlet have their didInsertElement hook invoked when the route is displayed'](assert) {\n this.addTemplate('index', '{{#if showFirst}}{{my-component}}{{else}}{{other-component}}{{/if}}');\n\n let myComponentCounter = 0;\n let otherComponentCounter = 0;\n let indexController;\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n });\n\n this.add('controller:index', _controller.default.extend({\n showFirst: true\n }));\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n indexController = controller;\n }\n }));\n\n this.add('component:my-component', _glimmer.Component.extend({\n didInsertElement() {\n myComponentCounter++;\n }\n }));\n\n this.add('component:other-component', _glimmer.Component.extend({\n didInsertElement() {\n otherComponentCounter++;\n }\n }));\n\n return this.visit('/').then(() => {\n assert.strictEqual(myComponentCounter, 1, 'didInsertElement invoked on displayed component');\n assert.strictEqual(otherComponentCounter, 0, 'didInsertElement not invoked on displayed component');\n\n (0, _runloop.run)(() => indexController.set('showFirst', false));\n\n assert.strictEqual(myComponentCounter, 1, 'didInsertElement not invoked on displayed component');\n assert.strictEqual(otherComponentCounter, 1, 'didInsertElement invoked on displayed component');\n });\n }\n\n ['@test Doesnt swallow exception thrown from willTransition'](assert) {\n assert.expect(1);\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', 'index');\n this.addTemplate('other', 'other');\n\n this.router.map(function () {\n this.route('index', { path: '/' });\n this.route('other', function () {});\n });\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition() {\n throw new Error('boom');\n }\n }\n }));\n\n return this.visit('/').then(() => {\n return assert.throws(() => {\n return this.visit('/other');\n }, /boom/, 'expected an exception but none was thrown');\n });\n }\n\n ['@test Exception if outlet name is undefined in render and disconnectOutlet']() {\n this.add('route:application', _routing.Route.extend({\n actions: {\n showModal() {\n this.render({\n outlet: undefined,\n parentView: 'application'\n });\n },\n hideModal() {\n this.disconnectOutlet({\n outlet: undefined,\n parentView: 'application'\n });\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n expectAssertion(() => {\n (0, _runloop.run)(() => router.send('showModal'));\n }, /You passed undefined as the outlet name/);\n\n expectAssertion(() => {\n (0, _runloop.run)(() => router.send('hideModal'));\n }, /You passed undefined as the outlet name/);\n });\n }\n\n ['@test Route serializers work for Engines'](assert) {\n assert.expect(2);\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let postSerialize = function (params) {\n assert.ok(true, 'serialize hook runs');\n return {\n post_id: params.id\n };\n };\n let BlogMap = function () {\n this.route('post', {\n path: '/post/:post_id',\n serialize: postSerialize\n });\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n assert.equal(router._routerMicrolib.generate('blog.post', { id: '13' }), '/blog/post/13', 'url is generated properly');\n });\n }\n\n ['@test Defining a Route#serialize method in an Engine throws an error'](assert) {\n assert.expect(1);\n\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n\n // Register engine route map\n let BlogMap = function () {\n this.route('post');\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let router = this.applicationInstance.lookup('router:main');\n let PostRoute = _routing.Route.extend({ serialize() {} });\n this.applicationInstance.lookup('engine:blog').register('route:post', PostRoute);\n\n assert.throws(() => router.transitionTo('blog.post'), /Defining a custom serialize method on an Engine route is not supported/);\n });\n }\n\n ['@test App.destroy does not leave undestroyed views after clearing engines'](assert) {\n assert.expect(4);\n\n let engineInstance;\n // Register engine\n let BlogEngine = _engine.default.extend();\n this.add('engine:blog', BlogEngine);\n let EngineIndexRoute = _routing.Route.extend({\n init() {\n this._super(...arguments);\n engineInstance = (0, _owner.getOwner)(this);\n }\n });\n\n // Register engine route map\n let BlogMap = function () {\n this.route('post');\n };\n this.add('route-map:blog', BlogMap);\n\n this.router.map(function () {\n this.mount('blog');\n });\n\n return this.visit('/').then(() => {\n let engine = this.applicationInstance.lookup('engine:blog');\n engine.register('route:index', EngineIndexRoute);\n engine.register('template:index', (0, _emberTemplateCompiler.compile)('Engine Post!'));\n return this.visit('/blog');\n }).then(() => {\n assert.ok(true, '/blog has been handled');\n let route = engineInstance.lookup('route:index');\n let router = this.applicationInstance.lookup('router:main');\n\n (0, _runloop.run)(router, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was cleared');\n\n (0, _runloop.run)(route, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n\n (0, _runloop.run)(this.applicationInstance, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n });\n }\n\n [\"@test Generated route should be an instance of App's default route if provided\"](assert) {\n let generatedRoute;\n\n this.router.map(function () {\n this.route('posts');\n });\n\n let AppRoute = _routing.Route.extend();\n this.add('route:basic', AppRoute);\n\n return this.visit('/posts').then(() => {\n generatedRoute = this.applicationInstance.lookup('route:posts');\n\n assert.ok(generatedRoute instanceof AppRoute, 'should extend the correct route');\n });\n }\n });\n});","enifed('ember/tests/routing/deprecated_handler_infos_test', ['internal-test-helpers'], function (_internalTestHelpers) {\n 'use strict';\n\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n (0, _internalTestHelpers.moduleFor)('Deprecated HandlerInfos', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n }\n\n get routerOptions() {\n return {\n willTransition(oldHandlers, newHandlers, transition) {\n expectDeprecation(() => {\n this._routerMicrolib.currentHandlerInfos;\n }, 'You attempted to use \"_routerMicrolib.currentHandlerInfos\" which is a private API that will be removed.');\n\n expectDeprecation(() => {\n this._routerMicrolib.getHandler('parent');\n }, 'You attempted to use \"_routerMicrolib.getHandler\" which is a private API that will be removed.');\n\n oldHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n newHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n\n expectDeprecation(() => {\n transition.handlerInfos;\n }, 'You attempted to use \"transition.handlerInfos\" which is a private API that will be removed.');\n\n expectDeprecation(() => {\n transition.state.handlerInfos;\n }, 'You attempted to use \"transition.state.handlerInfos\" which is a private API that will be removed.');\n QUnit.assert.ok(true, 'willTransition');\n },\n\n didTransition(newHandlers) {\n newHandlers.forEach(handler => {\n expectDeprecation(() => {\n handler.handler;\n }, 'You attempted to read \"handlerInfo.handler\" which is a private API that will be removed.');\n });\n QUnit.assert.ok(true, 'didTransition');\n }\n };\n }\n\n '@test handlerInfos are deprecated and associated private apis'(assert) {\n let done = assert.async();\n expectDeprecation(() => {\n return this.visit('/parent').then(() => {\n done();\n });\n }, /You attempted to override the \\\"(willTransition|didTransition)\\\" method which is deprecated. Please inject the router service and listen to the \\\"(routeWillChange|routeDidChange)\\\" event\\./);\n }\n });\n }\n});","enifed('ember/tests/routing/deprecated_transition_state_test', ['internal-test-helpers'], function (_internalTestHelpers) {\n 'use strict';\n\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n (0, _internalTestHelpers.moduleFor)('Deprecated Transition State', class extends _internalTestHelpers.RouterTestCase {\n '@test touching transition.state is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.state;\n }, 'You attempted to read \"transition.state\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the public state on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n\n '@test touching transition.queryParams is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.queryParams;\n }, 'You attempted to read \"transition.queryParams\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the queryParams on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n\n '@test touching transition.params is deprecated'(assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', transition => {\n expectDeprecation(() => {\n transition.params;\n }, 'You attempted to read \"transition.params\" which is a private API. You should read the `RouteInfo` object on \"transition.to\" or \"transition.from\" which has the params on it.');\n });\n return this.routerService.transitionTo('/child');\n });\n }\n });\n }\n});","enifed('ember/tests/routing/query_params_test', ['@ember/controller', '@ember/string', '@ember/-internals/runtime', '@ember/runloop', '@ember/-internals/meta', '@ember/-internals/metal', '@ember/-internals/routing', 'router_js', 'internal-test-helpers'], function (_controller, _string, _runtime, _runloop, _meta, _metal, _routing, _router_js, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Query Params - main', class extends _internalTestHelpers.QueryParamTestCase {\n refreshModelWhileLoadingTest(loadingReturn) {\n let assert = this.assert;\n\n assert.expect(9);\n\n let appModelCount = 0;\n let promiseResolve;\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n appomg: {\n defaultValue: 'applol'\n }\n },\n model() /* params */{\n appModelCount++;\n }\n }));\n\n this.setSingleQPController('index', 'omg', undefined, {\n omg: undefined\n });\n\n let actionName = typeof loadingReturn !== 'undefined' ? 'loading' : 'ignore';\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n actions: {\n [actionName]: function () {\n return loadingReturn;\n }\n },\n model(params) {\n indexModelCount++;\n if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' });\n return new _runtime.RSVP.Promise(function (resolve) {\n promiseResolve = resolve;\n return;\n });\n } else if (indexModelCount === 3) {\n assert.deepEqual(params, { omg: 'hello' }, \"Model hook reruns even if the previous one didn't finish\");\n }\n }\n }));\n\n return this.visit('/').then(() => {\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 1);\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 2);\n\n this.setAndFlush(indexController, 'omg', 'hello');\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 3);\n\n (0, _runloop.run)(function () {\n promiseResolve();\n });\n\n assert.equal((0, _metal.get)(indexController, 'omg'), 'hello', 'At the end last value prevails');\n });\n }\n\n [\"@test No replaceURL occurs on startup because default values don't show up in URL\"](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index');\n\n return this.visitAndAssert('/');\n }\n\n ['@test Calling transitionTo does not lose query params already on the activeTransition'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n\n this.add('route:parent.child', _routing.Route.extend({\n afterModel() {\n this.transitionTo('parent.sibling');\n }\n }));\n\n this.setSingleQPController('parent');\n\n return this.visit('/parent/child?foo=lol').then(() => {\n this.assertCurrentPath('/parent/sibling?foo=lol', 'redirected to the sibling route, instead of child route');\n assert.equal(this.getController('parent').get('foo'), 'lol', 'controller has value from the active transition');\n });\n }\n\n ['@test Single query params can be set on the controller and reflected in the url'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home');\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('home');\n\n this.setAndFlush(controller, 'foo', '456');\n this.assertCurrentPath('/?foo=456');\n\n this.setAndFlush(controller, 'foo', '987');\n this.assertCurrentPath('/?foo=987');\n });\n }\n\n ['@test Query params can map to different url keys configured on the controller'](assert) {\n assert.expect(6);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: [{ foo: 'other_foo', bar: { as: 'other_bar' } }],\n foo: 'FOO',\n bar: 'BAR'\n }));\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('index');\n\n this.setAndFlush(controller, 'foo', 'LEX');\n this.assertCurrentPath('/?other_foo=LEX', \"QP mapped correctly without 'as'\");\n\n this.setAndFlush(controller, 'foo', 'WOO');\n this.assertCurrentPath('/?other_foo=WOO', \"QP updated correctly without 'as'\");\n\n this.transitionTo('/?other_foo=NAW');\n assert.equal(controller.get('foo'), 'NAW', 'QP managed correctly on URL transition');\n\n this.setAndFlush(controller, 'bar', 'NERK');\n this.assertCurrentPath('/?other_bar=NERK&other_foo=NAW', \"QP mapped correctly with 'as'\");\n\n this.setAndFlush(controller, 'bar', 'NUKE');\n this.assertCurrentPath('/?other_bar=NUKE&other_foo=NAW', \"QP updated correctly with 'as'\");\n });\n }\n\n ['@test Routes have a private overridable serializeQueryParamKey hook'](assert) {\n assert.expect(2);\n\n this.add('route:index', _routing.Route.extend({\n serializeQueryParamKey: _string.dasherize\n }));\n\n this.setSingleQPController('index', 'funTimes', '');\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('index');\n\n this.setAndFlush(controller, 'funTimes', 'woot');\n this.assertCurrentPath('/?fun-times=woot');\n });\n }\n\n ['@test Can override inherited QP behavior by specifying queryParams as a computed property'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'a', 0, {\n queryParams: (0, _metal.computed)(function () {\n return ['c'];\n }),\n c: true\n });\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n\n this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/', 'QP did not update due to being overriden');\n\n this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?c=false', 'QP updated with overridden param');\n });\n }\n\n ['@test Can concatenate inherited QP behavior by specifying queryParams as an array'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'a', 0, {\n queryParams: ['c'],\n c: true\n });\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n\n this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/?a=1', 'Inherited QP did update');\n\n this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?a=1&c=false', 'New QP did update');\n });\n }\n\n ['@test model hooks receives query params'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'bar' });\n }\n }));\n\n return this.visitAndAssert('/');\n }\n\n ['@test model hooks receives query params with dynamic segment params'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:id' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'bar', id: 'baz' });\n }\n }));\n\n return this.visitAndAssert('/baz');\n }\n\n ['@test model hooks receives query params (overridden by incoming url value)'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:id' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: 'baz', id: 'boo' });\n }\n }));\n\n return this.visitAndAssert('/boo?foo=baz');\n }\n\n ['@test error is thrown if dynamic segment and query param have same name'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('index', { path: '/:foo' });\n });\n\n this.setSingleQPController('index');\n\n expectAssertion(() => {\n this.visitAndAssert('/boo?foo=baz');\n }, `The route 'index' has both a dynamic segment and query param with name 'foo'. Please rename one to avoid collisions.`);\n }\n\n ['@test query params have been set by the time setupController is called'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application');\n\n this.add('route:application', _routing.Route.extend({\n setupController(controller) {\n assert.equal(controller.get('foo'), 'YEAH', \"controller's foo QP property set before setupController called\");\n }\n }));\n\n return this.visitAndAssert('/?foo=YEAH');\n }\n\n ['@test mapped query params have been set by the time setupController is called'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application', { faz: 'foo' });\n\n this.add('route:application', _routing.Route.extend({\n setupController(controller) {\n assert.equal(controller.get('faz'), 'YEAH', \"controller's foo QP property set before setupController called\");\n }\n }));\n\n return this.visitAndAssert('/?foo=YEAH');\n }\n\n ['@test Route#paramsFor fetches query params with default value'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: 'bar' }, 'could retrieve params for index');\n }\n }));\n\n return this.visitAndAssert('/baz');\n }\n\n ['@test Route#paramsFor fetches query params with non-default value'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index');\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: 'boo' }, 'could retrieve params for index');\n }\n }));\n\n return this.visitAndAssert('/baz?foo=boo');\n }\n\n ['@test Route#paramsFor fetches default falsy query params'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index', 'foo', false);\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: false }, 'could retrieve params for index');\n }\n }));\n\n return this.visitAndAssert('/baz');\n }\n\n ['@test Route#paramsFor fetches non-default falsy query params'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('index', { path: '/:something' });\n });\n\n this.setSingleQPController('index', 'foo', true);\n\n this.add('route:index', _routing.Route.extend({\n model() /* params, transition */{\n assert.deepEqual(this.paramsFor('index'), { something: 'baz', foo: false }, 'could retrieve params for index');\n }\n }));\n\n return this.visitAndAssert('/baz?foo=false');\n }\n\n ['@test model hook can query prefix-less application params'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { appomg: 'applol' });\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { omg: 'lol' });\n assert.deepEqual(this.paramsFor('application'), {\n appomg: 'applol'\n });\n }\n }));\n\n return this.visitAndAssert('/');\n }\n\n ['@test model hook can query prefix-less application params (overridden by incoming url value)'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { appomg: 'appyes' });\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { omg: 'yes' });\n assert.deepEqual(this.paramsFor('application'), {\n appomg: 'appyes'\n });\n }\n }));\n\n return this.visitAndAssert('/?appomg=appyes&omg=yes');\n }\n\n ['@test can opt into full transition by setting refreshModel in route queryParams'](assert) {\n assert.expect(7);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params, transition */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' }, 'params are correct on second pass');\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1, 'app model hook did not run again');\n assert.equal(indexModelCount, 2, 'index model hook ran again due to refreshModel');\n });\n }\n\n ['@test refreshModel and replace work together'](assert) {\n assert.expect(8);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true,\n replace: true\n }\n },\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' }, 'params are correct on second pass');\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n\n let indexController = this.getController('index');\n this.expectedReplaceURL = '/?omg=lex';\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1, 'app model hook did not run again');\n assert.equal(indexModelCount, 2, 'index model hook ran again due to refreshModel');\n });\n }\n\n ['@test multiple QP value changes only cause a single model refresh'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index', 'alex', 'lol');\n this.setSingleQPController('index', 'steely', 'lel');\n\n let refreshCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n alex: {\n refreshModel: true\n },\n steely: {\n refreshModel: true\n }\n },\n refresh() {\n refreshCount++;\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let indexController = this.getController('index');\n (0, _runloop.run)(indexController, 'setProperties', {\n alex: 'fran',\n steely: 'david'\n });\n assert.equal(refreshCount, 1, 'index refresh hook only run once');\n });\n }\n\n ['@test refreshModel does not cause a second transition during app boot '](assert) {\n assert.expect(1);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n refresh() {\n assert.ok(false);\n }\n }));\n\n return this.visitAndAssert('/?appomg=hello&omg=world');\n }\n\n ['@test queryParams are updated when a controller property is set and the route is refreshed. Issue #13263 '](assert) {\n this.addTemplate('application', '{{foo}}{{outlet}}');\n\n this.setSingleQPController('application', 'foo', 1, {\n actions: {\n increment() {\n this.incrementProperty('foo');\n this.send('refreshRoute');\n }\n }\n });\n\n this.add('route:application', _routing.Route.extend({\n actions: {\n refreshRoute() {\n this.refresh();\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '1');\n\n (0, _runloop.run)(document.getElementById('test-button'), 'click');\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '2');\n this.assertCurrentPath('/?foo=2');\n\n (0, _runloop.run)(document.getElementById('test-button'), 'click');\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '3');\n this.assertCurrentPath('/?foo=3');\n });\n }\n\n [\"@test Use Ember.get to retrieve query params 'refreshModel' configuration\"](assert) {\n assert.expect(7);\n\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n\n let appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model() /* params */{\n appModelCount++;\n }\n }));\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty() {\n return { refreshModel: true };\n }\n }),\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, { omg: 'lol' });\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, { omg: 'lex' });\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 1);\n\n let indexController = this.getController('index');\n this.setAndFlush(indexController, 'omg', 'lex');\n\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 2);\n });\n }\n\n ['@test can use refreshModel even with URL changes that remove QPs from address bar'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n let indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n model(params) {\n indexModelCount++;\n\n let data;\n if (indexModelCount === 1) {\n data = 'foo';\n } else if (indexModelCount === 2) {\n data = 'lol';\n }\n\n assert.deepEqual(params, { omg: data }, 'index#model receives right data');\n }\n }));\n\n return this.visitAndAssert('/?omg=foo').then(() => {\n this.transitionTo('/');\n\n let indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'lol');\n });\n }\n\n ['@test can opt into a replace query by specifying replace:true in the Route config hash'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application', 'alex', 'matchneer');\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n alex: {\n replace: true\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n this.setAndFlush(appController, 'alex', 'wallace');\n });\n }\n\n ['@test Route query params config can be configured using property name instead of URL key'](assert) {\n assert.expect(2);\n\n this.add('controller:application', _controller.default.extend({\n queryParams: [{ commitBy: 'commit_by' }]\n }));\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n commitBy: {\n replace: true\n }\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?commit_by=igor_seb';\n this.setAndFlush(appController, 'commitBy', 'igor_seb');\n });\n }\n\n ['@test An explicit replace:false on a changed QP always wins and causes a pushState'](assert) {\n assert.expect(3);\n\n this.add('controller:application', _controller.default.extend({\n queryParams: ['alex', 'steely'],\n alex: 'matchneer',\n steely: 'dan'\n }));\n\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n alex: {\n replace: true\n },\n steely: {\n replace: false\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let appController = this.getController('application');\n this.expectedPushURL = '/?alex=wallace&steely=jan';\n (0, _runloop.run)(appController, 'setProperties', { alex: 'wallace', steely: 'jan' });\n\n this.expectedPushURL = '/?alex=wallace&steely=fran';\n (0, _runloop.run)(appController, 'setProperties', { steely: 'fran' });\n\n this.expectedReplaceURL = '/?alex=sriracha&steely=fran';\n (0, _runloop.run)(appController, 'setProperties', { alex: 'sriracha' });\n });\n }\n\n ['@test can opt into full transition by setting refreshModel in route queryParams when transitioning from child to parent'](assert) {\n this.addTemplate('parent', '{{outlet}}');\n this.addTemplate('parent.child', \"{{link-to 'Parent' 'parent' (query-params foo='change') id='parent-link'}}\");\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n\n let parentModelCount = 0;\n this.add('route:parent', _routing.Route.extend({\n model() {\n parentModelCount++;\n },\n queryParams: {\n foo: {\n refreshModel: true\n }\n }\n }));\n\n this.setSingleQPController('parent', 'foo', 'abc');\n\n return this.visit('/parent/child?foo=lol').then(() => {\n assert.equal(parentModelCount, 1);\n\n (0, _runloop.run)(document.getElementById('parent-link'), 'click');\n assert.equal(parentModelCount, 2);\n });\n }\n\n [\"@test Use Ember.get to retrieve query params 'replace' configuration\"](assert) {\n assert.expect(2);\n\n this.setSingleQPController('application', 'alex', 'matchneer');\n\n this.add('route:application', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty() /* keyName */{\n // We are simulating all qps requiring refresh\n return { replace: true };\n }\n })\n }));\n\n return this.visitAndAssert('/').then(() => {\n let appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n this.setAndFlush(appController, 'alex', 'wallace');\n });\n }\n\n ['@test can override incoming QP values in setupController'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', 'OVERRIDE');\n },\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n }\n }));\n\n return this.visitAndAssert('/about').then(() => {\n this.transitionTo('index');\n this.assertCurrentPath('/?omg=OVERRIDE');\n });\n }\n\n ['@test can override incoming QP array values in setupController'](assert) {\n assert.expect(3);\n\n this.router.map(function () {\n this.route('about');\n });\n\n this.setSingleQPController('index', 'omg', ['lol']);\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', ['OVERRIDE']);\n },\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n }\n }));\n\n return this.visitAndAssert('/about').then(() => {\n this.transitionTo('index');\n this.assertCurrentPath('/?omg=' + encodeURIComponent(JSON.stringify(['OVERRIDE'])));\n });\n }\n\n ['@test URL transitions that remove QPs still register as QP changes'](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index', 'omg', 'lol');\n\n return this.visit('/?omg=borf').then(() => {\n let indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'borf');\n\n this.transitionTo('/');\n assert.equal(indexController.get('omg'), 'lol');\n });\n }\n\n ['@test Subresource naming style is supported'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('abc.def', { path: '/abcdef' }, function () {\n this.route('zoo');\n });\n });\n\n this.addTemplate('application', \"{{link-to 'A' 'abc.def' (query-params foo='123') id='one'}}{{link-to 'B' 'abc.def.zoo' (query-params foo='123' bar='456') id='two'}}{{outlet}}\");\n\n this.setSingleQPController('abc.def', 'foo', 'lol');\n this.setSingleQPController('abc.def.zoo', 'bar', 'haha');\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#one').attr('href'), '/abcdef?foo=123');\n assert.equal(this.$('#two').attr('href'), '/abcdef/zoo?bar=456&foo=123');\n\n (0, _runloop.run)(this.$('#one'), 'click');\n this.assertCurrentPath('/abcdef?foo=123');\n\n (0, _runloop.run)(this.$('#two'), 'click');\n this.assertCurrentPath('/abcdef/zoo?bar=456&foo=123');\n });\n }\n\n ['@test transitionTo supports query params']() {\n this.setSingleQPController('index', 'foo', 'lol');\n\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: 'borf' } });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n\n this.transitionTo({ queryParams: { 'index:foo': 'blaf' } });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n\n this.transitionTo({ queryParams: { 'index:foo': false } });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n\n this.transitionTo({ queryParams: { foo: false } });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n });\n }\n\n ['@test transitionTo supports query params (multiple)']() {\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo', 'bar'],\n foo: 'lol',\n bar: 'wat'\n }));\n\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: 'borf' } });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n\n this.transitionTo({ queryParams: { 'index:foo': 'blaf' } });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n\n this.transitionTo({ queryParams: { 'index:foo': false } });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n\n this.transitionTo({ queryParams: { foo: false } });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n });\n }\n\n [\"@test setting controller QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index', 'foo', '123');\n\n return this.visit('/').then(() => {\n let controller = this.getController('index');\n\n this.expectedPushURL = '/?foo=';\n this.setAndFlush(controller, 'foo', '');\n });\n }\n\n [\"@test setting QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let controller = this.getController('index');\n\n this.expectedPushURL = '/?foo=';\n this.setAndFlush(controller, 'foo', '');\n });\n }\n\n ['@test A default boolean value deserializes QPs as booleans rather than strings'](assert) {\n assert.expect(3);\n\n this.setSingleQPController('index', 'foo', false);\n\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.equal(params.foo, true, 'model hook received foo as boolean true');\n }\n }));\n\n return this.visit('/?foo=true').then(() => {\n let controller = this.getController('index');\n assert.equal(controller.get('foo'), true);\n\n this.transitionTo('/?foo=false');\n assert.equal(controller.get('foo'), false);\n });\n }\n\n ['@test Query param without value are empty string'](assert) {\n assert.expect(1);\n\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: ''\n }));\n\n return this.visit('/?foo=').then(() => {\n let controller = this.getController('index');\n assert.equal(controller.get('foo'), '');\n });\n }\n\n ['@test Array query params can be set'](assert) {\n assert.expect(2);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home', 'foo', []);\n\n return this.visit('/').then(() => {\n let controller = this.getController('home');\n\n this.setAndFlush(controller, 'foo', [1, 2]);\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n\n this.setAndFlush(controller, 'foo', [3, 4]);\n this.assertCurrentPath('/?foo=%5B3%2C4%5D');\n });\n }\n\n ['@test (de)serialization: arrays'](assert) {\n assert.expect(4);\n\n this.setSingleQPController('index', 'foo', [1]);\n\n return this.visitAndAssert('/').then(() => {\n this.transitionTo({ queryParams: { foo: [2, 3] } });\n this.assertCurrentPath('/?foo=%5B2%2C3%5D', 'shorthand supported');\n this.transitionTo({ queryParams: { 'index:foo': [4, 5] } });\n this.assertCurrentPath('/?foo=%5B4%2C5%5D', 'longform supported');\n this.transitionTo({ queryParams: { foo: [] } });\n this.assertCurrentPath('/?foo=%5B%5D', 'longform supported');\n });\n }\n\n ['@test Url with array query param sets controller property to array'](assert) {\n assert.expect(1);\n\n this.setSingleQPController('index', 'foo', '');\n\n return this.visit('/?foo[]=1&foo[]=2&foo[]=3').then(() => {\n let controller = this.getController('index');\n assert.deepEqual(controller.get('foo'), ['1', '2', '3']);\n });\n }\n\n ['@test Array query params can be pushed/popped'](assert) {\n assert.expect(17);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n this.setSingleQPController('home', 'foo', (0, _runtime.A)());\n\n return this.visitAndAssert('/').then(() => {\n let controller = this.getController('home');\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 1);\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'pushObject', 2);\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n assert.deepEqual(controller.foo, [1, 2]);\n\n (0, _runloop.run)(controller.foo, 'popObject');\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n\n (0, _runloop.run)(controller.foo, 'unshiftObject', 'lol');\n this.assertCurrentPath('/?foo=%5B%22lol%22%2C1%5D');\n assert.deepEqual(controller.foo, ['lol', 1]);\n });\n }\n\n [\"@test Overwriting with array with same content shouldn't refire update\"](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('home', { path: '/' });\n });\n\n let modelCount = 0;\n this.add('route:home', _routing.Route.extend({\n model() {\n modelCount++;\n }\n }));\n\n this.setSingleQPController('home', 'foo', (0, _runtime.A)([1]));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(modelCount, 1);\n\n let controller = this.getController('home');\n this.setAndFlush(controller, 'model', (0, _runtime.A)([1]));\n\n assert.equal(modelCount, 1);\n this.assertCurrentPath('/');\n });\n }\n\n ['@test Defaulting to params hash as the model should not result in that params object being watched'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('other');\n });\n\n // This causes the params hash, which is returned as a route's\n // model if no other model could be resolved given the provided\n // params (and no custom model hook was defined), to be watched,\n // unless we return a copy of the params hash.\n this.setSingleQPController('application', 'woot', 'wat');\n\n this.add('route:other', _routing.Route.extend({\n model(p, trans) {\n let m = (0, _meta.peekMeta)(trans[_router_js.PARAMS_SYMBOL].application);\n assert.ok(m === undefined, \"A meta object isn't constructed for this params POJO\");\n }\n }));\n\n return this.visit('/').then(() => {\n this.transitionTo('other');\n });\n }\n\n ['@test Setting bound query param property to null or undefined does not serialize to url'](assert) {\n assert.expect(9);\n\n this.router.map(function () {\n this.route('home');\n });\n\n this.setSingleQPController('home', 'foo', [1, 2]);\n\n return this.visitAndAssert('/home').then(() => {\n var controller = this.getController('home');\n\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n\n this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n\n return this.transitionTo('/home').then(() => {\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n\n this.setAndFlush(controller, 'foo', null);\n this.assertCurrentPath('/home', 'Setting property to null');\n\n this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n\n this.setAndFlush(controller, 'foo', undefined);\n this.assertCurrentPath('/home', 'Setting property to undefined');\n });\n });\n }\n\n ['@test {{link-to}} with null or undefined QPs does not get serialized into url'](assert) {\n assert.expect(3);\n\n this.addTemplate('home', \"{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}\");\n\n this.router.map(function () {\n this.route('home');\n });\n\n this.setSingleQPController('home', 'foo', [], {\n nullValue: null,\n undefinedValue: undefined\n });\n\n return this.visitAndAssert('/home').then(() => {\n assert.equal(this.$('#null-link').attr('href'), '/home');\n assert.equal(this.$('#undefined-link').attr('href'), '/home');\n });\n }\n\n [\"@test A child of a resource route still defaults to parent route's model even if the child route has a query param\"](assert) {\n assert.expect(2);\n\n this.setSingleQPController('index', 'woot', undefined, {\n woot: undefined\n });\n\n this.add('route:application', _routing.Route.extend({\n model() /* p, trans */{\n return { woot: true };\n }\n }));\n\n this.add('route:index', _routing.Route.extend({\n setupController(controller, model) {\n assert.deepEqual(model, { woot: true }, 'index route inherited model route from parent route');\n }\n }));\n\n return this.visitAndAssert('/');\n }\n\n ['@test opting into replace does not affect transitions between routes'](assert) {\n assert.expect(5);\n\n this.addTemplate('application', \"{{link-to 'Foo' 'foo' id='foo-link'}}{{link-to 'Bar' 'bar' id='bar-no-qp-link'}}{{link-to 'Bar' 'bar' (query-params raytiley='isthebest') id='bar-link'}}{{outlet}}\");\n\n this.router.map(function () {\n this.route('foo');\n this.route('bar');\n });\n\n this.setSingleQPController('bar', 'raytiley', 'israd');\n\n this.add('route:bar', _routing.Route.extend({\n queryParams: {\n raytiley: {\n replace: true\n }\n }\n }));\n\n return this.visit('/').then(() => {\n let controller = this.getController('bar');\n\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n\n this.expectedPushURL = '/bar';\n (0, _runloop.run)(document.getElementById('bar-no-qp-link'), 'click');\n\n this.expectedReplaceURL = '/bar?raytiley=woot';\n this.setAndFlush(controller, 'raytiley', 'woot');\n\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n\n this.expectedPushURL = '/bar?raytiley=isthebest';\n (0, _runloop.run)(document.getElementById('bar-link'), 'click');\n });\n }\n\n [\"@test undefined isn't serialized or deserialized into a string\"](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('example');\n });\n\n this.addTemplate('application', \"{{link-to 'Example' 'example' (query-params foo=undefined) id='the-link'}}\");\n\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n\n this.add('route:example', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: undefined });\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n\n return this.transitionTo('example', {\n queryParams: { foo: undefined }\n }).then(() => {\n this.assertCurrentPath('/example');\n });\n });\n }\n\n ['@test when refreshModel is true and loading hook is undefined, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest();\n }\n\n ['@test when refreshModel is true and loading hook returns false, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest(false);\n }\n\n ['@test when refreshModel is true and loading hook returns true, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest(true);\n }\n\n [\"@test warn user that Route's queryParams configuration must be an Object, not an Array\"](assert) {\n assert.expect(1);\n\n this.add('route:application', _routing.Route.extend({\n queryParams: [{ commitBy: { replace: true } }]\n }));\n\n expectAssertion(() => {\n this.visit('/');\n }, 'You passed in `[{\"commitBy\":{\"replace\":true}}]` as the value for `queryParams` but `queryParams` cannot be an Array');\n }\n\n ['@test handle route names that clash with Object.prototype properties'](assert) {\n assert.expect(1);\n\n this.router.map(function () {\n this.route('constructor');\n });\n\n this.add('route:constructor', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n\n return this.visit('/').then(() => {\n this.transitionTo('constructor', { queryParams: { foo: '999' } });\n let controller = this.getController('constructor');\n assert.equal((0, _metal.get)(controller, 'foo'), '999');\n });\n }\n });\n});","enifed('ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test', ['@ember/controller', '@ember/-internals/runtime', '@ember/-internals/routing', '@ember/runloop', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _runtime, _routing, _runloop, _metal, _internalTestHelpers) {\n 'use strict';\n\n class ModelDependentQPTestCase extends _internalTestHelpers.QueryParamTestCase {\n boot() {\n this.setupApplication();\n return this.visitApplication();\n }\n\n teardown() {\n super.teardown(...arguments);\n this.assert.ok(!this.expectedModelHookParams, 'there should be no pending expectation of expected model hook params');\n }\n\n reopenController(name, options) {\n this.application.resolveRegistration(`controller:${name}`).reopen(options);\n }\n\n reopenRoute(name, options) {\n this.application.resolveRegistration(`route:${name}`).reopen(options);\n }\n\n queryParamsStickyTest1(urlPrefix) {\n let assert = this.assert;\n\n assert.expect(14);\n\n return this.boot().then(() => {\n (0, _runloop.run)(this.$link1, 'click');\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n\n this.setAndFlush(this.controller, 'q', 'lol');\n\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n (0, _runloop.run)(this.$link2, 'click');\n\n assert.equal(this.controller.get('q'), 'wat');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n });\n }\n\n queryParamsStickyTest2(urlPrefix) {\n let assert = this.assert;\n\n assert.expect(24);\n\n return this.boot().then(() => {\n this.expectedModelHookParams = { id: 'a-1', q: 'lol', z: 0 };\n this.transitionTo(`${urlPrefix}/a-1?q=lol`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-1' });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 0 };\n this.transitionTo(`${urlPrefix}/a-2?q=lol`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' }, \"controller's model changed to a-2\");\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n this.expectedModelHookParams = { id: 'a-3', q: 'lol', z: 123 };\n this.transitionTo(`${urlPrefix}/a-3?q=lol&z=123`);\n\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 123);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol&z=123`);\n });\n }\n\n queryParamsStickyTest3(urlPrefix, articleLookup) {\n let assert = this.assert;\n\n assert.expect(32);\n\n this.addTemplate('application', `{{#each articles as |a|}} {{link-to 'Article' '${articleLookup}' a.id id=a.id}} {{/each}}`);\n\n return this.boot().then(() => {\n this.expectedModelHookParams = { id: 'a-1', q: 'wat', z: 0 };\n this.transitionTo(articleLookup, 'a-1');\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-1' });\n assert.equal(this.controller.get('q'), 'wat');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 0 };\n this.transitionTo(articleLookup, 'a-2', { queryParams: { q: 'lol' } });\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n\n this.expectedModelHookParams = { id: 'a-3', q: 'hay', z: 0 };\n this.transitionTo(articleLookup, 'a-3', { queryParams: { q: 'hay' } });\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-3' });\n assert.equal(this.controller.get('q'), 'hay');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=hay`);\n\n this.expectedModelHookParams = { id: 'a-2', q: 'lol', z: 1 };\n this.transitionTo(articleLookup, 'a-2', { queryParams: { z: 1 } });\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 1);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol&z=1`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=hay`);\n });\n }\n\n queryParamsStickyTest4(urlPrefix, articleLookup) {\n let assert = this.assert;\n\n assert.expect(24);\n\n this.setupApplication();\n\n this.reopenController(articleLookup, {\n queryParams: { q: { scope: 'controller' } }\n });\n\n return this.visitApplication().then(() => {\n (0, _runloop.run)(this.$link1, 'click');\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n\n this.setAndFlush(this.controller, 'q', 'lol');\n\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol`);\n\n (0, _runloop.run)(this.$link2, 'click');\n\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), { id: 'a-2' });\n\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol`);\n\n this.expectedModelHookParams = { id: 'a-3', q: 'haha', z: 123 };\n this.transitionTo(`${urlPrefix}/a-3?q=haha&z=123`);\n\n assert.deepEqual(this.controller.get('model'), { id: 'a-3' });\n assert.equal(this.controller.get('q'), 'haha');\n assert.equal(this.controller.get('z'), 123);\n\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=haha`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=haha`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=haha&z=123`);\n\n this.setAndFlush(this.controller, 'q', 'woot');\n\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=woot`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=woot`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=woot&z=123`);\n });\n }\n\n queryParamsStickyTest5(urlPrefix, commentsLookupKey) {\n let assert = this.assert;\n\n assert.expect(12);\n\n return this.boot().then(() => {\n this.transitionTo(commentsLookupKey, 'a-1');\n\n let commentsCtrl = this.getController(commentsLookupKey);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n\n this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n\n this.setAndFlush(commentsCtrl, 'page', 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n\n this.transitionTo(commentsLookupKey, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-2/comments`);\n\n this.transitionTo(commentsLookupKey, 'a-1');\n assert.equal(commentsCtrl.get('page'), 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n });\n }\n\n queryParamsStickyTest6(urlPrefix, articleLookup, commentsLookup) {\n let assert = this.assert;\n\n assert.expect(13);\n\n this.setupApplication();\n\n this.reopenRoute(articleLookup, {\n resetController(controller, isExiting) {\n this.controllerFor(commentsLookup).set('page', 1);\n if (isExiting) {\n controller.set('q', 'imdone');\n }\n }\n });\n\n this.addTemplate('about', `{{link-to 'A' '${commentsLookup}' 'a-1' id='one'}} {{link-to 'B' '${commentsLookup}' 'a-2' id='two'}}`);\n\n return this.visitApplication().then(() => {\n this.transitionTo(commentsLookup, 'a-1');\n\n let commentsCtrl = this.getController(commentsLookup);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n\n this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n\n this.transitionTo(commentsLookup, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n assert.equal(this.controller.get('q'), 'wat');\n\n this.transitionTo(commentsLookup, 'a-1');\n\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n assert.equal(commentsCtrl.get('page'), 1);\n\n this.transitionTo('about');\n assert.equal(document.getElementById('one').getAttribute('href'), `${urlPrefix}/a-1/comments?q=imdone`);\n assert.equal(document.getElementById('two').getAttribute('href'), `${urlPrefix}/a-2/comments`);\n });\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('article', { path: '/a/:id' }, function () {\n this.route('comments', { resetNamespace: true });\n });\n this.route('about');\n });\n\n let articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { id: 'a-3' }]);\n\n this.add('controller:application', _controller.default.extend({\n articles\n }));\n\n let self = this;\n let assert = this.assert;\n this.add('route:article', _routing.Route.extend({\n model(params) {\n if (self.expectedModelHookParams) {\n assert.deepEqual(params, self.expectedModelHookParams, 'the ArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedModelHookParams = null;\n }\n return articles.findBy('id', params.id);\n }\n }));\n\n this.add('controller:article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n\n this.add('controller:comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each articles as |a|}} 1{{link-to 'Article' 'article' a id=a.id}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n\n assert.equal(this.$link1.getAttribute('href'), '/a/a-1');\n assert.equal(this.$link2.getAttribute('href'), '/a/a-2');\n assert.equal(this.$link3.getAttribute('href'), '/a/a-3');\n\n this.controller = this.getController('article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"]() {\n return this.queryParamsStickyTest1('/a');\n }\n\n [\"@test query params have 'model' stickiness by default (url changes)\"]() {\n return this.queryParamsStickyTest2('/a');\n }\n\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"]() {\n return this.queryParamsStickyTest3('/a', 'article');\n }\n\n [\"@test 'controller' stickiness shares QP state between models\"]() {\n return this.queryParamsStickyTest4('/a', 'article');\n }\n\n [\"@test 'model' stickiness is scoped to current or first dynamic parent route\"]() {\n return this.queryParamsStickyTest5('/a', 'comments');\n }\n\n ['@test can reset query params using the resetController hook']() {\n return this.queryParamsStickyTest6('/a', 'article', 'comments');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state (nested)', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('site', function () {\n this.route('article', { path: '/a/:id' }, function () {\n this.route('comments');\n });\n });\n this.route('about');\n });\n\n let site_articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { id: 'a-3' }]);\n\n this.add('controller:application', _controller.default.extend({\n articles: site_articles\n }));\n\n let self = this;\n let assert = this.assert;\n this.add('route:site.article', _routing.Route.extend({\n model(params) {\n if (self.expectedModelHookParams) {\n assert.deepEqual(params, self.expectedModelHookParams, 'the ArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedModelHookParams = null;\n }\n return site_articles.findBy('id', params.id);\n }\n }));\n\n this.add('controller:site.article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each articles as |a|}} {{link-to 'Article' 'site.article' a id=a.id}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n\n assert.equal(this.$link1.getAttribute('href'), '/site/a/a-1');\n assert.equal(this.$link2.getAttribute('href'), '/site/a/a-2');\n assert.equal(this.$link3.getAttribute('href'), '/site/a/a-3');\n\n this.controller = this.getController('site.article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"]() {\n return this.queryParamsStickyTest1('/site/a');\n }\n\n [\"@test query params have 'model' stickiness by default (url changes)\"]() {\n return this.queryParamsStickyTest2('/site/a');\n }\n\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"]() {\n return this.queryParamsStickyTest3('/site/a', 'site.article');\n }\n\n [\"@test 'controller' stickiness shares QP state between models\"]() {\n return this.queryParamsStickyTest4('/site/a', 'site.article');\n }\n\n [\"@test 'model' stickiness is scoped to current or first dynamic parent route\"]() {\n return this.queryParamsStickyTest5('/site/a', 'site.article.comments');\n }\n\n ['@test can reset query params using the resetController hook']() {\n return this.queryParamsStickyTest6('/site/a', 'site.article', 'site.article.comments');\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state (nested & more than 1 dynamic segment)', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('site', { path: '/site/:site_id' }, function () {\n this.route('article', { path: '/a/:article_id' }, function () {\n this.route('comments');\n });\n });\n });\n\n let sites = (0, _runtime.A)([{ id: 's-1' }, { id: 's-2' }, { id: 's-3' }]);\n let site_articles = (0, _runtime.A)([{ id: 'a-1' }, { id: 'a-2' }, { id: 'a-3' }]);\n\n this.add('controller:application', _controller.default.extend({\n siteArticles: site_articles,\n sites,\n allSitesAllArticles: (0, _metal.computed)({\n get() {\n let ret = [];\n let siteArticles = this.siteArticles;\n let sites = this.sites;\n sites.forEach(site => {\n ret = ret.concat(siteArticles.map(article => {\n return {\n id: `${site.id}-${article.id}`,\n site_id: site.id,\n article_id: article.id\n };\n }));\n });\n return ret;\n }\n })\n }));\n\n let self = this;\n let assert = this.assert;\n this.add('route:site', _routing.Route.extend({\n model(params) {\n if (self.expectedSiteModelHookParams) {\n assert.deepEqual(params, self.expectedSiteModelHookParams, 'the SiteRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedSiteModelHookParams = null;\n }\n return sites.findBy('id', params.site_id);\n }\n }));\n\n this.add('route:site.article', _routing.Route.extend({\n model(params) {\n if (self.expectedArticleModelHookParams) {\n assert.deepEqual(params, self.expectedArticleModelHookParams, 'the SiteArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedArticleModelHookParams = null;\n }\n return site_articles.findBy('id', params.article_id);\n }\n }));\n\n this.add('controller:site', _controller.default.extend({\n queryParams: ['country'],\n country: 'au'\n }));\n\n this.add('controller:site.article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: ['page'],\n page: 1\n }));\n\n this.addTemplate('application', \"{{#each allSitesAllArticles as |a|}} {{#link-to 'site.article' a.site_id a.article_id id=a.id}}Article [{{a.site_id}}] [{{a.article_id}}]{{/link-to}} {{/each}} {{outlet}}\");\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n let assert = this.assert;\n\n this.links = {};\n this.links['s-1-a-1'] = document.getElementById('s-1-a-1');\n this.links['s-1-a-2'] = document.getElementById('s-1-a-2');\n this.links['s-1-a-3'] = document.getElementById('s-1-a-3');\n this.links['s-2-a-1'] = document.getElementById('s-2-a-1');\n this.links['s-2-a-2'] = document.getElementById('s-2-a-2');\n this.links['s-2-a-3'] = document.getElementById('s-2-a-3');\n this.links['s-3-a-1'] = document.getElementById('s-3-a-1');\n this.links['s-3-a-2'] = document.getElementById('s-3-a-2');\n this.links['s-3-a-3'] = document.getElementById('s-3-a-3');\n\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.site_controller = this.getController('site');\n this.article_controller = this.getController('site.article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"](assert) {\n assert.expect(59);\n\n return this.boot().then(() => {\n (0, _runloop.run)(this.links['s-1-a-1'], 'click');\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\n this.assertCurrentPath('/site/s-1/a/a-1');\n\n this.setAndFlush(this.article_controller, 'q', 'lol');\n\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.setAndFlush(this.site_controller, 'country', 'us');\n\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n (0, _runloop.run)(this.links['s-1-a-2'], 'click');\n\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n (0, _runloop.run)(this.links['s-2-a-2'], 'click');\n\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n });\n }\n\n [\"@test query params have 'model' stickiness by default (url changes)\"](assert) {\n assert.expect(88);\n\n return this.boot().then(() => {\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-1/a/a-1?q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' }, \"site controller's model is s-1\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' }, \"article controller's model is a-1\");\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-2/a/a-1?country=us&q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' }, \"article controller's model is a-1\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n this.transitionTo('/site/s-2/a/a-2?country=us&q=lol');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' }, \"article controller's model is a-2\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n this.transitionTo('/site/s-2/a/a-3?country=us&q=lol&z=123');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' }, \"article controller's model is a-3\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 123);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=lol&z=123');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=lol&z=123');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=lol&z=123');\n\n this.expectedSiteModelHookParams = { site_id: 's-3', country: 'nz' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n this.transitionTo('/site/s-3/a/a-3?country=nz&q=lol&z=123');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-3' }, \"site controller's model is s-3\");\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' }, \"article controller's model is a-3\");\n assert.equal(this.site_controller.get('country'), 'nz');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 123);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=lol&z=123');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=lol&z=123');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?country=nz&q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?country=nz&q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?country=nz&q=lol&z=123');\n });\n }\n\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"](assert) {\n assert.expect(118);\n\n return this.boot().then(() => {\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'wat',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-1');\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: { q: 'lol' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 0\n };\n this.transitionTo('site.article', 's-1', 'a-3', {\n queryParams: { q: 'hay' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'hay');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n\n this.expectedSiteModelHookParams = { site_id: 's-1', country: 'au' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: { z: 1 }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-1' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 1);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n this.transitionTo('site.article', 's-2', 'a-2', {\n queryParams: { country: 'us' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-2' });\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 1);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n\n this.expectedSiteModelHookParams = { site_id: 's-2', country: 'us' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'yeah',\n z: 0\n };\n this.transitionTo('site.article', 's-2', 'a-1', {\n queryParams: { q: 'yeah' }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-2' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-1' });\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'yeah');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=yeah');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=yeah');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=yeah');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n\n this.expectedSiteModelHookParams = { site_id: 's-3', country: 'nz' };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 3\n };\n this.transitionTo('site.article', 's-3', 'a-3', {\n queryParams: { country: 'nz', z: 3 }\n });\n\n assert.deepEqual(this.site_controller.get('model'), { id: 's-3' });\n assert.deepEqual(this.article_controller.get('model'), { id: 'a-3' });\n assert.equal(this.site_controller.get('country'), 'nz');\n assert.equal(this.article_controller.get('q'), 'hay');\n assert.equal(this.article_controller.get('z'), 3);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=yeah');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay&z=3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=yeah');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay&z=3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?country=nz&q=yeah');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?country=nz&q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?country=nz&q=hay&z=3');\n });\n }\n });\n});","enifed('ember/tests/routing/query_params_test/overlapping_query_params_test', ['@ember/controller', '@ember/-internals/routing', '@ember/runloop', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _routing, _runloop, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Query Params - overlapping query param property names', class extends _internalTestHelpers.QueryParamTestCase {\n setupBase() {\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n\n return this.visit('/parent/child');\n }\n\n ['@test can remap same-named qp props'](assert) {\n assert.expect(7);\n\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n let parentController = this.getController('parent');\n let parentChildController = this.getController('parent.child');\n\n this.setAndFlush(parentController, 'page', 2);\n this.assertCurrentPath('/parent/child?parentPage=2');\n this.setAndFlush(parentController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n\n this.setAndFlush(parentChildController, 'page', 2);\n this.assertCurrentPath('/parent/child?childPage=2');\n this.setAndFlush(parentChildController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n\n (0, _runloop.run)(() => {\n parentController.set('page', 2);\n parentChildController.set('page', 2);\n });\n\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n\n (0, _runloop.run)(() => {\n parentController.set('page', 1);\n parentChildController.set('page', 1);\n });\n\n this.assertCurrentPath('/parent/child');\n });\n }\n\n ['@test query params can be either controller property or url key'](assert) {\n assert.expect(3);\n\n this.setMappedQPController('parent');\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n });\n }\n\n ['@test query param matching a url key and controller property'](assert) {\n assert.expect(3);\n\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'index', 'page');\n\n return this.setupBase().then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n\n this.transitionTo('parent.child', {\n queryParams: { index: 2, page: 2 }\n });\n this.assertCurrentPath('/parent/child?page=2&parentPage=2');\n });\n }\n\n ['@test query param matching same property on two controllers use the urlKey higher in the chain'](assert) {\n assert.expect(4);\n\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n\n return this.setupBase().then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?parentPage=2');\n\n this.transitionTo('parent.child', { queryParams: { parentPage: 3 } });\n this.assertCurrentPath('/parent/child?parentPage=3');\n\n this.transitionTo('parent.child', {\n queryParams: { childPage: 2, page: 2 }\n });\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n\n this.transitionTo('parent.child', {\n queryParams: { childPage: 3, parentPage: 4 }\n });\n this.assertCurrentPath('/parent/child?childPage=3&parentPage=4');\n });\n }\n\n ['@test query params does not error when a query parameter exists for route instances that share a controller'](assert) {\n assert.expect(1);\n\n let parentController = _controller.default.extend({\n queryParams: { page: 'page' }\n });\n this.add('controller:parent', parentController);\n this.add('route:parent.child', _routing.Route.extend({ controllerName: 'parent' }));\n\n return this.setupBase('/parent').then(() => {\n this.transitionTo('parent.child', { queryParams: { page: 2 } });\n this.assertCurrentPath('/parent/child?page=2');\n });\n }\n ['@test query params in the same route hierarchy with the same url key get auto-scoped'](assert) {\n assert.expect(1);\n\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child');\n\n expectAssertion(() => {\n this.setupBase();\n }, \"You're not allowed to have more than one controller property map to the same query param key, but both `parent:page` and `parent.child:page` map to `parentPage`. You can fix this by mapping one of the controller properties to a different query param key via the `as` config option, e.g. `page: { as: 'other-page' }`\");\n }\n\n ['@test Support shared but overridable mixin pattern'](assert) {\n assert.expect(7);\n\n let HasPage = _metal.Mixin.create({\n queryParams: 'page',\n page: 1\n });\n\n this.add('controller:parent', _controller.default.extend(HasPage, {\n queryParams: { page: 'yespage' }\n }));\n\n this.add('controller:parent.child', _controller.default.extend(HasPage));\n\n return this.setupBase().then(() => {\n this.assertCurrentPath('/parent/child');\n\n let parentController = this.getController('parent');\n let parentChildController = this.getController('parent.child');\n\n this.setAndFlush(parentChildController, 'page', 2);\n this.assertCurrentPath('/parent/child?page=2');\n assert.equal(parentController.get('page'), 1);\n assert.equal(parentChildController.get('page'), 2);\n\n this.setAndFlush(parentController, 'page', 2);\n this.assertCurrentPath('/parent/child?page=2&yespage=2');\n assert.equal(parentController.get('page'), 2);\n assert.equal(parentChildController.get('page'), 2);\n });\n }\n });\n});","enifed('ember/tests/routing/query_params_test/query_param_async_get_handler_test', ['@ember/-internals/metal', '@ember/-internals/runtime', '@ember/-internals/routing', 'internal-test-helpers'], function (_metal, _runtime, _routing, _internalTestHelpers) {\n 'use strict';\n\n // These tests mimic what happens with lazily loaded Engines.\n (0, _internalTestHelpers.moduleFor)('Query Params - async get handler', class extends _internalTestHelpers.QueryParamTestCase {\n get routerOptions() {\n let fetchedHandlers = this.fetchedHandlers = [];\n\n return {\n location: 'test',\n\n init() {\n this._super(...arguments);\n this._seenHandlers = Object.create(null);\n this._handlerPromises = Object.create(null);\n },\n\n setupRouter() {\n this._super(...arguments);\n let { _handlerPromises: handlerPromises, _seenHandlers: seenHandlers } = this;\n let getRoute = this._routerMicrolib.getRoute;\n\n this._routerMicrolib.getRoute = function (routeName) {\n fetchedHandlers.push(routeName);\n\n // Cache the returns so we don't have more than one Promise for a\n // given handler.\n return handlerPromises[routeName] || (handlerPromises[routeName] = new _runtime.RSVP.Promise(resolve => {\n setTimeout(() => {\n let handler = getRoute(routeName);\n\n seenHandlers[routeName] = handler;\n\n resolve(handler);\n }, 10);\n }));\n };\n },\n\n _getQPMeta(routeInfo) {\n let handler = this._seenHandlers[routeInfo.name];\n if (handler) {\n return (0, _metal.get)(handler, '_qp');\n }\n }\n };\n }\n\n ['@test can render a link to an asynchronously loaded route without fetching the route'](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n });\n\n this.setSingleQPController('post');\n\n let setupAppTemplate = () => {\n this.addTemplate('application', `\n {{link-to 'Post' 'post' 1337 (query-params foo='bar') class='post-link is-1337'}}\n {{link-to 'Post' 'post' 7331 (query-params foo='boo') class='post-link is-7331'}}\n {{outlet}}\n `);\n };\n\n setupAppTemplate();\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('.post-link.is-1337').attr('href'), '/post/1337?foo=bar', 'renders correctly with default QP value');\n assert.equal(this.$('.post-link.is-7331').attr('href'), '/post/7331?foo=boo', 'renders correctly with non-default QP value');\n assert.deepEqual(this.fetchedHandlers, ['application', 'index'], `only fetched the handlers for the route we're on`);\n });\n }\n\n ['@test can transitionTo to an asynchronously loaded route with simple query params'](assert) {\n assert.expect(6);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n this.route('posts');\n });\n\n this.setSingleQPController('post');\n\n let postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n\n return this.transitionTo('posts').then(() => {\n this.assertCurrentPath('/posts');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: { foo: 'boo' }\n }).then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly set on controller');\n this.assertCurrentPath('/post/1337?foo=boo');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: { foo: 'bar' }\n }).then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly set with default value');\n this.assertCurrentPath('/post/1337');\n });\n });\n }\n\n ['@test can transitionTo to an asynchronously loaded route with array query params'](assert) {\n assert.expect(5);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' });\n });\n\n this.setSingleQPController('post', 'comments', []);\n\n let postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n return this.transitionTo('post', 1337, {\n queryParams: { comments: [1, 2] }\n }).then(() => {\n assert.deepEqual(postController.get('comments'), [1, 2], 'array QP is correctly set with default value');\n this.assertCurrentPath('/post/1337?comments=%5B1%2C2%5D');\n });\n }).then(() => {\n return this.transitionTo('post', 1338).then(() => {\n assert.deepEqual(postController.get('comments'), [], 'array QP is correctly set on controller');\n this.assertCurrentPath('/post/1338');\n });\n });\n }\n\n ['@test can transitionTo to an asynchronously loaded route with mapped query params'](assert) {\n assert.expect(7);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n\n let postController;\n let postIndexController;\n\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n\n return this.transitionTo('post.index', 1337, {\n queryParams: { note: 6, foo: 'boo' }\n }).then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly set on controller');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP is correctly set on controller');\n this.assertCurrentPath('/post/1337?foo=boo¬e=6');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: { foo: 'bar' }\n }).then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly set with default value');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP retains value scoped to model');\n this.assertCurrentPath('/post/1337?note=6');\n });\n });\n }\n\n ['@test can transitionTo with a URL'](assert) {\n assert.expect(7);\n\n this.router.map(function () {\n this.route('post', { path: '/post/:id' }, function () {\n this.route('index', { path: '/' });\n });\n });\n\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n\n let postController;\n let postIndexController;\n\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n\n return this.transitionTo('/post/1337?foo=boo¬e=6').then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly deserialized on controller');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP is correctly deserialized on controller');\n this.assertCurrentPath('/post/1337?foo=boo¬e=6');\n });\n }).then(() => {\n return this.transitionTo('/post/1337?note=6').then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly deserialized with default value');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP retains value scoped to model');\n this.assertCurrentPath('/post/1337?note=6');\n });\n });\n }\n\n [\"@test undefined isn't serialized or deserialized into a string\"](assert) {\n assert.expect(4);\n\n this.router.map(function () {\n this.route('example');\n });\n\n this.addTemplate('application', \"{{link-to 'Example' 'example' (query-params foo=undefined) id='the-link'}}\");\n\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n\n this.add('route:example', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { foo: undefined });\n }\n }));\n\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n\n return this.transitionTo('example', {\n queryParams: { foo: undefined }\n }).then(() => {\n this.assertCurrentPath('/example');\n });\n });\n }\n });\n});","enifed('ember/tests/routing/query_params_test/query_params_paramless_link_to_test', ['@ember/controller', 'internal-test-helpers'], function (_controller, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Query Params - paramless link-to', class extends _internalTestHelpers.QueryParamTestCase {\n testParamlessLinks(assert, routeName) {\n assert.expect(1);\n\n this.addTemplate(routeName, \"{{link-to 'index' 'index' id='index-link'}}\");\n\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: ['foo'],\n foo: 'wat'\n }));\n\n return this.visit('/?foo=YEAH').then(() => {\n assert.equal(document.getElementById('index-link').getAttribute('href'), '/?foo=YEAH');\n });\n }\n\n [\"@test param-less links in an app booted with query params in the URL don't reset the query params: application\"](assert) {\n return this.testParamlessLinks(assert, 'application');\n }\n\n [\"@test param-less links in an app booted with query params in the URL don't reset the query params: index\"](assert) {\n return this.testParamlessLinks(assert, 'index');\n }\n });\n});","enifed('ember/tests/routing/query_params_test/shared_state_test', ['@ember/controller', '@ember/service', '@ember/runloop', 'internal-test-helpers'], function (_controller, _service, _runloop, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Query Params - shared service state', class extends _internalTestHelpers.QueryParamTestCase {\n boot() {\n this.setupApplication();\n return this.visitApplication();\n }\n\n setupApplication() {\n this.router.map(function () {\n this.route('home', { path: '/' });\n this.route('dashboard');\n });\n\n this.add('service:filters', _service.default.extend({\n shared: true\n }));\n\n this.add('controller:home', _controller.default.extend({\n filters: (0, _service.inject)()\n }));\n\n this.add('controller:dashboard', _controller.default.extend({\n filters: (0, _service.inject)(),\n queryParams: [{ 'filters.shared': 'shared' }]\n }));\n\n this.addTemplate('application', `{{link-to 'Home' 'home' }}
    {{outlet}}
    `);\n this.addTemplate('home', `{{link-to 'Dashboard' 'dashboard' }}{{input type=\"checkbox\" id='filters-checkbox' checked=(mut filters.shared) }}`);\n this.addTemplate('dashboard', `{{link-to 'Home' 'home' }}`);\n }\n visitApplication() {\n return this.visit('/');\n }\n\n ['@test can modify shared state before transition'](assert) {\n assert.expect(1);\n\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox');\n\n // click the checkbox once to set filters.shared to false\n (0, _runloop.run)(this.$input, 'click');\n\n return this.visit('/dashboard').then(() => {\n assert.ok(true, 'expecting navigating to dashboard to succeed');\n });\n });\n }\n\n ['@test can modify shared state back to the default value before transition'](assert) {\n assert.expect(1);\n\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox');\n\n // click the checkbox twice to set filters.shared to false and back to true\n (0, _runloop.run)(this.$input, 'click');\n (0, _runloop.run)(this.$input, 'click');\n\n return this.visit('/dashboard').then(() => {\n assert.ok(true, 'expecting navigating to dashboard to succeed');\n });\n });\n }\n });\n});","enifed('ember/tests/routing/router_map_test', ['internal-test-helpers', '@ember/runloop', '@ember/-internals/routing'], function (_internalTestHelpers, _runloop, _routing) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Router.map', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Router.map returns an Ember Router class'](assert) {\n assert.expect(1);\n\n let ret = this.router.map(function () {\n this.route('hello');\n });\n\n assert.ok(_routing.Router.detect(ret));\n }\n\n ['@test Router.map can be called multiple times'](assert) {\n assert.expect(2);\n\n this.addTemplate('hello', 'Hello!');\n this.addTemplate('goodbye', 'Goodbye!');\n\n this.router.map(function () {\n this.route('hello');\n });\n\n this.router.map(function () {\n this.route('goodbye');\n });\n\n return (0, _runloop.run)(() => {\n return this.visit('/hello').then(() => {\n this.assertText('Hello!');\n }).then(() => {\n return this.visit('/goodbye');\n }).then(() => {\n this.assertText('Goodbye!');\n });\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/basic_test', ['@ember/-internals/routing', '@ember/-internals/metal', 'internal-test-helpers'], function (_routing, _metal, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Router Service - main', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#currentRouteName is correctly set for top level route'](assert) {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.expect(6);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/').then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName, params, paramNames, queryParams } = currentRoute;\n assert.equal(name, 'parent.index');\n assert.equal(localName, 'index');\n assert.deepEqual(params, {});\n assert.deepEqual(queryParams, {});\n assert.deepEqual(paramNames, []);\n }\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.index');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set for child route'](assert) {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.expect(6);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/child').then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName, params, paramNames, queryParams } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.deepEqual(params, {});\n assert.deepEqual(queryParams, {});\n assert.deepEqual(paramNames, []);\n }\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set after transition'](assert) {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.expect(5);\n } else {\n assert.expect(1);\n }\n\n return this.visit('/child').then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n }\n\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set on each transition'](assert) {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n assert.expect(9);\n } else {\n assert.expect(3);\n }\n\n return this.visit('/child').then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n\n return this.visit('/sister');\n }).then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n\n return this.visit('/brother');\n }).then(() => {\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n let currentRoute = this.routerService.currentRoute;\n let { name, localName } = currentRoute;\n assert.equal(name, 'parent.brother');\n assert.equal(localName, 'brother');\n }\n assert.equal(this.routerService.get('currentRouteName'), 'parent.brother');\n });\n }\n\n ['@test RouterService#rootURL is correctly set to the default value'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('rootURL'), '/');\n });\n }\n\n ['@test RouterService#rootURL is correctly set to a custom value'](assert) {\n assert.expect(1);\n\n this.add('route:parent.index', _routing.Route.extend({\n init() {\n this._super();\n (0, _metal.set)(this._router, 'rootURL', '/homepage');\n }\n }));\n\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('rootURL'), '/homepage');\n });\n }\n\n ['@test RouterService#location is correctly delegated from router:main'](assert) {\n assert.expect(2);\n\n return this.visit('/').then(() => {\n let location = this.routerService.get('location');\n assert.ok(location);\n assert.ok(location instanceof _routing.NoneLocation);\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/currenturl_lifecycle_test', ['@ember/service', '@ember/object/computed', '@ember/-internals/glimmer', '@ember/-internals/routing', '@ember/-internals/metal', 'internal-test-helpers', '@ember/-internals/runtime'], function (_service, _computed, _glimmer, _routing, _metal, _internalTestHelpers, _runtime) {\n 'use strict';\n\n let results = [];\n let ROUTE_NAMES = ['index', 'child', 'sister', 'brother', 'loading'];\n\n let InstrumentedRoute = _routing.Route.extend({\n routerService: (0, _service.inject)('router'),\n\n beforeModel() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'beforeModel', service.get('currentURL')]);\n },\n\n model() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'model', service.get('currentURL')]);\n return new _runtime.RSVP.Promise(resolve => {\n setTimeout(resolve, 200);\n });\n },\n\n afterModel() {\n let service = (0, _metal.get)(this, 'routerService');\n results.push([service.get('currentRouteName'), 'afterModel', service.get('currentURL')]);\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service - currentURL | currentRouteName', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n\n results = [];\n\n ROUTE_NAMES.forEach(name => {\n let routeName = `parent.${name}`;\n this.add(`route:${routeName}`, InstrumentedRoute.extend());\n this.addTemplate(routeName, '{{current-url}}');\n });\n\n let CurrenURLComponent = _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n currentURL: (0, _computed.readOnly)('routerService.currentURL'),\n currentRouteName: (0, _computed.readOnly)('routerService.currentRouteName')\n });\n\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n CurrenURLComponent.reopen({\n currentRoute: (0, _computed.readOnly)('routerService.currentRoute')\n });\n }\n\n this.addComponent('current-url', {\n ComponentClass: CurrenURLComponent,\n template: true /* EMBER_ROUTING_ROUTER_SERVICE */ ? '{{currentURL}}-{{currentRouteName}}-{{currentRoute.name}}' : '{{currentURL}}-{{currentRouteName}}'\n });\n }\n\n ['@test RouterService#currentURL is correctly set for top level route'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/');\n });\n }\n\n ['@test RouterService#currentURL is correctly set for child route'](assert) {\n assert.expect(1);\n\n return this.visit('/child').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n });\n }\n\n ['@test RouterService#currentURL is correctly set after transition'](assert) {\n assert.expect(1);\n\n return this.visit('/child').then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/sister');\n });\n }\n\n ['@test RouterService#currentURL is correctly set on each transition'](assert) {\n assert.expect(3);\n\n return this.visit('/child').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n\n return this.visit('/sister');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/sister');\n\n return this.visit('/brother');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/brother');\n });\n }\n\n ['@test RouterService#currentURL is not set during lifecycle hooks'](assert) {\n assert.expect(2);\n\n return this.visit('/').then(() => {\n assert.deepEqual(results, [[null, 'beforeModel', null], [null, 'model', null], ['parent.loading', 'afterModel', '/']]);\n\n results = [];\n\n return this.visit('/child');\n }).then(() => {\n assert.deepEqual(results, [['parent.index', 'beforeModel', '/'], ['parent.index', 'model', '/'], ['parent.loading', 'afterModel', '/child']]);\n });\n }\n\n ['@test RouterService#currentURL is correctly set with component after consecutive visits'](assert) {\n assert.expect(3);\n\n return this.visit('/').then(() => {\n let text = '/-parent.index';\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n text = '/-parent.index-parent.index';\n }\n this.assertText(text);\n\n return this.visit('/child');\n }).then(() => {\n let text = '/child-parent.child';\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n text = '/child-parent.child-parent.child';\n }\n this.assertText(text);\n\n return this.visit('/');\n }).then(() => {\n let text = '/-parent.index';\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n text = '/-parent.index-parent.index';\n }\n this.assertText(text);\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/events_test', ['internal-test-helpers', '@ember/service', '@ember/-internals/routing'], function (_internalTestHelpers, _service, _routing) {\n 'use strict';\n\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n (0, _internalTestHelpers.moduleFor)('Router Service - events', class extends _internalTestHelpers.RouterTestCase {\n '@test initial render'(assert) {\n assert.expect(12);\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n this.router.on('routeWillChange', transition => {\n assert.ok(transition);\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.localName, 'index');\n });\n\n this.router.on('routeDidChange', transition => {\n assert.ok(transition);\n assert.ok(this.router.currentURL, `has URL ${this.router.currentURL}`);\n assert.equal(this.router.currentURL, '/');\n assert.ok(this.router.currentRouteName, `has route name ${this.router.currentRouteName}`);\n assert.equal(this.router.currentRouteName, 'parent.index');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.localName, 'index');\n });\n }\n }));\n return this.visit('/');\n }\n\n '@test subsequent visits'(assert) {\n assert.expect(24);\n let toParent = true;\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n this.router.on('routeWillChange', transition => {\n if (toParent) {\n assert.equal(this.router.currentURL, null, 'starts as null');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.child');\n assert.equal(transition.to.localName, 'child');\n assert.equal(transition.to.parent.name, 'parent', 'parent node');\n assert.equal(transition.to.parent.child, transition.to, 'parents child node is the `to`');\n assert.equal(transition.to.parent.parent.name, 'application', 'top level');\n assert.equal(transition.to.parent.parent.parent, null, 'top level');\n } else {\n assert.equal(this.router.currentURL, '/child', 'not changed until transition');\n assert.notEqual(transition.from, undefined);\n assert.equal(transition.from.name, 'parent.child');\n assert.equal(transition.from.localName, 'child');\n assert.equal(transition.to.localName, 'sister');\n assert.equal(transition.to.name, 'parent.sister');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (toParent) {\n assert.equal(this.router.currentURL, '/child');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.child');\n assert.equal(transition.to.localName, 'child');\n } else {\n assert.equal(this.router.currentURL, '/sister');\n assert.notEqual(transition.from, undefined);\n assert.equal(transition.from.name, 'parent.child');\n assert.equal(transition.from.localName, 'child');\n assert.equal(transition.to.localName, 'sister');\n assert.equal(transition.to.name, 'parent.sister');\n }\n });\n }\n }));\n return this.visit('/child').then(() => {\n toParent = false;\n return this.routerService.transitionTo('parent.sister');\n });\n }\n\n '@test redirection with `transitionTo`'(assert) {\n assert.expect(8);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.child');\n }\n }));\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n if (toChild) {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n toChild = true;\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n });\n }\n }));\n return this.visit('/');\n }\n\n '@test redirection with `replaceWith`'(assert) {\n assert.expect(8);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.child');\n }\n }));\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n if (toChild) {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n toChild = true;\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n });\n }\n }));\n return this.visit('/');\n }\n\n '@test nested redirection with `transitionTo`'(assert) {\n assert.expect(11);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.transitionTo('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toChild) {\n assert.equal(transition.from.name, 'parent.index');\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (toSister) {\n assert.equal(transition.from.name, 'parent.index', 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n } else {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n }\n });\n }\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test nested redirection with `replaceWith`'(assert) {\n assert.expect(11);\n let toChild = false;\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n this.replaceWith('parent.sister');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toChild) {\n assert.equal(transition.from.name, 'parent.index');\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (toSister) {\n assert.equal(transition.from.name, 'parent.index', 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n } else {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n }\n });\n }\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test aborted transition'(assert) {\n assert.expect(11);\n let didAbort = false;\n let toChild = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model(_model, transition) {\n didAbort = true;\n transition.abort();\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (didAbort) {\n assert.equal(transition.to.name, 'parent.index', 'transition aborted');\n assert.equal(transition.from.name, 'parent.index', 'transition aborted');\n } else if (toChild) {\n assert.equal(transition.from.name, 'parent.index', 'from /');\n assert.equal(transition.to.name, 'parent.child', 'to /child');\n } else {\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (didAbort) {\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n assert.equal(transition.from.name, 'parent.index', 'initial');\n } else {\n assert.equal(transition.to.name, 'parent.index', 'transition aborted');\n assert.equal(transition.from, undefined, 'transition aborted');\n }\n });\n }\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test query param transitions'(assert) {\n assert.expect(15);\n let initial = true;\n let addQP = false;\n let removeQP = false;\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, { a: 'true' });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'true' });\n assert.deepEqual(transition.to.queryParams, { a: 'false', b: 'b' });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'false', b: 'b' });\n assert.deepEqual(transition.to.queryParams, { a: 'false' });\n } else {\n assert.ok(false, 'never');\n }\n });\n\n this.router.on('routeDidChange', transition => {\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, { a: 'true' });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'true' });\n assert.deepEqual(transition.to.queryParams, { a: 'false', b: 'b' });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, { a: 'false', b: 'b' });\n assert.deepEqual(transition.to.queryParams, { a: 'false' });\n } else {\n assert.ok(false, 'never');\n }\n });\n }\n }));\n\n return this.visit('/?a=true').then(() => {\n addQP = true;\n initial = false;\n return this.routerService.transitionTo('/?a=false&b=b');\n }).then(() => {\n removeQP = true;\n addQP = false;\n return this.routerService.transitionTo('/?a=false');\n });\n }\n\n '@test query param redirects with `transitionTo`'(assert) {\n assert.expect(6);\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n this.transitionTo('/sister?a=a');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n });\n }\n }));\n\n return this.visit('/child');\n }\n '@test query param redirects with `replaceWith`'(assert) {\n assert.expect(6);\n let toSister = false;\n\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n this.replaceWith('/sister?a=a');\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, { a: 'a' });\n });\n }\n }));\n\n return this.visit('/child');\n }\n\n '@test params'(assert) {\n assert.expect(14);\n\n let inital = true;\n\n this.add('route:dynamic', _routing.Route.extend({\n model(params) {\n if (inital) {\n assert.deepEqual(params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(params, { dynamic_id: '1' });\n }\n return params;\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'dynamic');\n if (inital) {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, { dynamic_id: '1' });\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'dynamic');\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n if (inital) {\n assert.deepEqual(transition.to.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.to.params, { dynamic_id: '1' });\n }\n });\n }\n }));\n\n return this.visit('/dynamic/123').then(() => {\n inital = false;\n return this.routerService.transitionTo('dynamic', 1);\n });\n }\n\n '@test nested params'(assert) {\n assert.expect(30);\n let initial = true;\n\n this.add('route:dynamicWithChild', _routing.Route.extend({\n model(params) {\n if (initial) {\n assert.deepEqual(params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(params, { dynamic_id: '456' });\n }\n return params.dynamic_id;\n }\n }));\n\n this.add('route:dynamicWithChild.child', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, { child_id: '456' });\n return params.child_id;\n }\n }));\n\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.inject)('router'),\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'dynamicWithChild.child');\n assert.deepEqual(transition.to.paramNames, ['child_id']);\n assert.deepEqual(transition.to.params, { child_id: '456' });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n if (initial) {\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.from.attributes, '456');\n assert.deepEqual(transition.from.parent.attributes, '123');\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '456' });\n }\n });\n\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'dynamicWithChild.child');\n assert.deepEqual(transition.to.paramNames, ['child_id']);\n assert.deepEqual(transition.to.params, { child_id: '456' });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n if (initial) {\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '123' });\n } else {\n assert.deepEqual(transition.from.attributes, '456');\n assert.deepEqual(transition.from.parent.attributes, '123');\n assert.deepEqual(transition.to.attributes, '456');\n assert.deepEqual(transition.to.parent.attributes, '456');\n assert.deepEqual(transition.to.parent.params, { dynamic_id: '456' });\n }\n });\n }\n }));\n\n return this.visit('/dynamic-with-child/123/456').then(() => {\n initial = false;\n return this.routerService.transitionTo('/dynamic-with-child/456/456');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service - deprecated events', class extends _internalTestHelpers.RouterTestCase {\n '@test willTransition events are deprecated'() {\n return this.visit('/').then(() => {\n expectDeprecation(() => {\n this.routerService['_router'].on('willTransition', () => {});\n }, 'You attempted to listen to the \"willTransition\" event which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n });\n }\n\n '@test willTransition events are deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('willTransition', () => {});\n }\n }));\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to listen to the \"willTransition\" event which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n }\n\n '@test didTransition events are deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('didTransition', () => {});\n }\n }));\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to listen to the \"didTransition\" event which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n }\n\n '@test other events are not deprecated on routes'() {\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n this.on('fixx', () => {});\n }\n }));\n expectNoDeprecation(() => {\n return this.visit('/');\n });\n }\n\n '@test didTransition events are deprecated'() {\n return this.visit('/').then(() => {\n expectDeprecation(() => {\n this.routerService['_router'].on('didTransition', () => {});\n }, 'You attempted to listen to the \"didTransition\" event which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n });\n }\n\n '@test other events are not deprecated'() {\n return this.visit('/').then(() => {\n expectNoDeprecation(() => {\n this.routerService['_router'].on('wat', () => {});\n });\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service: deprecated willTransition hook', class extends _internalTestHelpers.RouterTestCase {\n get routerOptions() {\n return {\n willTransition() {\n this._super(...arguments);\n // Overrides\n }\n };\n }\n\n '@test willTransition hook is deprecated'() {\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to override the \"willTransition\" method which is deprecated. Please inject the router service and listen to the \"routeWillChange\" event.');\n }\n });\n (0, _internalTestHelpers.moduleFor)('Router Service: deprecated didTransition hook', class extends _internalTestHelpers.RouterTestCase {\n get routerOptions() {\n return {\n didTransition() {\n this._super(...arguments);\n // Overrides\n }\n };\n }\n\n '@test didTransition hook is deprecated'() {\n expectDeprecation(() => {\n return this.visit('/');\n }, 'You attempted to override the \"didTransition\" method which is deprecated. Please inject the router service and listen to the \"routeDidChange\" event.');\n }\n });\n }\n});","enifed('ember/tests/routing/router_service_test/isActive_test', ['@ember/controller', 'internal-test-helpers'], function (_controller, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Router Service - isActive', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#isActive returns true for simple route'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.ok(this.routerService.isActive('parent.sister'));\n });\n }\n\n ['@test RouterService#isActive returns true for simple route with dynamic segments'](assert) {\n assert.expect(1);\n\n let dynamicModel = { id: 1 };\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('dynamic', dynamicModel);\n }).then(() => {\n assert.ok(this.routerService.isActive('dynamic', dynamicModel));\n });\n }\n\n ['@test RouterService#isActive does not eagerly instantiate controller for query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n this.add('controller:parent.sister', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC',\n\n init() {\n assert.ok(false, 'should never create');\n this._super(...arguments);\n }\n }));\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n assert.notOk(this.routerService.isActive('parent.sister', queryParams));\n });\n }\n\n ['@test RouterService#isActive is correct for simple route with basic query params'](assert) {\n assert.expect(2);\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.ok(this.routerService.isActive('parent.child', queryParams));\n assert.notOk(this.routerService.isActive('parent.child', this.buildQueryParams({ sort: 'DESC' })));\n });\n }\n\n ['@test RouterService#isActive for simple route with array as query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ sort: ['ascending'] });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.notOk(this.routerService.isActive('parent.child', this.buildQueryParams({ sort: 'descending' })));\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/recognize_test', ['internal-test-helpers', '@ember/-internals/routing'], function (_internalTestHelpers, _routing) {\n 'use strict';\n\n if (true /* EMBER_ROUTING_ROUTER_SERVICE */) {\n (0, _internalTestHelpers.moduleFor)('Router Service - recognize', class extends _internalTestHelpers.RouterTestCase {\n '@test returns a RouteInfo for recognized URL'(assert) {\n return this.visit('/').then(() => {\n let routeInfo = this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n assert.ok(routeInfo);\n let { name, localName, parent, child, params, queryParams, paramNames } = routeInfo;\n assert.equal(name, 'dynamicWithChild.child');\n assert.equal(localName, 'child');\n assert.ok(parent);\n assert.equal(parent.name, 'dynamicWithChild');\n assert.notOk(child);\n assert.deepEqual(params, { child_id: '1' });\n assert.deepEqual(queryParams, { a: 'b' });\n assert.deepEqual(paramNames, ['child_id']);\n });\n }\n\n '@test does not transition'(assert) {\n this.addTemplate('parent', 'Parent');\n this.addTemplate('dynamic-with-child.child', 'Dynamic Child');\n\n return this.visit('/').then(() => {\n this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n this.assertText('Parent', 'Did not transition and cause render');\n assert.equal(this.routerService.currentURL, '/', 'Did not transition');\n });\n }\n\n '@test respects the usage of a different rootURL'(assert) {\n this.router.reopen({\n rootURL: '/app/'\n });\n\n return this.visit('/app').then(() => {\n let routeInfo = this.routerService.recognize('/app/child/');\n assert.ok(routeInfo);\n let { name, localName, parent } = routeInfo;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'parent');\n });\n }\n\n '@test must include rootURL'() {\n this.addTemplate('parent', 'Parent');\n this.addTemplate('dynamic-with-child.child', 'Dynamic Child');\n\n this.router.reopen({\n rootURL: '/app/'\n });\n\n return this.visit('/app').then(() => {\n expectAssertion(() => {\n this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n }, 'You must pass a url that begins with the application\\'s rootURL \"/app/\"');\n });\n }\n\n '@test returns `null` if URL is not recognized'(assert) {\n return this.visit('/').then(() => {\n let routeInfo = this.routerService.recognize('/foo');\n assert.equal(routeInfo, null);\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service - recognizeAndLoad', class extends _internalTestHelpers.RouterTestCase {\n '@test returns a RouteInfoWithAttributes for recognized URL'(assert) {\n this.add('route:dynamicWithChild', _routing.Route.extend({\n model(params) {\n return { name: 'dynamicWithChild', data: params.dynamic_id };\n }\n }));\n this.add('route:dynamicWithChild.child', _routing.Route.extend({\n model(params) {\n return { name: 'dynamicWithChild.child', data: params.child_id };\n }\n }));\n\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/dynamic-with-child/123/1?a=b');\n }).then(routeInfoWithAttributes => {\n assert.ok(routeInfoWithAttributes);\n let {\n name,\n localName,\n parent,\n attributes,\n paramNames,\n params,\n queryParams\n } = routeInfoWithAttributes;\n assert.equal(name, 'dynamicWithChild.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'dynamicWithChild');\n assert.deepEqual(params, { child_id: '1' });\n assert.deepEqual(queryParams, { a: 'b' });\n assert.deepEqual(paramNames, ['child_id']);\n assert.deepEqual(attributes, { name: 'dynamicWithChild.child', data: '1' });\n assert.deepEqual(parent.attributes, { name: 'dynamicWithChild', data: '123' });\n assert.deepEqual(parent.paramNames, ['dynamic_id']);\n assert.deepEqual(parent.params, { dynamic_id: '123' });\n });\n }\n\n '@test does not transition'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return { name: 'child', data: ['stuff'] };\n }\n }));\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', () => assert.ok(false));\n this.routerService.on('routeDidChange', () => assert.ok(false));\n return this.routerService.recognizeAndLoad('/child');\n }).then(() => {\n assert.equal(this.routerService.currentURL, '/');\n this.assertText('Parent');\n });\n }\n\n '@test respects the usage of a different rootURL'(assert) {\n this.router.reopen({\n rootURL: '/app/'\n });\n\n return this.visit('/app').then(() => {\n return this.routerService.recognizeAndLoad('/app/child/');\n }).then(routeInfoWithAttributes => {\n assert.ok(routeInfoWithAttributes);\n let { name, localName, parent } = routeInfoWithAttributes;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'parent');\n });\n }\n\n '@test must include rootURL'() {\n this.router.reopen({\n rootURL: '/app/'\n });\n\n return this.visit('/app').then(() => {\n expectAssertion(() => {\n this.routerService.recognizeAndLoad('/dynamic-with-child/123/1?a=b');\n }, 'You must pass a url that begins with the application\\'s rootURL \"/app/\"');\n });\n }\n\n '@test rejects if url is not recognized'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return { name: 'child', data: ['stuff'] };\n }\n }));\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/foo');\n }).then(() => {\n assert.ok(false, 'never');\n }, reason => {\n assert.equal(reason, 'URL /foo was not recognized');\n });\n }\n\n '@test rejects if there is an unhandled error'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n throw Error('Unhandled');\n }\n }));\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/child');\n }).then(() => {\n assert.ok(false, 'never');\n }, err => {\n assert.equal(err.message, 'Unhandled');\n });\n }\n });\n }\n});","enifed('ember/tests/routing/router_service_test/replaceWith_test', ['@ember/-internals/routing', 'internal-test-helpers', 'router_js', '@ember/controller'], function (_routing, _internalTestHelpers, _router_js, _controller) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Router Service - replaceWith', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n\n let testCase = this;\n testCase.state = [];\n\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n testCase.state.push(path);\n this.set('path', path);\n },\n\n replaceURL(path) {\n testCase.state.splice(testCase.state.length - 1, 1, path);\n this.set('path', path);\n }\n }));\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#replaceWith returns a Transition'](assert) {\n assert.expect(1);\n\n let transition;\n\n return this.visit('/').then(() => {\n transition = this.routerService.replaceWith('parent.child');\n\n assert.ok(transition instanceof _router_js.InternalTransition);\n\n return transition;\n });\n }\n\n ['@test RouterService#replaceWith with basic route replaces location'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.replaceWith('parent.brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/brother']);\n });\n }\n\n ['@test RouterService#replaceWith with basic route using URLs replaces location'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('/child');\n }).then(() => {\n return this.routerService.transitionTo('/sister');\n }).then(() => {\n return this.routerService.replaceWith('/brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/brother']);\n });\n }\n\n ['@test RouterService#replaceWith transitioning back to previously visited route replaces location'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.replaceWith('parent.sister');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/sister']);\n });\n }\n\n ['@test RouterService#replaceWith with basic query params does not remove query param defaults'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.replaceWith('parent.sister');\n }).then(() => {\n return this.routerService.replaceWith('parent.child', queryParams);\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child?sort=ASC']);\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/transitionTo_test', ['@ember/service', '@ember/-internals/glimmer', '@ember/-internals/routing', '@ember/controller', '@ember/runloop', '@ember/-internals/metal', 'internal-test-helpers', 'router_js'], function (_service, _glimmer, _routing, _controller, _runloop, _metal, _internalTestHelpers, _router_js) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Router Service - transitionTo', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n\n let testCase = this;\n testCase.state = [];\n\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n testCase.state.push(path);\n this.set('path', path);\n },\n\n replaceURL(path) {\n testCase.state.splice(testCase.state.length - 1, 1, path);\n this.set('path', path);\n }\n }));\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#transitionTo returns a Transition'](assert) {\n assert.expect(1);\n\n let transition;\n\n return this.visit('/').then(() => {\n transition = this.routerService.transitionTo('parent.child');\n\n assert.ok(transition instanceof _router_js.InternalTransition);\n\n return transition;\n });\n }\n\n ['@test RouterService#transitionTo with basic route updates location'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/brother']);\n });\n }\n\n ['@test RouterService#transitionTo transitioning back to previously visited route updates location'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/brother', '/sister']);\n });\n }\n\n ['@test RouterService#transitionTo with basic route'](assert) {\n assert.expect(1);\n\n let componentInstance;\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('parent.sister');\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#transitionTo with basic route using URL'](assert) {\n assert.expect(1);\n\n let componentInstance;\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('/sister');\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#transitionTo with dynamic segment'](assert) {\n assert.expect(3);\n\n let componentInstance;\n let dynamicModel = { id: 1, contents: 'much dynamicism' };\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addTemplate('dynamic', '{{model.contents}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', dynamicModel);\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\n\n assert.equal(this.routerService.get('currentRouteName'), 'dynamic');\n assert.equal(this.routerService.get('currentURL'), '/dynamic/1');\n this.assertText('much dynamicism');\n });\n }\n\n ['@test RouterService#transitionTo with dynamic segment and model hook'](assert) {\n assert.expect(3);\n\n let componentInstance;\n let dynamicModel = { id: 1, contents: 'much dynamicism' };\n\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n }));\n\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addTemplate('dynamic', '{{model.contents}}');\n\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.inject)('router'),\n init() {\n this._super();\n componentInstance = this;\n },\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', 1);\n }\n }\n }),\n template: `foo-bar`\n });\n\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\n\n assert.equal(this.routerService.get('currentRouteName'), 'dynamic');\n assert.equal(this.routerService.get('currentURL'), '/dynamic/1');\n this.assertText('much dynamicism');\n });\n }\n\n ['@test RouterService#transitionTo with basic query params does not remove query param defaults'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo passing only queryParams works'](assert) {\n assert.expect(2);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort']\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'DESC' });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n }).then(() => {\n return this.routerService.transitionTo(queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=DESC');\n });\n }\n\n ['@test RouterService#transitionTo with unspecified query params'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'page', 'category', 'extra'],\n sort: 'ASC',\n page: null,\n category: undefined\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo with aliased query params uses the original provided key'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ url_sort: 'ASC' });\n\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?url_sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo with aliased query params uses the original provided key when controller property name'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ cont_sort: 'ASC' });\n\n return this.visit('/').then(() => {\n expectAssertion(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }, 'You passed the `cont_sort` query parameter during a transition into parent.child, please update to url_sort');\n });\n }\n });\n});","enifed('ember/tests/routing/router_service_test/urlFor_test', ['@ember/controller', '@ember/string', '@ember/-internals/routing', '@ember/-internals/metal', 'internal-test-helpers'], function (_controller, _string, _routing, _metal, _internalTestHelpers) {\n 'use strict';\n\n function setupController(app, name) {\n let controllerName = `${(0, _string.capitalize)(name)}Controller`;\n\n Object.defineProperty(app, controllerName, {\n get() {\n throw new Error(`Generating a URL should not require instantiation of a ${controllerName}.`);\n }\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Router Service - urlFor', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#urlFor returns URL for simple route'](assert) {\n assert.expect(1);\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child');\n\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments'](assert) {\n assert.expect(1);\n\n setupController(this.application, 'dynamic');\n\n let dynamicModel = { id: 1, contents: 'much dynamicism' };\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', dynamicModel);\n\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal('/child?foo=bar', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params and default value'](assert) {\n assert.expect(1);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n\n let queryParams = this.buildQueryParams({ sort: 'ASC' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal('/child?sort=ASC', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params and default value with stickyness'](assert) {\n assert.expect(2);\n\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'foo'],\n sort: 'ASC'\n }));\n\n return this.visit('/child/?sort=DESC').then(() => {\n let controller = this.applicationInstance.lookup('controller:parent.child');\n assert.equal((0, _metal.get)(controller, 'sort'), 'DESC', 'sticky is set');\n\n let queryParams = this.buildQueryParams({ foo: 'derp' });\n let actual = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal(actual, '/child?foo=derp', 'does not use \"stickiness\"');\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with array as query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal('/child?selectedItems[]=a&selectedItems[]=b&selectedItems[]=c', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with null query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: null });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with undefined query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: undefined });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and basic query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\n assert.equal('/dynamic/1?foo=bar', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and array as query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\n assert.equal('/dynamic/1?selectedItems[]=a&selectedItems[]=b&selectedItems[]=c', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and null query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: null });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and undefined query params'](assert) {\n assert.expect(1);\n\n let queryParams = this.buildQueryParams({ foo: undefined });\n\n return this.visit('/').then(() => {\n let expectedURL = this.routerService.urlFor('dynamic', { id: 1 }, queryParams);\n\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path'](assert) {\n assert.expect(1);\n\n let expectedURL;\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child');\n\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n assert.equal(expectedURL, this.routerService.get('currentURL'));\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with dynamic segments'](assert) {\n assert.expect(1);\n\n let expectedURL;\n let dynamicModel = { id: 1 };\n\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n }));\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('dynamic', dynamicModel);\n\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n assert.equal(expectedURL, this.routerService.get('currentURL'));\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with query params'](assert) {\n assert.expect(1);\n\n let expectedURL;\n let actualURL;\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child', queryParams);\n\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n\n assert.equal(expectedURL, actualURL);\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with dynamic segments and query params'](assert) {\n assert.expect(1);\n\n let expectedURL;\n let actualURL;\n let queryParams = this.buildQueryParams({ foo: 'bar' });\n let dynamicModel = { id: 1 };\n\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n }));\n\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('dynamic', dynamicModel, queryParams);\n\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n\n assert.equal(expectedURL, actualURL);\n });\n }\n });\n});","enifed('ember/tests/routing/substates_test', ['@ember/-internals/runtime', '@ember/-internals/routing', 'internal-test-helpers'], function (_runtime, _routing, _internalTestHelpers) {\n 'use strict';\n\n let counter;\n\n function step(assert, expectedValue, description) {\n assert.equal(counter, expectedValue, 'Step ' + expectedValue + ': ' + description);\n counter++;\n }\n\n (0, _internalTestHelpers.moduleFor)('Loading/Error Substates', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n counter = 1;\n\n this.addTemplate('application', `
    {{outlet}}
    `);\n this.addTemplate('index', 'INDEX');\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n ['@test Slow promise from a child route of application enters nested loading state'](assert) {\n let turtleDeferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('turtle');\n });\n\n this.add('route:application', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'ApplicationRoute#setupController');\n }\n }));\n\n this.add('route:turtle', _routing.Route.extend({\n model() {\n step(assert, 1, 'TurtleRoute#model');\n return turtleDeferred.promise;\n }\n }));\n this.addTemplate('turtle', 'TURTLE');\n this.addTemplate('loading', 'LOADING');\n\n let promise = this.visit('/turtle').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'TURTLE', `turtle template has loaded and replaced the loading template`);\n });\n\n let text = this.$('#app').text();\n assert.equal(text, 'LOADING', `The Loading template is nested in application template's outlet`);\n\n turtleDeferred.resolve();\n return promise;\n }\n\n [`@test Slow promises returned from ApplicationRoute#model don't enter LoadingRoute`](assert) {\n let appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n assert.ok(false, `shouldn't get here`);\n }\n }));\n\n let promise = this.visit('/').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'INDEX', `index template has been rendered`);\n });\n\n if (this.element) {\n assert.equal(this.element.textContent, '');\n }\n\n appDeferred.resolve();\n\n return promise;\n }\n\n [`@test Don't enter loading route unless either route or template defined`](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n this.add('route:dummy', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n this.addTemplate('dummy', 'DUMMY');\n\n return this.visit('/').then(() => {\n let promise = this.visit('/dummy').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n\n assert.ok(this.currentPath !== 'loading', `\n loading state not entered\n `);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Enter loading route only if loadingRoute is defined'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n\n this.add('route:dummy', _routing.Route.extend({\n model() {\n step(assert, 1, 'DummyRoute#model');\n return deferred.promise;\n }\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'LoadingRoute#setupController');\n }\n }));\n this.addTemplate('dummy', 'DUMMY');\n\n return this.visit('/').then(() => {\n let promise = this.visit('/dummy').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n\n assert.equal(this.currentPath, 'loading', `loading state entered`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter ApplicationLoadingRoute if present'](assert) {\n let appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n }));\n let loadingRouteEntered = false;\n this.add('route:application_loading', _routing.Route.extend({\n setupController() {\n loadingRouteEntered = true;\n }\n }));\n\n let promise = this.visit('/').then(() => {\n assert.equal(this.$('#app').text(), 'INDEX', 'index route loaded');\n });\n assert.ok(loadingRouteEntered, 'ApplicationLoadingRoute was entered');\n appDeferred.resolve();\n\n return promise;\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter application_loading if template present'](assert) {\n let appDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('application_loading', `\n
    TOPLEVEL LOADING
    \n `);\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n }));\n\n let promise = this.visit('/').then(() => {\n let length = this.$('#toplevel-loading').length;\n text = this.$('#app').text();\n\n assert.equal(length, 0, `top-level loading view has been entirely removed from the DOM`);\n assert.equal(text, 'INDEX', 'index has fully rendered');\n });\n let text = this.$('#toplevel-loading').text();\n\n assert.equal(text, 'TOPLEVEL LOADING', 'still loading the top level');\n appDeferred.resolve();\n\n return promise;\n }\n\n ['@test Prioritized substate entry works with preserved-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar.index', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', { path: '/bar' }, function () {});\n });\n });\n\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n return this.visit('/').then(() => {\n let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.bar.index fully loaded');\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Prioritized substate entry works with reset-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('bar_loading', 'BAR LOADING');\n this.addTemplate('bar.index', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', { path: '/bar', resetNamespace: true }, function () {});\n });\n });\n\n this.add('route:bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n return this.visit('/').then(() => {\n let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'bar.index fully loaded');\n });\n\n let text = this.$('#app').text();\n\n assert.equal(text, 'BAR LOADING', `foo.bar_loading was entered (as opposed to something likefoo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n ['@test Prioritized loading substate entry works with preserved-namespace nested routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n let promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.bar has rendered');\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n\n return promise;\n }\n\n ['@test Prioritized error substate entry works with preserved-namespaec nested routes'](assert) {\n this.addTemplate('foo.bar_error', 'FOOBAR ERROR: {{model.msg}}');\n this.addTemplate('foo.bar', 'YAY');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n }\n }));\n\n return this.visit('/').then(() => {\n return this.visit('/foo/bar').then(() => {\n let text = this.$('#app').text();\n assert.equal(text, 'FOOBAR ERROR: did it broke?', `foo.bar_error was entered (as opposed to something like foo/foo/bar_error)`);\n });\n });\n }\n ['@test Prioritized loading substate entry works with auto-generated index routes'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('foo.index_loading', 'FOO LOADING');\n this.addTemplate('foo.index', 'YAY');\n this.addTemplate('foo', '{{outlet}}');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n }));\n\n let promise = this.visit('/foo').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'YAY', 'foo.index was rendered');\n });\n let text = this.$('#app').text();\n assert.equal(text, 'FOO LOADING', 'foo.index_loading was entered');\n\n deferred.resolve();\n\n return promise;\n }\n\n ['@test Prioritized error substate entry works with auto-generated index routes'](assert) {\n this.addTemplate('foo.index_error', 'FOO ERROR: {{model.msg}}');\n this.addTemplate('foo.index', 'YAY');\n this.addTemplate('foo', '{{outlet}}');\n\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n\n this.add('route:foo.index', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n }\n }));\n this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n }));\n\n return this.visit('/').then(() => {\n return this.visit('/foo').then(() => {\n let text = this.$('#app').text();\n\n assert.equal(text, 'FOO ERROR: did it broke?', 'foo.index_error was entered');\n });\n });\n }\n\n ['@test Rejected promises returned from ApplicationRoute transition into top-level application_error'](assert) {\n let reject = true;\n\n this.addTemplate('index', '
    INDEX
    ');\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n },\n model() {\n if (reject) {\n return _runtime.RSVP.reject({ msg: 'BAD NEWS BEARS' });\n } else {\n return {};\n }\n }\n }));\n\n this.addTemplate('application_error', `\n

    TOPLEVEL ERROR: {{model.msg}}

    \n `);\n\n return this.visit('/').then(() => {\n let text = this.$('#toplevel-error').text();\n assert.equal(text, 'TOPLEVEL ERROR: BAD NEWS BEARS', 'toplevel error rendered');\n reject = false;\n }).then(() => {\n return this.visit('/');\n }).then(() => {\n let text = this.$('#index').text();\n assert.equal(text, 'INDEX', 'the index route resolved');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Loading/Error Substates - nested routes', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n\n counter = 1;\n\n this.addTemplate('application', `
    {{outlet}}
    `);\n this.addTemplate('index', 'INDEX');\n this.addTemplate('grandma', 'GRANDMA {{outlet}}');\n this.addTemplate('mom', 'MOM');\n\n this.router.map(function () {\n this.route('grandma', function () {\n this.route('mom', { resetNamespace: true }, function () {\n this.route('sally');\n this.route('this-route-throws');\n });\n this.route('puppies');\n });\n this.route('memere', { path: '/memere/:seg' }, function () {});\n });\n\n this.visit('/');\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n get currentPath() {\n return this.getController('application').get('currentPath');\n }\n\n ['@test ApplicationRoute#currentPath reflects loading state path'](assert) {\n let momDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('grandma.loading', 'GRANDMALOADING');\n\n this.add('route:mom', _routing.Route.extend({\n model() {\n return momDeferred.promise;\n }\n }));\n\n let promise = this.visit('/grandma/mom').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM', `Grandma.mom loaded text is displayed`);\n assert.equal(this.currentPath, 'grandma.mom.index', `currentPath reflects final state`);\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA GRANDMALOADING', `Grandma.mom loading text displayed`);\n\n assert.equal(this.currentPath, 'grandma.loading', `currentPath reflects loading state`);\n\n momDeferred.resolve();\n\n return promise;\n }\n\n [`@test Loading actions bubble to root but don't enter substates above pivot `](assert) {\n let sallyDeferred = _runtime.RSVP.defer();\n let puppiesDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n actions: {\n loading() {\n assert.ok(true, 'loading action received on ApplicationRoute');\n }\n }\n }));\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n return sallyDeferred.promise;\n }\n }));\n\n this.add('route:grandma.puppies', _routing.Route.extend({\n model() {\n return puppiesDeferred.promise;\n }\n }));\n\n let promise = this.visit('/grandma/mom/sally');\n assert.equal(this.currentPath, 'index', 'Initial route fully loaded');\n\n sallyDeferred.resolve();\n\n promise.then(() => {\n assert.equal(this.currentPath, 'grandma.mom.sally', 'transition completed');\n\n let visit = this.visit('/grandma/puppies');\n assert.equal(this.currentPath, 'grandma.mom.sally', 'still in initial state because the only loading state is above the pivot route');\n\n return visit;\n }).then(() => {\n this.runTask(() => puppiesDeferred.resolve());\n\n assert.equal(this.currentPath, 'grandma.puppies', 'Finished transition');\n });\n\n return promise;\n }\n\n ['@test Default error event moves into nested route'](assert) {\n this.addTemplate('grandma.error', 'ERROR: {{model.msg}}');\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally').then(() => {\n step(assert, 3, 'App finished loading');\n\n let text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA ERROR: did it broke?', 'error bubbles');\n assert.equal(this.currentPath, 'grandma.error', 'Initial route fully loaded');\n });\n }\n\n [`@test Non-bubbled errors that re-throw aren't swallowed`](assert) {\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n // returns undefined which is falsey\n throw err;\n }\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n\n return this.runLoopSettled();\n }\n\n [`@test Handled errors that re-throw aren't swallowed`](assert) {\n let handledError;\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n this.transitionTo('mom.this-route-throws');\n\n return false;\n }\n }\n }));\n\n this.add('route:mom.this-route-throws', _routing.Route.extend({\n model() {\n step(assert, 3, 'MomThisRouteThrows#model');\n throw handledError;\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, `it broke`);\n\n return this.runLoopSettled();\n }\n\n ['@test errors that are bubbled are thrown at a higher level if not handled'](assert) {\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg == 'did it broke?';\n }, 'Correct error was thrown');\n\n return this.runLoopSettled();\n }\n\n [`@test Handled errors that are thrown through rejection aren't swallowed`](assert) {\n let handledError;\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n this.transitionTo('mom.this-route-throws');\n\n return false;\n }\n }\n }));\n\n this.add('route:mom.this-route-throws', _routing.Route.extend({\n model() {\n step(assert, 3, 'MomThisRouteThrows#model');\n return _runtime.RSVP.reject(handledError);\n }\n }));\n\n assert.throws(() => {\n this.visit('/grandma/mom/sally');\n }, function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n\n return this.runLoopSettled();\n }\n\n ['@test Default error events move into nested route, prioritizing more specifically named error routes - NEW'](assert) {\n this.addTemplate('grandma.error', 'ERROR: {{model.msg}}');\n this.addTemplate('mom_error', 'MOM ERROR: {{model.msg}}');\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally').then(() => {\n step(assert, 3, 'Application finished booting');\n\n assert.equal(this.$('#app').text(), 'GRANDMA MOM ERROR: did it broke?', 'the more specifically named mome error substate was entered over the other error route');\n\n assert.equal(this.currentPath, 'grandma.mom_error', 'Initial route fully loaded');\n });\n }\n\n ['@test Slow promises waterfall on startup'](assert) {\n let grandmaDeferred = _runtime.RSVP.defer();\n let sallyDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('loading', 'LOADING');\n this.addTemplate('mom', 'MOM {{outlet}}');\n this.addTemplate('mom.loading', 'MOMLOADING');\n this.addTemplate('mom.sally', 'SALLY');\n\n this.add('route:grandma', _routing.Route.extend({\n model() {\n step(assert, 1, 'GrandmaRoute#model');\n return grandmaDeferred.promise;\n }\n }));\n\n this.add('route:mom', _routing.Route.extend({\n model() {\n step(assert, 2, 'MomRoute#model');\n return {};\n }\n }));\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 3, 'SallyRoute#model');\n return sallyDeferred.promise;\n },\n setupController() {\n step(assert, 4, 'SallyRoute#setupController');\n }\n }));\n\n let promise = this.visit('/grandma/mom/sally').then(() => {\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM SALLY', `Sally template displayed`);\n });\n let text = this.$('#app').text();\n\n assert.equal(text, 'LOADING', `The loading template is nested in application template's outlet`);\n\n this.runTask(() => grandmaDeferred.resolve());\n text = this.$('#app').text();\n\n assert.equal(text, 'GRANDMA MOM MOMLOADING', `Mom's child loading route is displayed due to sally's slow promise`);\n\n sallyDeferred.resolve();\n\n return promise;\n }\n ['@test Enter child loading state of pivot route'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('grandma.loading', 'GMONEYLOADING');\n\n this.add('route:mom.sally', _routing.Route.extend({\n setupController() {\n step(assert, 1, 'SallyRoute#setupController');\n }\n }));\n\n this.add('route:grandma.puppies', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n return this.visit('/grandma/mom/sally').then(() => {\n assert.equal(this.currentPath, 'grandma.mom.sally', 'Initial route fully loaded');\n\n let promise = this.visit('/grandma/puppies').then(() => {\n assert.equal(this.currentPath, 'grandma.puppies', 'Finished transition');\n });\n\n assert.equal(this.currentPath, 'grandma.loading', `in pivot route's child loading state`);\n deferred.resolve();\n\n return promise;\n });\n }\n\n [`@test Error events that aren't bubbled don't throw application assertions`](assert) {\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n assert.equal(err.msg, 'did it broke?', `it didn't break`);\n return false;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally');\n }\n\n ['@test Handled errors that bubble can be handled at a higher level'](assert) {\n let handledError;\n\n this.add('route:mom', _routing.Route.extend({\n actions: {\n error(err) {\n step(assert, 3, 'MomRoute#actions.error');\n assert.equal(err, handledError, `error handled and rebubbled is handleable at higher route`);\n }\n }\n }));\n\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n\n return true;\n }\n }\n }));\n\n return this.visit('/grandma/mom/sally');\n }\n\n ['@test Setting a query param during a slow transition should work'](assert) {\n let deferred = _runtime.RSVP.defer();\n this.addTemplate('memere.loading', 'MMONEYLOADING');\n\n this.add('route:grandma', _routing.Route.extend({\n beforeModel: function () {\n this.transitionTo('memere', 1);\n }\n }));\n\n this.add('route:memere', _routing.Route.extend({\n queryParams: {\n test: { defaultValue: 1 }\n }\n }));\n\n this.add('route:memere.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n }));\n\n let promise = this.visit('/grandma').then(() => {\n assert.equal(this.currentPath, 'memere.index', 'Transition should be complete');\n });\n let memereController = this.getController('memere');\n\n assert.equal(this.currentPath, 'memere.loading', 'Initial route should be loading');\n\n memereController.set('test', 3);\n\n assert.equal(this.currentPath, 'memere.loading', 'Initial route should still be loading');\n\n assert.equal(memereController.get('test'), 3, 'Controller query param value should have changed');\n deferred.resolve();\n\n return promise;\n }\n });\n});","enifed('ember/tests/routing/toplevel_dom_test', ['@ember/-internals/environment', 'internal-test-helpers'], function (_environment, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Top Level DOM Structure', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this._APPLICATION_TEMPLATE_WRAPPER = _environment.ENV._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = this._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n ['@test topmost template with wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = true;\n\n this.addTemplate('application', 'hello world');\n\n return this.visit('/').then(() => {\n this.assertComponentElement(this.element, { content: 'hello world' });\n });\n }\n\n ['@test topmost template without wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n\n this.addTemplate('application', 'hello world');\n\n return this.visit('/').then(() => {\n this.assertInnerHTML('hello world');\n });\n }\n });\n});","enifed('ember/tests/service_injection_test', ['@ember/-internals/owner', '@ember/controller', '@ember/service', '@ember/-internals/runtime', 'internal-test-helpers', '@ember/-internals/metal'], function (_owner, _controller, _service, _runtime, _internalTestHelpers, _metal) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('Service Injection', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected and is resolved'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend();\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n\n ['@test Service can be an object proxy and access owner in init GH#16484'](assert) {\n let serviceOwner;\n\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend(_runtime._ProxyMixin, {\n init() {\n this._super(...arguments);\n\n serviceOwner = (0, _owner.getOwner)(this);\n }\n });\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(instance => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n assert.equal(serviceOwner, instance, 'should be able to `getOwner` in init');\n });\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Service Injection with ES5 Getters', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected and is resolved without calling `get`'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n let MyService = _service.default.extend({\n name: (0, _metal.computed)(function () {\n return 'The service name';\n })\n });\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n\n this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.myService instanceof MyService);\n assert.equal(controller.myService.name, 'The service name', 'service property accessible');\n });\n }\n });\n\n if (false /* EMBER_MODULE_UNIFICATION */) {\n (0, _internalTestHelpers.moduleFor)('Service Injection (MU)', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Service can be injected with source and is resolved'](assert) {\n let source = 'controller:src/ui/routes/application/controller';\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source })\n }));\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source\n }, MyService);\n\n return this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n\n ['@test Services can be injected with same name, different source, and resolve different instances'](assert) {\n // This test implies that there is a file src/ui/routes/route-a/-services/my-service\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n // This test implies that there is a file src/ui/routes/route-b/-services/my-service\n let routeBSource = 'controller:src/ui/routes/route-b/controller';\n\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeBSource })\n }));\n\n let LocalLookupService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source: routeASource\n }, LocalLookupService);\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n source: routeBSource\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof LocalLookupService, 'local lookup service is returned');\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n let serviceFromControllerB = controllerB.get('myService');\n assert.ok(serviceFromControllerB instanceof MyService, 'global service is returned');\n\n assert.notStrictEqual(serviceFromControllerA, serviceFromControllerB);\n });\n }\n\n ['@test Services can be injected with same name, different source, but same resolution result, and share an instance'](assert) {\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n let routeBSource = 'controller:src/ui/routes/route-b/controller';\n\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeBSource })\n }));\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service'\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof MyService);\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n assert.strictEqual(serviceFromControllerA, controllerB.get('myService'));\n });\n }\n\n /*\n * This test demonstrates a failure in the caching system of ember's\n * container around singletons and and local lookup. The local lookup\n * is cached and the global injection is then looked up incorrectly.\n *\n * The paractical rules of Ember's module unification config are such\n * that services cannot be locally looked up, thus this case is really\n * just a demonstration of what could go wrong if we permit arbitrary\n * configuration (such as a singleton type that has local lookup).\n */\n ['@test Services can be injected with same name, one with source one without, and share an instance'](assert) {\n let routeASource = 'controller:src/ui/routes/route-a/controller';\n this.add('controller:route-a', _controller.default.extend({\n myService: (0, _service.inject)('my-service', { source: routeASource })\n }));\n\n this.add('controller:route-b', _controller.default.extend({\n myService: (0, _service.inject)('my-service')\n }));\n\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service'\n }, MyService);\n\n return this.visit('/').then(() => {\n let controllerA = this.applicationInstance.lookup('controller:route-a');\n let serviceFromControllerA = controllerA.get('myService');\n assert.ok(serviceFromControllerA instanceof MyService, 'global service is returned');\n\n let controllerB = this.applicationInstance.lookup('controller:route-b');\n let serviceFromControllerB = controllerB.get('myService');\n assert.ok(serviceFromControllerB instanceof MyService, 'global service is returned');\n\n assert.strictEqual(serviceFromControllerA, serviceFromControllerB);\n });\n }\n\n ['@test Service with namespace can be injected and is resolved'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.inject)('my-namespace::my-service')\n }));\n let MyService = _service.default.extend();\n this.add({\n specifier: 'service:my-service',\n namespace: 'my-namespace'\n }, MyService);\n\n this.visit('/').then(() => {\n let controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n });\n }\n });\n }\n});","enifed('ember/tests/view_instrumentation_test', ['@ember/instrumentation', 'internal-test-helpers'], function (_instrumentation, _internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('View Instrumentation', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n this.addTemplate('application', `{{outlet}}`);\n this.addTemplate('index', `

    Index

    `);\n this.addTemplate('posts', `

    Posts

    `);\n\n this.router.map(function () {\n this.route('posts');\n });\n }\n teardown() {\n (0, _instrumentation.reset)();\n super.teardown();\n }\n\n ['@test Nodes without view instances are instrumented'](assert) {\n let called = false;\n\n (0, _instrumentation.subscribe)('render', {\n before() {\n called = true;\n },\n after() {}\n });\n\n return this.visit('/').then(() => {\n assert.equal(this.textValue(), 'Index', 'It rendered the correct template');\n\n assert.ok(called, 'Instrumentation called on first render');\n called = false;\n\n return this.visit('/posts');\n }).then(() => {\n assert.equal(this.textValue(), 'Posts', 'It rendered the correct template');\n assert.ok(called, 'Instrumentation called on transition to non-view backed route');\n });\n }\n });\n});","enifed('internal-test-helpers/index', ['exports', 'internal-test-helpers/lib/factory', 'internal-test-helpers/lib/build-owner', 'internal-test-helpers/lib/confirm-export', 'internal-test-helpers/lib/equal-inner-html', 'internal-test-helpers/lib/equal-tokens', 'internal-test-helpers/lib/module-for', 'internal-test-helpers/lib/strip', 'internal-test-helpers/lib/apply-mixins', 'internal-test-helpers/lib/get-text-of', 'internal-test-helpers/lib/matchers', 'internal-test-helpers/lib/run', 'internal-test-helpers/lib/test-cases/abstract', 'internal-test-helpers/lib/test-cases/abstract-application', 'internal-test-helpers/lib/test-cases/application', 'internal-test-helpers/lib/test-cases/query-param', 'internal-test-helpers/lib/test-cases/abstract-rendering', 'internal-test-helpers/lib/test-cases/rendering', 'internal-test-helpers/lib/test-cases/router', 'internal-test-helpers/lib/test-cases/autoboot-application', 'internal-test-helpers/lib/test-cases/default-resolver-application', 'internal-test-helpers/lib/test-resolver', 'internal-test-helpers/lib/browser-detect', 'internal-test-helpers/lib/registry-check'], function (exports, _factory, _buildOwner, _confirmExport, _equalInnerHtml, _equalTokens, _moduleFor, _strip, _applyMixins, _getTextOf, _matchers, _run, _abstract, _abstractApplication, _application, _queryParam, _abstractRendering, _rendering, _router, _autobootApplication, _defaultResolverApplication, _testResolver, _browserDetect, _registryCheck) {\n 'use strict';\n\n Object.defineProperty(exports, 'factory', {\n enumerable: true,\n get: function () {\n return _factory.default;\n }\n });\n Object.defineProperty(exports, 'buildOwner', {\n enumerable: true,\n get: function () {\n return _buildOwner.default;\n }\n });\n Object.defineProperty(exports, 'confirmExport', {\n enumerable: true,\n get: function () {\n return _confirmExport.default;\n }\n });\n Object.defineProperty(exports, 'equalInnerHTML', {\n enumerable: true,\n get: function () {\n return _equalInnerHtml.default;\n }\n });\n Object.defineProperty(exports, 'equalTokens', {\n enumerable: true,\n get: function () {\n return _equalTokens.default;\n }\n });\n Object.defineProperty(exports, 'moduleFor', {\n enumerable: true,\n get: function () {\n return _moduleFor.default;\n }\n });\n Object.defineProperty(exports, 'strip', {\n enumerable: true,\n get: function () {\n return _strip.default;\n }\n });\n Object.defineProperty(exports, 'applyMixins', {\n enumerable: true,\n get: function () {\n return _applyMixins.default;\n }\n });\n Object.defineProperty(exports, 'getTextOf', {\n enumerable: true,\n get: function () {\n return _getTextOf.default;\n }\n });\n Object.defineProperty(exports, 'equalsElement', {\n enumerable: true,\n get: function () {\n return _matchers.equalsElement;\n }\n });\n Object.defineProperty(exports, 'classes', {\n enumerable: true,\n get: function () {\n return _matchers.classes;\n }\n });\n Object.defineProperty(exports, 'styles', {\n enumerable: true,\n get: function () {\n return _matchers.styles;\n }\n });\n Object.defineProperty(exports, 'regex', {\n enumerable: true,\n get: function () {\n return _matchers.regex;\n }\n });\n Object.defineProperty(exports, 'runAppend', {\n enumerable: true,\n get: function () {\n return _run.runAppend;\n }\n });\n Object.defineProperty(exports, 'runDestroy', {\n enumerable: true,\n get: function () {\n return _run.runDestroy;\n }\n });\n Object.defineProperty(exports, 'AbstractTestCase', {\n enumerable: true,\n get: function () {\n return _abstract.default;\n }\n });\n Object.defineProperty(exports, 'AbstractApplicationTestCase', {\n enumerable: true,\n get: function () {\n return _abstractApplication.default;\n }\n });\n Object.defineProperty(exports, 'ApplicationTestCase', {\n enumerable: true,\n get: function () {\n return _application.default;\n }\n });\n Object.defineProperty(exports, 'QueryParamTestCase', {\n enumerable: true,\n get: function () {\n return _queryParam.default;\n }\n });\n Object.defineProperty(exports, 'AbstractRenderingTestCase', {\n enumerable: true,\n get: function () {\n return _abstractRendering.default;\n }\n });\n Object.defineProperty(exports, 'RenderingTestCase', {\n enumerable: true,\n get: function () {\n return _rendering.default;\n }\n });\n Object.defineProperty(exports, 'RouterTestCase', {\n enumerable: true,\n get: function () {\n return _router.default;\n }\n });\n Object.defineProperty(exports, 'AutobootApplicationTestCase', {\n enumerable: true,\n get: function () {\n return _autobootApplication.default;\n }\n });\n Object.defineProperty(exports, 'DefaultResolverApplicationTestCase', {\n enumerable: true,\n get: function () {\n return _defaultResolverApplication.default;\n }\n });\n Object.defineProperty(exports, 'TestResolver', {\n enumerable: true,\n get: function () {\n return _testResolver.default;\n }\n });\n Object.defineProperty(exports, 'ModuleBasedTestResolver', {\n enumerable: true,\n get: function () {\n return _testResolver.ModuleBasedResolver;\n }\n });\n Object.defineProperty(exports, 'isIE11', {\n enumerable: true,\n get: function () {\n return _browserDetect.isIE11;\n }\n });\n Object.defineProperty(exports, 'isEdge', {\n enumerable: true,\n get: function () {\n return _browserDetect.isEdge;\n }\n });\n Object.defineProperty(exports, 'verifyInjection', {\n enumerable: true,\n get: function () {\n return _registryCheck.verifyInjection;\n }\n });\n Object.defineProperty(exports, 'verifyRegistration', {\n enumerable: true,\n get: function () {\n return _registryCheck.verifyRegistration;\n }\n });\n});","enifed('internal-test-helpers/lib/apply-mixins', ['exports', '@ember/polyfills', 'internal-test-helpers/lib/get-all-property-names'], function (exports, _polyfills, _getAllPropertyNames) {\n 'use strict';\n\n exports.default = applyMixins;\n\n\n function isGenerator(mixin) {\n return Array.isArray(mixin.cases) && typeof mixin.generate === 'function';\n }\n\n function applyMixins(TestClass, ...mixins) {\n mixins.forEach(mixinOrGenerator => {\n let mixin;\n\n if (isGenerator(mixinOrGenerator)) {\n let generator = mixinOrGenerator;\n mixin = {};\n\n generator.cases.forEach((value, idx) => {\n (0, _polyfills.assign)(mixin, generator.generate(value, idx));\n });\n\n (0, _polyfills.assign)(TestClass.prototype, mixin);\n } else if (typeof mixinOrGenerator === 'function') {\n let properties = (0, _getAllPropertyNames.default)(mixinOrGenerator);\n mixin = new mixinOrGenerator();\n\n properties.forEach(name => {\n TestClass.prototype[name] = function () {\n return mixin[name].apply(mixin, arguments);\n };\n });\n } else {\n mixin = mixinOrGenerator;\n (0, _polyfills.assign)(TestClass.prototype, mixin);\n }\n });\n\n return TestClass;\n }\n});","enifed('internal-test-helpers/lib/browser-detect', ['exports'], function (exports) {\n 'use strict';\n\n // `window.ActiveXObject` is \"falsey\" in IE11 (but not `undefined` or `false`)\n // `\"ActiveXObject\" in window` returns `true` in all IE versions\n // only IE11 will pass _both_ of these conditions\n const isIE11 = exports.isIE11 = !window.ActiveXObject && 'ActiveXObject' in window;\n const isEdge = exports.isEdge = /Edge/.test(navigator.userAgent);\n});","enifed('internal-test-helpers/lib/build-owner', ['exports', '@ember/-internals/container', '@ember/-internals/routing', '@ember/application/instance', '@ember/application', '@ember/-internals/runtime'], function (exports, _container, _routing, _instance, _application, _runtime) {\n 'use strict';\n\n exports.default = buildOwner;\n\n\n class ResolverWrapper {\n constructor(resolver) {\n this.resolver = resolver;\n }\n\n create() {\n return this.resolver;\n }\n }\n\n function buildOwner(options = {}) {\n let ownerOptions = options.ownerOptions || {};\n let resolver = options.resolver;\n let bootOptions = options.bootOptions || {};\n\n let Owner = _runtime.Object.extend(_runtime.RegistryProxyMixin, _runtime.ContainerProxyMixin);\n\n let namespace = _runtime.Object.create({\n Resolver: new ResolverWrapper(resolver)\n });\n\n let fallbackRegistry = _application.default.buildRegistry(namespace);\n fallbackRegistry.register('router:main', _routing.Router);\n\n let registry = new _container.Registry({\n fallback: fallbackRegistry\n });\n\n _instance.default.setupRegistry(registry, bootOptions);\n\n let owner = Owner.create({\n __registry__: registry,\n __container__: null\n }, ownerOptions);\n\n let container = registry.container({ owner });\n owner.__container__ = container;\n\n return owner;\n }\n});","enifed('internal-test-helpers/lib/confirm-export', ['exports', 'require'], function (exports, _require2) {\n 'use strict';\n\n exports.default = confirmExport;\n\n\n function getDescriptor(obj, path) {\n let parts = path.split('.');\n let value = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n let part = parts[i];\n value = value[part];\n if (!value) {\n return undefined;\n }\n }\n let last = parts[parts.length - 1];\n return Object.getOwnPropertyDescriptor(value, last);\n }\n\n function confirmExport(Ember, assert, path, moduleId, exportName) {\n try {\n let desc = getDescriptor(Ember, path);\n assert.ok(desc, `the ${path} property exists on the Ember global`);\n\n if (typeof exportName === 'string') {\n let mod = (0, _require2.default)(moduleId);\n assert.equal(desc.value, mod[exportName], `Ember.${path} is exported correctly`);\n assert.notEqual(mod[exportName], undefined, `Ember.${path} is not \\`undefined\\``);\n } else if ('value' in desc) {\n assert.equal(desc.value, exportName.value, `Ember.${path} is exported correctly`);\n } else {\n let mod = (0, _require2.default)(moduleId);\n assert.equal(desc.get, mod[exportName.get], `Ember.${path} getter is exported correctly`);\n assert.notEqual(desc.get, undefined, `Ember.${path} getter is not undefined`);\n\n if (exportName.set) {\n assert.equal(desc.set, mod[exportName.set], `Ember.${path} setter is exported correctly`);\n assert.notEqual(desc.set, undefined, `Ember.${path} setter is not undefined`);\n }\n }\n } catch (error) {\n assert.pushResult({\n result: false,\n message: `An error occured while testing ${path} is exported from ${moduleId}.`,\n source: error\n });\n }\n }\n});","enifed('internal-test-helpers/lib/ember-dev/assertion', ['exports', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _utils) {\n 'use strict';\n\n const BREAK = {};\n /*\n This assertion class is used to test assertions made using Ember.assert.\n It injects two helpers onto `window`:\n \n - expectAssertion(func: Function, [expectedMessage: String | RegExp])\n \n This function calls `func` and asserts that `Ember.assert` is invoked during\n the execution. Moreover, it takes a String or a RegExp as a second optional\n argument that can be used to test if a specific assertion message was\n generated.\n \n - ignoreAssertion(func: Function)\n \n This function calls `func` and disables `Ember.assert` during the execution.\n In particular, this prevents `Ember.assert` from throw errors that would\n disrupt the control flow.\n */\n class AssertionAssert {\n constructor(env) {\n this.env = env;\n }\n reset() {}\n assert() {}\n inject() {\n let expectAssertion = (func, expectedMessage) => {\n let { assert } = QUnit.config.current;\n if (this.env.runningProdBuild) {\n assert.ok(true, 'Assertions disabled in production builds.');\n return;\n }\n let sawCall = false;\n let actualMessage = undefined;\n // The try-catch statement is used to \"exit\" `func` as soon as\n // the first useful assertion has been produced.\n try {\n (0, _utils.callWithStub)(this.env, 'assert', func, (message, test) => {\n sawCall = true;\n if ((0, _utils.checkTest)(test)) {\n return;\n }\n actualMessage = message;\n throw BREAK;\n });\n } catch (e) {\n if (e !== BREAK) {\n throw e;\n }\n }\n check(assert, sawCall, actualMessage, expectedMessage);\n };\n let ignoreAssertion = func => {\n (0, _utils.callWithStub)(this.env, 'assert', func);\n };\n window.expectAssertion = expectAssertion;\n window.ignoreAssertion = ignoreAssertion;\n }\n restore() {\n window.expectAssertion = null;\n window.ignoreAssertion = null;\n }\n }\n exports.default = AssertionAssert;\n function check(assert, sawCall, actualMessage, expectedMessage) {\n // Run assertions in an order that is useful when debugging a test failure.\n if (!sawCall) {\n assert.ok(false, `Expected Ember.assert to be called (Not called with any value).`);\n } else if (!actualMessage) {\n assert.ok(false, `Expected a failing Ember.assert (Ember.assert called, but without a failing test).`);\n } else {\n if (expectedMessage) {\n if (expectedMessage instanceof RegExp) {\n assert.ok(expectedMessage.test(actualMessage), `Expected failing Ember.assert: '${expectedMessage}', but got '${actualMessage}'.`);\n } else {\n assert.equal(actualMessage, expectedMessage, `Expected failing Ember.assert: '${expectedMessage}', but got '${actualMessage}'.`);\n }\n } else {\n // Positive assertion that assert was called\n assert.ok(true, 'Expected a failing Ember.assert.');\n }\n }\n }\n});","enifed('internal-test-helpers/lib/ember-dev/containers', ['exports', '@ember/-internals/container'], function (exports, _container) {\n 'use strict';\n\n function ContainersAssert(env) {\n this.env = env;\n }\n\n const { _leakTracking: containerLeakTracking } = _container.Container;\n\n ContainersAssert.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n if (containerLeakTracking === undefined) return;\n let { config } = QUnit;\n let { testName, testId, module: { name: moduleName }, finish: originalFinish } = config.current;\n config.current.finish = function () {\n originalFinish.call(this);\n originalFinish = undefined;\n config.queue.unshift(function () {\n if (containerLeakTracking.hasContainers()) {\n containerLeakTracking.reset();\n // eslint-disable-next-line no-console\n console.assert(false, `Leaked container after test ${moduleName}: ${testName} testId=${testId}`);\n }\n });\n };\n },\n restore: function () {}\n };\n\n exports.default = ContainersAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/debug', ['exports', 'internal-test-helpers/lib/ember-dev/method-call-tracker'], function (exports, _methodCallTracker) {\n 'use strict';\n\n class DebugAssert {\n constructor(methodName, env) {\n this.methodName = methodName;\n this.env = env;\n this.tracker = null;\n }\n inject() {}\n restore() {\n this.reset();\n }\n reset() {\n if (this.tracker) {\n this.tracker.restoreMethod();\n }\n this.tracker = null;\n }\n assert() {\n if (this.tracker) {\n this.tracker.assert();\n }\n }\n // Run an expectation callback within the context of a new tracker, optionally\n // accepting a function to run, which asserts immediately\n runExpectation(func, callback) {\n let originalTracker = null;\n // When helpers are passed a callback, they get a new tracker context\n if (func) {\n originalTracker = this.tracker;\n this.tracker = null;\n }\n if (!this.tracker) {\n this.tracker = new _methodCallTracker.default(this.env, this.methodName);\n }\n // Yield to caller with tracker instance\n callback(this.tracker);\n // Once the given callback is invoked, the pending assertions should be\n // flushed immediately\n if (func) {\n func();\n this.assert();\n this.reset();\n this.tracker = originalTracker;\n }\n }\n }\n exports.default = DebugAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/deprecation', ['exports', 'internal-test-helpers/lib/ember-dev/debug', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _debug, _utils) {\n 'use strict';\n\n class DeprecationAssert extends _debug.default {\n constructor(env) {\n super('deprecate', env);\n }\n inject() {\n // Expects no deprecation to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test.\n //\n // expectNoDeprecation(function() {\n // fancyNewThing();\n // });\n //\n // expectNoDeprecation();\n // Ember.deprecate(\"Old And Busted\");\n //\n let expectNoDeprecation = func => {\n if (typeof func !== 'function') {\n func = undefined;\n }\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoDeprecation was called after expectDeprecation was called!');\n }\n tracker.expectNoCalls();\n });\n };\n // Expect a deprecation to happen within a function, or if no function\n // is pass, from the time of calling until the end of the test. Can be called\n // multiple times to assert deprecations with different specific messages\n // were fired.\n //\n // expectDeprecation(function() {\n // Ember.deprecate(\"Old And Busted\");\n // }, /* optionalStringOrRegex */);\n //\n // expectDeprecation(/* optionalStringOrRegex */);\n // Ember.deprecate(\"Old And Busted\");\n //\n let expectDeprecation = (func, message) => {\n let actualFunc;\n if (typeof func !== 'function') {\n message = func;\n actualFunc = undefined;\n } else {\n actualFunc = func;\n }\n this.runExpectation(actualFunc, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectDeprecation was called after expectNoDeprecation was called!');\n }\n tracker.expectCall(message, ['id', 'until']);\n });\n };\n let ignoreDeprecation = func => {\n (0, _utils.callWithStub)(this.env, 'deprecate', func);\n };\n window.expectNoDeprecation = expectNoDeprecation;\n window.expectDeprecation = expectDeprecation;\n window.ignoreDeprecation = ignoreDeprecation;\n }\n restore() {\n super.restore();\n window.expectDeprecation = null;\n window.expectNoDeprecation = null;\n window.ignoreDeprecation = null;\n }\n }\n exports.default = DeprecationAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/index', ['exports', 'internal-test-helpers/lib/ember-dev/deprecation', 'internal-test-helpers/lib/ember-dev/warning', 'internal-test-helpers/lib/ember-dev/assertion', 'internal-test-helpers/lib/ember-dev/run-loop', 'internal-test-helpers/lib/ember-dev/namespaces', 'internal-test-helpers/lib/ember-dev/containers', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _deprecation, _warning, _assertion, _runLoop, _namespaces, _containers, _utils) {\n 'use strict';\n\n var EmberDevTestHelperAssert = (0, _utils.buildCompositeAssert)([_deprecation.default, _warning.default, _assertion.default, _runLoop.default, _namespaces.default, _containers.default]);\n\n exports.default = EmberDevTestHelperAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/method-call-tracker', ['exports', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _utils) {\n 'use strict';\n\n class MethodCallTracker {\n constructor(env, methodName) {\n this._env = env;\n this._methodName = methodName;\n this._isExpectingNoCalls = false;\n this._expectedMessages = [];\n this._expectedOptionLists = [];\n this._actuals = [];\n this._originalMethod = undefined;\n }\n stubMethod() {\n if (this._originalMethod) {\n // Method is already stubbed\n return;\n }\n let env = this._env;\n let methodName = this._methodName;\n this._originalMethod = env.getDebugFunction(methodName);\n env.setDebugFunction(methodName, (message, test, options) => {\n let resultOfTest = (0, _utils.checkTest)(test);\n this._actuals.push([message, resultOfTest, options]);\n });\n }\n restoreMethod() {\n if (this._originalMethod) {\n this._env.setDebugFunction(this._methodName, this._originalMethod);\n }\n }\n expectCall(message, options) {\n this.stubMethod();\n this._expectedMessages.push(message || /.*/);\n this._expectedOptionLists.push(options);\n }\n expectNoCalls() {\n this.stubMethod();\n this._isExpectingNoCalls = true;\n }\n isExpectingNoCalls() {\n return this._isExpectingNoCalls;\n }\n isExpectingCalls() {\n return !this._isExpectingNoCalls && this._expectedMessages.length;\n }\n assert() {\n let { assert } = QUnit.config.current;\n let env = this._env;\n let methodName = this._methodName;\n let isExpectingNoCalls = this._isExpectingNoCalls;\n let expectedMessages = this._expectedMessages;\n let expectedOptionLists = this._expectedOptionLists;\n let actuals = this._actuals;\n let o, i, j;\n if (!isExpectingNoCalls && expectedMessages.length === 0 && actuals.length === 0) {\n return;\n }\n if (env.runningProdBuild) {\n assert.ok(true, `calls to Ember.${methodName} disabled in production builds.`);\n return;\n }\n if (isExpectingNoCalls) {\n let actualMessages = [];\n for (i = 0; i < actuals.length; i++) {\n if (!actuals[i][1]) {\n actualMessages.push(actuals[i][0]);\n }\n }\n assert.ok(actualMessages.length === 0, `Expected no Ember.${methodName} calls, got ${actuals.length}: ${actualMessages.join(', ')}`);\n return;\n }\n let actual;\n let match = undefined;\n for (o = 0; o < expectedMessages.length; o++) {\n const expectedMessage = expectedMessages[o];\n const expectedOptionList = expectedOptionLists[o];\n for (i = 0; i < actuals.length; i++) {\n let matchesMessage = false;\n let matchesOptionList = false;\n actual = actuals[i];\n if (actual[1] === true) {\n continue;\n }\n if (expectedMessage instanceof RegExp && expectedMessage.test(actual[0])) {\n matchesMessage = true;\n } else if (expectedMessage === actual[0]) {\n matchesMessage = true;\n }\n if (expectedOptionList === undefined) {\n matchesOptionList = true;\n } else if (actual[2]) {\n matchesOptionList = true;\n for (j = 0; j < expectedOptionList.length; j++) {\n matchesOptionList = matchesOptionList && actual[2].hasOwnProperty(expectedOptionList[j]);\n }\n }\n if (matchesMessage && matchesOptionList) {\n match = actual;\n break;\n }\n }\n const expectedOptionsMessage = expectedOptionList ? `and options: { ${expectedOptionList.join(', ')} }` : 'and no options';\n const actualOptionsMessage = actual && actual[2] ? `and options: { ${Object.keys(actual[2]).join(', ')} }` : 'and no options';\n if (!actual) {\n assert.ok(false, `Received no Ember.${methodName} calls at all, expecting: ${expectedMessage}`);\n } else if (match && !match[1]) {\n assert.ok(true, `Received failing Ember.${methodName} call with message: ${match[0]}`);\n } else if (match && match[1]) {\n assert.ok(false, `Expected failing Ember.${methodName} call, got succeeding with message: ${match[0]}`);\n } else if (actual[1]) {\n assert.ok(false, `Did not receive failing Ember.${methodName} call matching '${expectedMessage}' ${expectedOptionsMessage}, last was success with '${actual[0]}' ${actualOptionsMessage}`);\n } else if (!actual[1]) {\n assert.ok(false, `Did not receive failing Ember.${methodName} call matching '${expectedMessage}' ${expectedOptionsMessage}, last was failure with '${actual[0]}' ${actualOptionsMessage}`);\n }\n }\n }\n }\n exports.default = MethodCallTracker;\n});","enifed('internal-test-helpers/lib/ember-dev/namespaces', ['exports', '@ember/runloop', '@ember/-internals/metal'], function (exports, _runloop, _metal) {\n 'use strict';\n\n function NamespacesAssert(env) {\n this.env = env;\n }\n\n NamespacesAssert.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n let { assert } = QUnit.config.current;\n\n if (_metal.NAMESPACES.length > 0) {\n assert.ok(false, 'Should not have any NAMESPACES after tests');\n (0, _runloop.run)(() => {\n let namespaces = _metal.NAMESPACES.slice();\n for (let i = 0; i < namespaces.length; i++) {\n namespaces[i].destroy();\n }\n });\n }\n let keys = Object.keys(_metal.NAMESPACES_BY_ID);\n if (keys.length > 0) {\n assert.ok(false, 'Should not have any NAMESPACES_BY_ID after tests');\n for (let i = 0; i < keys.length; i++) {\n delete _metal.NAMESPACES_BY_ID[keys[i]];\n }\n }\n },\n restore: function () {}\n };\n\n exports.default = NamespacesAssert;\n});","enifed('internal-test-helpers/lib/ember-dev/run-loop', ['exports', '@ember/runloop'], function (exports, _runloop) {\n 'use strict';\n\n function RunLoopAssertion(env) {\n this.env = env;\n }\n\n RunLoopAssertion.prototype = {\n reset: function () {},\n inject: function () {},\n assert: function () {\n let { assert } = QUnit.config.current;\n\n if ((0, _runloop.getCurrentRunLoop)()) {\n assert.ok(false, 'Should not be in a run loop at end of test');\n while ((0, _runloop.getCurrentRunLoop)()) {\n (0, _runloop.end)();\n }\n }\n\n if ((0, _runloop.hasScheduledTimers)()) {\n assert.ok(false, 'Ember run should not have scheduled timers at end of test');\n (0, _runloop.cancelTimers)();\n }\n },\n restore: function () {}\n };\n\n exports.default = RunLoopAssertion;\n});","enifed(\"internal-test-helpers/lib/ember-dev/setup-qunit\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = setupQUnit;\n function setupQUnit(assertion, _qunitGlobal) {\n let qunitGlobal = QUnit;\n if (_qunitGlobal) {\n qunitGlobal = _qunitGlobal;\n }\n let originalModule = qunitGlobal.module;\n qunitGlobal.module = function (name, _options) {\n let options = _options || {};\n let originalSetup = options.setup || options.beforeEach || function () {};\n let originalTeardown = options.teardown || options.afterEach || function () {};\n delete options.setup;\n delete options.teardown;\n options.beforeEach = function () {\n assertion.reset();\n assertion.inject();\n return originalSetup.apply(this, arguments);\n };\n options.afterEach = function () {\n let result = originalTeardown.apply(this, arguments);\n assertion.assert();\n assertion.restore();\n return result;\n };\n return originalModule(name, options);\n };\n }\n});","enifed('internal-test-helpers/lib/ember-dev/utils', ['exports'], function (exports) {\n 'use strict';\n\n exports.buildCompositeAssert = buildCompositeAssert;\n exports.callWithStub = callWithStub;\n exports.checkTest = checkTest;\n function callForEach(prop, func) {\n return function () {\n for (let i = 0, l = this[prop].length; i < l; i++) {\n this[prop][i][func]();\n }\n };\n }\n function buildCompositeAssert(assertClasses) {\n function Composite(env) {\n this.asserts = assertClasses.map(Assert => new Assert(env));\n }\n Composite.prototype = {\n reset: callForEach('asserts', 'reset'),\n inject: callForEach('asserts', 'inject'),\n assert: callForEach('asserts', 'assert'),\n restore: callForEach('asserts', 'restore')\n };\n return Composite;\n }\n function noop() {}\n function callWithStub(env, name, func, debugStub = noop) {\n let originalFunc = env.getDebugFunction(name);\n try {\n env.setDebugFunction(name, debugStub);\n func();\n } finally {\n env.setDebugFunction(name, originalFunc);\n }\n }\n function checkTest(test) {\n return typeof test === 'function' ? test() : test;\n }\n});","enifed('internal-test-helpers/lib/ember-dev/warning', ['exports', 'internal-test-helpers/lib/ember-dev/debug', 'internal-test-helpers/lib/ember-dev/utils'], function (exports, _debug, _utils) {\n 'use strict';\n\n class WarningAssert extends _debug.default {\n constructor(env) {\n super('warn', env);\n }\n inject() {\n // Expects no warning to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test.\n //\n // expectNoWarning(function() {\n // fancyNewThing();\n // });\n //\n // expectNoWarning();\n // Ember.warn(\"Oh snap, didn't expect that\");\n //\n let expectNoWarning = func => {\n if (typeof func !== 'function') {\n func = undefined;\n }\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoWarning was called after expectWarning was called!');\n }\n tracker.expectNoCalls();\n });\n };\n // Expect a warning to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test. Can be called\n // multiple times to assert warnings with different specific messages\n // happened.\n //\n // expectWarning(function() {\n // Ember.warn(\"Times they are a-changin'\");\n // }, /* optionalStringOrRegex */);\n //\n // expectWarning(/* optionalStringOrRegex */);\n // Ember.warn(\"Times definitely be changin'\");\n //\n let expectWarning = (func, message) => {\n let actualFunc;\n if (typeof func !== 'function') {\n message = func;\n actualFunc = undefined;\n } else {\n actualFunc = func;\n }\n this.runExpectation(actualFunc, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectWarning was called after expectNoWarning was called!');\n }\n tracker.expectCall(message);\n });\n };\n let ignoreWarning = func => {\n (0, _utils.callWithStub)(this.env, 'warn', func);\n };\n window.expectNoWarning = expectNoWarning;\n window.expectWarning = expectWarning;\n window.ignoreWarning = ignoreWarning;\n }\n restore() {\n super.restore();\n window.expectWarning = null;\n window.expectNoWarning = null;\n window.ignoreWarning = null;\n }\n }\n exports.default = WarningAssert;\n});","enifed('internal-test-helpers/lib/equal-inner-html', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = equalInnerHTML;\n // detect side-effects of cloning svg elements in IE9-11\n let ieSVGInnerHTML = (() => {\n if (!document.createElementNS) {\n return false;\n }\n let div = document.createElement('div');\n let node = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n div.appendChild(node);\n let clone = div.cloneNode(true);\n return clone.innerHTML === '';\n })();\n\n function normalizeInnerHTML(actualHTML) {\n if (ieSVGInnerHTML) {\n // Replace `` with ``, etc.\n // drop namespace attribute\n // replace self-closing elements\n actualHTML = actualHTML.replace(/ xmlns=\"[^\"]+\"/, '').replace(/<([^ >]+) [^\\/>]*\\/>/gi, (tag, tagName) => `${tag.slice(0, tag.length - 3)}>`);\n }\n\n return actualHTML;\n }\n\n function equalInnerHTML(assert, fragment, html) {\n let actualHTML = normalizeInnerHTML(fragment.innerHTML);\n\n assert.pushResult({\n result: actualHTML === html,\n actual: actualHTML,\n expected: html\n });\n }\n});","enifed('internal-test-helpers/lib/equal-tokens', ['exports', 'simple-html-tokenizer'], function (exports, _simpleHtmlTokenizer) {\n 'use strict';\n\n exports.default = equalTokens;\n\n\n function generateTokens(containerOrHTML) {\n if (typeof containerOrHTML === 'string') {\n return {\n tokens: (0, _simpleHtmlTokenizer.tokenize)(containerOrHTML),\n html: containerOrHTML\n };\n } else {\n return {\n tokens: (0, _simpleHtmlTokenizer.tokenize)(containerOrHTML.innerHTML),\n html: containerOrHTML.innerHTML\n };\n }\n }\n\n function normalizeTokens(tokens) {\n tokens.forEach(token => {\n if (token.type === 'StartTag') {\n token.attributes = token.attributes.sort((a, b) => {\n if (a[0] > b[0]) {\n return 1;\n }\n if (a[0] < b[0]) {\n return -1;\n }\n return 0;\n });\n }\n });\n }\n\n function equalTokens(actualContainer, expectedHTML, message = null) {\n let actual = generateTokens(actualContainer);\n let expected = generateTokens(expectedHTML);\n\n normalizeTokens(actual.tokens);\n normalizeTokens(expected.tokens);\n\n let { assert } = QUnit.config.current;\n let equiv = QUnit.equiv(actual.tokens, expected.tokens);\n\n if (equiv && expected.html !== actual.html) {\n assert.deepEqual(actual.tokens, expected.tokens, message);\n } else {\n assert.pushResult({\n result: QUnit.equiv(actual.tokens, expected.tokens),\n actual: actual.html,\n expected: expected.html,\n message\n });\n }\n }\n});","enifed('internal-test-helpers/lib/factory', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = factory;\n function setProperties(object, properties) {\n for (let key in properties) {\n if (properties.hasOwnProperty(key)) {\n object[key] = properties[key];\n }\n }\n }\n\n let guids = 0;\n\n function factory() {\n /*jshint validthis: true */\n\n function Klass(options) {\n setProperties(this, options);\n this._guid = guids++;\n this.isDestroyed = false;\n }\n\n Klass.prototype.constructor = Klass;\n Klass.prototype.destroy = function () {\n this.isDestroyed = true;\n };\n\n Klass.prototype.toString = function () {\n return '';\n };\n\n Klass.create = create;\n Klass.extend = extend;\n Klass.reopen = extend;\n Klass.reopenClass = reopenClass;\n\n return Klass;\n\n function create(options) {\n return new this.prototype.constructor(options);\n }\n\n function reopenClass(options) {\n setProperties(this, options);\n }\n\n function extend(options) {\n function Child(options) {\n Klass.call(this, options);\n }\n\n let Parent = this;\n\n Child.prototype = new Parent();\n Child.prototype.constructor = Child;\n\n setProperties(Child, Klass);\n setProperties(Child.prototype, options);\n\n Child.create = create;\n Child.extend = extend;\n Child.reopen = extend;\n\n Child.reopenClass = reopenClass;\n\n return Child;\n }\n }\n});","enifed(\"internal-test-helpers/lib/get-all-property-names\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = getAllPropertyNames;\n function getAllPropertyNames(Klass) {\n let proto = Klass.prototype;\n let properties = new Set();\n\n while (proto !== Object.prototype) {\n let names = Object.getOwnPropertyNames(proto);\n names.forEach(name => properties.add(name));\n proto = Object.getPrototypeOf(proto);\n }\n\n return properties;\n }\n});","enifed(\"internal-test-helpers/lib/get-text-of\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = getTextOf;\n function getTextOf(elem) {\n return elem.textContent.trim();\n }\n});","enifed('internal-test-helpers/lib/matchers', ['exports'], function (exports) {\n 'use strict';\n\n exports.regex = regex;\n exports.classes = classes;\n exports.styles = styles;\n exports.equalsElement = equalsElement;\n const HTMLElement = window.HTMLElement;\n const MATCHER_BRAND = '3d4ef194-13be-4ccf-8dc7-862eea02c93e';\n\n function isMatcher(obj) {\n return typeof obj === 'object' && obj !== null && MATCHER_BRAND in obj;\n }\n\n function equalsAttr(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n return expected === actual;\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should equal ${this.expected()}`;\n }\n };\n }\n\n function regex(r) {\n return {\n [MATCHER_BRAND]: true,\n\n match(v) {\n return r.test(v);\n },\n\n expected() {\n return r.toString();\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n };\n }\n\n function classes(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n actual = actual.trim();\n return actual && expected.split(/\\s+/).sort().join(' ') === actual.trim().split(/\\s+/).sort().join(' ');\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n };\n }\n\n function styles(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n // coerce `null` or `undefined` to an empty string\n // needed for matching empty styles on IE9 - IE11\n actual = actual || '';\n actual = actual.trim();\n\n return expected.split(';').map(s => s.trim()).filter(s => s).sort().join('; ') === actual.split(';').map(s => s.trim()).filter(s => s).sort().join('; ');\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n };\n }\n\n function equalsElement(assert, element, tagName, attributes, content) {\n assert.pushResult({\n result: element.tagName === tagName.toUpperCase(),\n actual: element.tagName.toLowerCase(),\n expected: tagName,\n message: `expect tagName to be ${tagName}`\n });\n\n let expectedAttrs = {};\n let expectedCount = 0;\n\n for (let name in attributes) {\n let expected = attributes[name];\n if (expected !== null) {\n expectedCount++;\n }\n\n let matcher = isMatcher(expected) ? expected : equalsAttr(expected);\n\n expectedAttrs[name] = matcher;\n\n assert.pushResult({\n result: expectedAttrs[name].match(element.getAttribute(name)),\n actual: element.getAttribute(name),\n expected: matcher.expected(),\n message: `Element's ${name} attribute ${matcher.message()}`\n });\n }\n\n let actualAttributes = {};\n\n for (let i = 0, l = element.attributes.length; i < l; i++) {\n actualAttributes[element.attributes[i].name] = element.attributes[i].value;\n }\n\n if (!(element instanceof HTMLElement)) {\n assert.pushResult({\n result: element instanceof HTMLElement,\n message: 'Element must be an HTML Element, not an SVG Element'\n });\n } else {\n assert.pushResult({\n result: element.attributes.length === expectedCount || !attributes,\n actual: element.attributes.length,\n expected: expectedCount,\n message: `Expected ${expectedCount} attributes; got ${element.outerHTML}`\n });\n\n if (content !== null) {\n assert.pushResult({\n result: element.innerHTML === content,\n actual: element.innerHTML,\n expected: content,\n message: `The element had '${content}' as its content`\n });\n }\n }\n }\n});","enifed('internal-test-helpers/lib/module-for', ['exports', '@ember/canary-features', 'internal-test-helpers/lib/apply-mixins', 'internal-test-helpers/lib/get-all-property-names', 'rsvp'], function (exports, _canaryFeatures, _applyMixins, _getAllPropertyNames, _rsvp) {\n 'use strict';\n\n exports.default = moduleFor;\n function moduleFor(description, TestClass, ...mixins) {\n QUnit.module(description, {\n beforeEach: function (...args) {\n let instance = new TestClass(...args);\n this.instance = instance;\n if (instance.beforeEach) {\n return instance.beforeEach(...args);\n }\n },\n\n afterEach: function () {\n let promises = [];\n let instance = this.instance;\n this.instance = null;\n if (instance.teardown) {\n promises.push(instance.teardown());\n }\n if (instance.afterEach) {\n promises.push(instance.afterEach());\n }\n\n // this seems odd, but actually saves significant time\n // in the test suite\n //\n // returning a promise from a QUnit test always adds a 13ms\n // delay to the test, this filtering prevents returning a\n // promise when it is not needed\n //\n // Remove after we can update to QUnit that includes\n // https://github.com/qunitjs/qunit/pull/1246\n let filteredPromises = promises.filter(Boolean);\n if (filteredPromises.length > 0) {\n return (0, _rsvp.all)(filteredPromises);\n }\n }\n });\n\n if (mixins.length > 0) {\n (0, _applyMixins.default)(TestClass, ...mixins);\n }\n\n let properties = (0, _getAllPropertyNames.default)(TestClass);\n properties.forEach(generateTest);\n\n function shouldTest(features) {\n return features.every(feature => {\n if (feature[0] === '!' && (0, _canaryFeatures.isEnabled)(feature.slice(1))) {\n return false;\n } else if (!(0, _canaryFeatures.isEnabled)(feature)) {\n return false;\n } else {\n return true;\n }\n });\n }\n\n function generateTest(name) {\n if (name.indexOf('@test ') === 0) {\n QUnit.test(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else if (name.indexOf('@only ') === 0) {\n QUnit.only(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else if (name.indexOf('@skip ') === 0) {\n QUnit.skip(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else {\n let match = /^@feature\\(([A-Z_a-z-!]+)\\) /.exec(name);\n\n if (match) {\n let features = match[1].replace(/ /g, '').split(',');\n\n if (shouldTest(features)) {\n QUnit.test(name.slice(match[0].length), function (assert) {\n return this.instance[name](assert);\n });\n }\n }\n }\n }\n }\n});","enifed('internal-test-helpers/lib/registry-check', ['exports'], function (exports) {\n 'use strict';\n\n exports.verifyRegistration = verifyRegistration;\n exports.verifyInjection = verifyInjection;\n function verifyRegistration(assert, owner, fullName) {\n assert.ok(owner.resolveRegistration(fullName), `has registration: ${fullName}`);\n }\n\n function verifyInjection(assert, owner, fullName, property, injectionName) {\n let registry = owner.__registry__;\n let injections;\n\n if (fullName.indexOf(':') === -1) {\n injections = registry.getTypeInjections(fullName);\n } else {\n injections = registry.getInjections(registry.normalize(fullName));\n }\n\n let normalizedName = registry.normalize(injectionName);\n let hasInjection = false;\n let injection;\n\n for (let i = 0, l = injections.length; i < l; i++) {\n injection = injections[i];\n if (injection.property === property && injection.specifier === normalizedName) {\n hasInjection = true;\n break;\n }\n }\n\n assert.ok(hasInjection, `has injection: ${fullName}.${property} = ${injectionName}`);\n }\n});","enifed('internal-test-helpers/lib/run', ['exports', '@ember/runloop'], function (exports, _runloop) {\n 'use strict';\n\n exports.runAppend = runAppend;\n exports.runDestroy = runDestroy;\n function runAppend(view) {\n (0, _runloop.run)(view, 'appendTo', document.getElementById('qunit-fixture'));\n }\n\n function runDestroy(toDestroy) {\n if (toDestroy) {\n (0, _runloop.run)(toDestroy, 'destroy');\n }\n }\n});","enifed('internal-test-helpers/lib/strip', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = strip;\n function strip([...strings], ...values) {\n let str = strings.map((string, index) => {\n let interpolated = values[index];\n return string + (interpolated !== undefined ? interpolated : '');\n }).join('');\n return str.split('\\n').map(s => s.trim()).join('');\n }\n});","enifed('internal-test-helpers/lib/system/synthetic-events', ['exports', '@ember/runloop', '@ember/polyfills'], function (exports, _runloop, _polyfills) {\n 'use strict';\n\n exports.elMatches = undefined;\n exports.matches = matches;\n exports.click = click;\n exports.focus = focus;\n exports.blur = blur;\n exports.fireEvent = fireEvent;\n\n\n const DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };\n /* globals Element */\n\n const KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];\n const MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n\n const elMatches = exports.elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);\n\n function matches(el, selector) {\n return elMatches.call(el, selector);\n }\n\n function isFocusable(el) {\n let focusableTags = ['INPUT', 'BUTTON', 'LINK', 'SELECT', 'A', 'TEXTAREA'];\n let { tagName, type } = el;\n\n if (type === 'hidden') {\n return false;\n }\n\n return focusableTags.indexOf(tagName) > -1 || el.contentEditable === 'true';\n }\n\n function click(el, options = {}) {\n (0, _runloop.run)(() => fireEvent(el, 'mousedown', options));\n focus(el);\n (0, _runloop.run)(() => fireEvent(el, 'mouseup', options));\n (0, _runloop.run)(() => fireEvent(el, 'click', options));\n }\n\n function focus(el) {\n if (!el) {\n return;\n }\n if (isFocusable(el)) {\n (0, _runloop.run)(null, function () {\n let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document doesn't have focus just\n // use trigger('focusin') instead.\n if (browserIsNotFocused) {\n fireEvent(el, 'focusin');\n }\n\n // makes `document.activeElement` be `el`. If the browser is focused, it also fires a focus event\n el.focus();\n\n // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it\n if (browserIsNotFocused) {\n fireEvent(el, 'focus');\n }\n });\n }\n }\n\n function blur(el) {\n if (isFocusable(el)) {\n (0, _runloop.run)(null, function () {\n let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n fireEvent(el, 'focusout');\n\n // makes `document.activeElement` be `body`.\n // If the browser is focused, it also fires a blur event\n el.blur();\n\n // Chrome/Firefox does not trigger the `blur` event if the window\n // does not have focus. If the document does not have focus then\n // fire `blur` event via native event.\n if (browserIsNotFocused) {\n fireEvent(el, 'blur');\n }\n });\n }\n }\n\n function fireEvent(element, type, options = {}) {\n if (!element) {\n return;\n }\n let event;\n if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {\n let rect = element.getBoundingClientRect();\n let x = rect.left + 1;\n let y = rect.top + 1;\n let simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, (0, _polyfills.assign)(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n element.dispatchEvent(event);\n\n return event;\n }\n\n function buildBasicEvent(type, options = {}) {\n let event = document.createEvent('Events');\n event.initEvent(type, true, true);\n (0, _polyfills.assign)(event, options);\n return event;\n }\n\n function buildMouseEvent(type, options = {}) {\n let event;\n try {\n event = document.createEvent('MouseEvents');\n let eventOpts = (0, _polyfills.assign)({}, DEFAULT_EVENT_OPTIONS, options);\n\n event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n\n function buildKeyboardEvent(type, options = {}) {\n let event;\n try {\n event = document.createEvent('KeyEvents');\n let eventOpts = (0, _polyfills.assign)({}, DEFAULT_EVENT_OPTIONS, options);\n event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n});","enifed('internal-test-helpers/lib/test-cases/abstract-application', ['exports', 'ember-template-compiler', '@ember/-internals/environment', 'internal-test-helpers/lib/test-cases/abstract', 'internal-test-helpers/lib/run'], function (exports, _emberTemplateCompiler, _environment, _abstract, _run) {\n 'use strict';\n\n class AbstractApplicationTestCase extends _abstract.default {\n _ensureInstance(bootOptions) {\n if (this._applicationInstancePromise) {\n return this._applicationInstancePromise;\n }\n\n return this._applicationInstancePromise = this.runTask(() => this.application.boot()).then(app => {\n this.applicationInstance = app.buildInstance();\n\n return this.applicationInstance.boot(bootOptions);\n });\n }\n\n visit(url, options) {\n // TODO: THIS IS HORRIBLE\n // the promise returned by `ApplicationInstance.protoype.visit` does **not**\n // currently guarantee rendering is completed\n return this.runTask(() => {\n return this._ensureInstance(options).then(instance => instance.visit(url));\n });\n }\n\n get element() {\n if (this._element) {\n return this._element;\n } else if (_environment.ENV._APPLICATION_TEMPLATE_WRAPPER) {\n return this._element = document.querySelector('#qunit-fixture > div.ember-view');\n } else {\n return this._element = document.querySelector('#qunit-fixture');\n }\n }\n\n set element(element) {\n this._element = element;\n }\n\n afterEach() {\n (0, _run.runDestroy)(this.applicationInstance);\n (0, _run.runDestroy)(this.application);\n\n super.teardown();\n }\n\n get applicationOptions() {\n return {\n rootElement: '#qunit-fixture'\n };\n }\n\n get routerOptions() {\n return {\n location: 'none'\n };\n }\n\n get router() {\n return this.application.resolveRegistration('router:main');\n }\n\n compile() /* string, options */{\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n }\n exports.default = AbstractApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/abstract-rendering', ['exports', '@ember/polyfills', 'ember-template-compiler', '@ember/-internals/views', '@ember/-internals/glimmer', 'internal-test-helpers/lib/test-resolver', 'internal-test-helpers/lib/test-cases/abstract', 'internal-test-helpers/lib/build-owner', 'internal-test-helpers/lib/run'], function (exports, _polyfills, _emberTemplateCompiler, _views, _glimmer, _testResolver, _abstract, _buildOwner, _run) {\n 'use strict';\n\n const TextNode = window.Text;\n\n class AbstractRenderingTestCase extends _abstract.default {\n constructor() {\n super(...arguments);\n let bootOptions = this.getBootOptions();\n\n let owner = this.owner = (0, _buildOwner.default)({\n ownerOptions: this.getOwnerOptions(),\n resolver: this.getResolver(),\n bootOptions\n });\n\n this.renderer = this.owner.lookup('renderer:-dom');\n this.element = document.querySelector('#qunit-fixture');\n this.component = null;\n\n owner.register('event_dispatcher:main', _views.EventDispatcher);\n owner.inject('event_dispatcher:main', '_viewRegistry', '-view-registry:main');\n if (!bootOptions || bootOptions.isInteractive !== false) {\n owner.lookup('event_dispatcher:main').setup(this.getCustomDispatcherEvents(), this.element);\n }\n }\n\n compile() {\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n\n getCustomDispatcherEvents() {\n return {};\n }\n\n getOwnerOptions() {}\n getBootOptions() {}\n\n get resolver() {\n return this.owner.__registry__.fallback.resolver;\n }\n\n getResolver() {\n return new _testResolver.ModuleBasedResolver();\n }\n\n add(specifier, factory) {\n this.resolver.add(specifier, factory);\n }\n\n addTemplate(templateName, templateString) {\n if (typeof templateName === 'string') {\n this.resolver.add(`template:${templateName}`, this.compile(templateString, {\n moduleName: templateName\n }));\n } else {\n this.resolver.add(templateName, this.compile(templateString, {\n moduleName: templateName.moduleName\n }));\n }\n }\n\n addComponent(name, { ComponentClass = null, template = null }) {\n if (ComponentClass) {\n this.resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n this.resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `components/${name}`\n }));\n }\n }\n\n afterEach() {\n try {\n if (this.component) {\n (0, _run.runDestroy)(this.component);\n }\n if (this.owner) {\n (0, _run.runDestroy)(this.owner);\n }\n } finally {\n (0, _glimmer._resetRenderers)();\n }\n }\n\n get context() {\n return this.component;\n }\n\n render(templateStr, context = {}) {\n let { owner } = this;\n\n owner.register('template:-top-level', this.compile(templateStr, {\n moduleName: '-top-level'\n }));\n\n let attrs = (0, _polyfills.assign)({}, context, {\n tagName: '',\n layoutName: '-top-level'\n });\n\n owner.register('component:-top-level', _glimmer.Component.extend(attrs));\n\n this.component = owner.lookup('component:-top-level');\n\n (0, _run.runAppend)(this.component);\n }\n\n rerender() {\n this.component.rerender();\n }\n\n registerHelper(name, funcOrClassBody) {\n let type = typeof funcOrClassBody;\n\n if (type === 'function') {\n this.owner.register(`helper:${name}`, (0, _glimmer.helper)(funcOrClassBody));\n } else if (type === 'object' && type !== null) {\n this.owner.register(`helper:${name}`, _glimmer.Helper.extend(funcOrClassBody));\n } else {\n throw new Error(`Cannot register ${funcOrClassBody} as a helper`);\n }\n }\n\n registerPartial(name, template) {\n let owner = this.env.owner || this.owner;\n if (typeof template === 'string') {\n owner.register(`template:${name}`, this.compile(template, { moduleName: `my-app/templates/-${name}.hbs` }));\n }\n }\n\n registerComponent(name, { ComponentClass = _glimmer.Component, template = null }) {\n let { owner } = this;\n\n if (ComponentClass) {\n owner.register(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n owner.register(`template:components/${name}`, this.compile(template, {\n moduleName: `my-app/templates/components/${name}.hbs`\n }));\n }\n }\n\n registerComponentManager(name, manager) {\n let owner = this.env.owner || this.owner;\n owner.register(`component-manager:${name}`, manager);\n }\n\n registerTemplate(name, template) {\n let { owner } = this;\n if (typeof template === 'string') {\n owner.register(`template:${name}`, this.compile(template, {\n moduleName: `my-app/templates/${name}.hbs`\n }));\n } else {\n throw new Error(`Registered template \"${name}\" must be a string`);\n }\n }\n\n registerService(name, klass) {\n this.owner.register(`service:${name}`, klass);\n }\n\n assertTextNode(node, text) {\n if (!(node instanceof TextNode)) {\n throw new Error(`Expecting a text node, but got ${node}`);\n }\n\n this.assert.strictEqual(node.textContent, text, 'node.textContent');\n }\n }\n exports.default = AbstractRenderingTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/abstract', ['exports', '@ember/polyfills', '@ember/runloop', 'internal-test-helpers/lib/test-cases/node-query', 'internal-test-helpers/lib/equal-inner-html', 'internal-test-helpers/lib/equal-tokens', 'internal-test-helpers/lib/matchers', 'rsvp'], function (exports, _polyfills, _runloop, _nodeQuery, _equalInnerHtml, _equalTokens, _matchers, _rsvp) {\n 'use strict';\n\n const TextNode = window.Text; /* global Element */\n\n const HTMLElement = window.HTMLElement;\n const Comment = window.Comment;\n\n function isMarker(node) {\n if (node instanceof Comment && node.textContent === '') {\n return true;\n }\n\n if (node instanceof TextNode && node.textContent === '') {\n return true;\n }\n\n return false;\n }\n\n class AbstractTestCase {\n constructor(assert) {\n this.element = null;\n this.snapshot = null;\n this.assert = assert;\n\n let { fixture } = this;\n if (fixture) {\n this.setupFixture(fixture);\n }\n }\n\n teardown() {}\n afterEach() {}\n\n runTask(callback) {\n return (0, _runloop.run)(callback);\n }\n\n runTaskNext() {\n return new _rsvp.Promise(resolve => {\n return (0, _runloop.next)(resolve);\n });\n }\n\n setupFixture(innerHTML) {\n let fixture = document.getElementById('qunit-fixture');\n fixture.innerHTML = innerHTML;\n }\n\n // The following methods require `this.element` to work\n\n get firstChild() {\n return this.nthChild(0);\n }\n\n nthChild(n) {\n let i = 0;\n let node = this.element.firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n i++;\n }\n\n if (i > n) {\n break;\n } else {\n node = node.nextSibling;\n }\n }\n\n return node;\n }\n\n get nodesCount() {\n let count = 0;\n let node = this.element.firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n count++;\n }\n\n node = node.nextSibling;\n }\n\n return count;\n }\n\n $(sel) {\n if (sel instanceof Element) {\n return _nodeQuery.default.element(sel);\n } else if (typeof sel === 'string') {\n return _nodeQuery.default.query(sel, this.element);\n } else if (sel !== undefined) {\n throw new Error(`Invalid this.$(${sel})`);\n } else {\n return _nodeQuery.default.element(this.element);\n }\n }\n\n wrap(element) {\n return _nodeQuery.default.element(element);\n }\n\n click(selector) {\n let element;\n if (typeof selector === 'string') {\n element = this.element.querySelector(selector);\n } else {\n element = selector;\n }\n\n let event = element.click();\n\n return this.runLoopSettled(event);\n }\n\n // TODO: Find a better name 😎\n runLoopSettled(value) {\n return new _rsvp.Promise(function (resolve) {\n // Every 5ms, poll for the async thing to have finished\n let watcher = setInterval(() => {\n // If there are scheduled timers or we are inside of a run loop, keep polling\n if ((0, _runloop.hasScheduledTimers)() || (0, _runloop.getCurrentRunLoop)()) {\n return;\n }\n\n // Stop polling\n clearInterval(watcher);\n\n // Synchronously resolve the promise\n resolve(value);\n }, 5);\n });\n }\n\n textValue() {\n return this.element.textContent;\n }\n\n takeSnapshot() {\n let snapshot = this.snapshot = [];\n\n let node = this.element.firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n snapshot.push(node);\n }\n\n node = node.nextSibling;\n }\n\n return snapshot;\n }\n\n assertText(text) {\n this.assert.strictEqual(this.textValue(), text, `#qunit-fixture content should be: \\`${text}\\``);\n }\n\n assertInnerHTML(html) {\n (0, _equalInnerHtml.default)(this.assert, this.element, html);\n }\n\n assertHTML(html) {\n (0, _equalTokens.default)(this.element, html, `#qunit-fixture content should be: \\`${html}\\``);\n }\n\n assertElement(node, { ElementType = HTMLElement, tagName, attrs = null, content = null }) {\n if (!(node instanceof ElementType)) {\n throw new Error(`Expecting a ${ElementType.name}, but got ${node}`);\n }\n\n (0, _matchers.equalsElement)(this.assert, node, tagName, attrs, content);\n }\n\n assertComponentElement(node, { ElementType = HTMLElement, tagName = 'div', attrs = null, content = null }) {\n attrs = (0, _polyfills.assign)({}, { id: (0, _matchers.regex)(/^ember\\d*$/), class: (0, _matchers.classes)('ember-view') }, attrs || {});\n this.assertElement(node, { ElementType, tagName, attrs, content });\n }\n\n assertSameNode(actual, expected) {\n this.assert.strictEqual(actual, expected, 'DOM node stability');\n }\n\n assertInvariants(oldSnapshot, newSnapshot) {\n oldSnapshot = oldSnapshot || this.snapshot;\n newSnapshot = newSnapshot || this.takeSnapshot();\n\n this.assert.strictEqual(newSnapshot.length, oldSnapshot.length, 'Same number of nodes');\n\n for (let i = 0; i < oldSnapshot.length; i++) {\n this.assertSameNode(newSnapshot[i], oldSnapshot[i]);\n }\n }\n\n assertPartialInvariants(start, end) {\n this.assertInvariants(this.snapshot, this.takeSnapshot().slice(start, end));\n }\n\n assertStableRerender() {\n this.takeSnapshot();\n this.runTask(() => this.rerender());\n this.assertInvariants();\n }\n }\n exports.default = AbstractTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/application', ['exports', 'internal-test-helpers/lib/test-cases/test-resolver-application', '@ember/application', '@ember/-internals/routing', '@ember/polyfills'], function (exports, _testResolverApplication, _application, _routing, _polyfills) {\n 'use strict';\n\n class ApplicationTestCase extends _testResolverApplication.default {\n constructor() {\n super(...arguments);\n\n let { applicationOptions } = this;\n this.application = this.runTask(this.createApplication.bind(this, applicationOptions));\n\n this.resolver = this.application.__registry__.resolver;\n\n if (this.resolver) {\n this.resolver.add('router:main', _routing.Router.extend(this.routerOptions));\n }\n }\n\n createApplication(myOptions = {}, MyApplication = _application.default) {\n return MyApplication.create(myOptions);\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n autoboot: false\n });\n }\n\n get appRouter() {\n return this.applicationInstance.lookup('router:main');\n }\n\n transitionTo() {\n return this.runTask(() => {\n return this.appRouter.transitionTo(...arguments);\n });\n }\n }\n exports.default = ApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/autoboot-application', ['exports', 'internal-test-helpers/lib/test-cases/test-resolver-application', '@ember/application', '@ember/polyfills', '@ember/-internals/routing'], function (exports, _testResolverApplication, _application, _polyfills, _routing) {\n 'use strict';\n\n class AutobootApplicationTestCase extends _testResolverApplication.default {\n createApplication(options, MyApplication = _application.default) {\n let myOptions = (0, _polyfills.assign)(this.applicationOptions, options);\n let application = this.application = MyApplication.create(myOptions);\n this.resolver = application.__registry__.resolver;\n\n if (this.resolver) {\n this.resolver.add('router:main', _routing.Router.extend(this.routerOptions));\n }\n\n return application;\n }\n\n visit(url) {\n return this.application.boot().then(() => {\n return this.applicationInstance.visit(url);\n });\n }\n\n get applicationInstance() {\n let { application } = this;\n\n if (!application) {\n return undefined;\n }\n\n return application.__deprecatedInstance__;\n }\n }\n exports.default = AutobootApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/default-resolver-application', ['exports', 'internal-test-helpers/lib/test-cases/abstract-application', '@ember/application/globals-resolver', '@ember/application', '@ember/-internals/glimmer', '@ember/polyfills', '@ember/-internals/routing'], function (exports, _abstractApplication, _globalsResolver, _application, _glimmer, _polyfills, _routing) {\n 'use strict';\n\n class ApplicationTestCase extends _abstractApplication.default {\n createApplication() {\n let application = this.application = _application.default.create(this.applicationOptions);\n application.Router = _routing.Router.extend(this.routerOptions);\n return application;\n }\n\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n name: 'TestApp',\n autoboot: false,\n Resolver: _globalsResolver.default\n });\n }\n\n afterEach() {\n (0, _glimmer.setTemplates)({});\n return super.afterEach();\n }\n\n get appRouter() {\n return this.applicationInstance.lookup('router:main');\n }\n\n transitionTo() {\n return this.runTask(() => {\n return this.appRouter.transitionTo(...arguments);\n });\n }\n\n addTemplate(name, templateString) {\n let compiled = this.compile(templateString);\n (0, _glimmer.setTemplate)(name, compiled);\n return compiled;\n }\n }\n exports.default = ApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/node-query', ['exports', '@ember/debug', 'internal-test-helpers/lib/system/synthetic-events'], function (exports, _debug, _syntheticEvents) {\n 'use strict';\n\n /* global Node */\n\n class NodeQuery {\n static query(selector, context = document) {\n true && !(context && context instanceof Node) && (0, _debug.assert)(`Invalid second parameter to NodeQuery.query`, context && context instanceof Node);\n\n return new NodeQuery(toArray(context.querySelectorAll(selector)));\n }\n\n static element(element) {\n return new NodeQuery([element]);\n }\n\n constructor(nodes) {\n true && !Array.isArray(nodes) && (0, _debug.assert)('NodeQuery must be initialized with a literal array', Array.isArray(nodes));\n\n this.nodes = nodes;\n\n for (let i = 0; i < nodes.length; i++) {\n this[i] = nodes[i];\n }\n\n this.length = nodes.length;\n\n Object.freeze(this);\n }\n\n find(selector) {\n assertSingle(this);\n\n return this[0].querySelector(selector);\n }\n\n findAll(selector) {\n let nodes = [];\n\n this.nodes.forEach(node => {\n nodes.push(...node.querySelectorAll(selector));\n });\n\n return new NodeQuery(nodes);\n }\n\n trigger(eventName, options) {\n return this.nodes.map(node => (0, _syntheticEvents.fireEvent)(node, eventName, options));\n }\n\n click() {\n return this.trigger('click');\n }\n\n focus() {\n this.nodes.forEach(_syntheticEvents.focus);\n }\n\n text() {\n return this.nodes.map(node => node.textContent).join('');\n }\n\n attr(name) {\n if (arguments.length !== 1) {\n throw new Error('not implemented');\n }\n\n assertSingle(this);\n\n return this.nodes[0].getAttribute(name);\n }\n\n prop(name, value) {\n if (arguments.length > 1) {\n return this.setProp(name, value);\n }\n\n assertSingle(this);\n\n return this.nodes[0][name];\n }\n\n setProp(name, value) {\n this.nodes.forEach(node => node[name] = value);\n\n return this;\n }\n\n val(value) {\n if (arguments.length === 1) {\n return this.setProp('value', value);\n }\n\n return this.prop('value');\n }\n\n is(selector) {\n return this.nodes.every(node => (0, _syntheticEvents.matches)(node, selector));\n }\n\n hasClass(className) {\n return this.is(`.${className}`);\n }\n }\n\n exports.default = NodeQuery;\n function assertSingle(nodeQuery) {\n if (nodeQuery.length !== 1) {\n throw new Error(`attr(name) called on a NodeQuery with ${this.nodes.length} elements. Expected one element.`);\n }\n }\n\n function toArray(nodes) {\n let out = [];\n\n for (let i = 0; i < nodes.length; i++) {\n out.push(nodes[i]);\n }\n\n return out;\n }\n});","enifed('internal-test-helpers/lib/test-cases/query-param', ['exports', '@ember/controller', '@ember/-internals/routing', '@ember/runloop', 'internal-test-helpers/lib/test-cases/application'], function (exports, _controller, _routing, _runloop, _application) {\n 'use strict';\n\n class QueryParamTestCase extends _application.default {\n constructor() {\n super(...arguments);\n\n let testCase = this;\n testCase.expectedPushURL = null;\n testCase.expectedReplaceURL = null;\n\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n if (testCase.expectedReplaceURL) {\n testCase.assert.ok(false, 'pushState occurred but a replaceState was expected');\n }\n\n if (testCase.expectedPushURL) {\n testCase.assert.equal(path, testCase.expectedPushURL, 'an expected pushState occurred');\n testCase.expectedPushURL = null;\n }\n\n this.set('path', path);\n },\n\n replaceURL(path) {\n if (testCase.expectedPushURL) {\n testCase.assert.ok(false, 'replaceState occurred but a pushState was expected');\n }\n\n if (testCase.expectedReplaceURL) {\n testCase.assert.equal(path, testCase.expectedReplaceURL, 'an expected replaceState occurred');\n testCase.expectedReplaceURL = null;\n }\n\n this.set('path', path);\n }\n }));\n }\n\n visitAndAssert(path) {\n return this.visit(...arguments).then(() => {\n this.assertCurrentPath(path);\n });\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n getRoute(name) {\n return this.applicationInstance.lookup(`route:${name}`);\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n setAndFlush(obj, prop, value) {\n return (0, _runloop.run)(obj, 'set', prop, value);\n }\n\n assertCurrentPath(path, message = `current path equals '${path}'`) {\n this.assert.equal(this.appRouter.get('location.path'), path, message);\n }\n\n /**\n Sets up a Controller for a given route with a single query param and default\n value. Can optionally extend the controller with an object.\n @public\n @method setSingleQPController\n */\n setSingleQPController(routeName, param = 'foo', defaultValue = 'bar', options = {}) {\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: [param],\n [param]: defaultValue\n }, options));\n }\n\n /**\n Sets up a Controller for a given route with a custom property/url key mapping.\n @public\n @method setMappedQPController\n */\n setMappedQPController(routeName, prop = 'page', urlKey = 'parentPage', defaultValue = 1, options = {}) {\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: {\n [prop]: urlKey\n },\n [prop]: defaultValue\n }, options));\n }\n }\n exports.default = QueryParamTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/rendering', ['exports', 'internal-test-helpers/lib/test-cases/abstract-rendering', '@ember/-internals/container'], function (exports, _abstractRendering, _container) {\n 'use strict';\n\n class RenderingTestCase extends _abstractRendering.default {\n constructor() {\n super(...arguments);\n let { owner } = this;\n\n this.env = owner.lookup('service:-glimmer-environment');\n this.templateOptions = owner.lookup(_container.privatize`template-compiler:main`);\n this.compileTimeLookup = this.templateOptions.resolver;\n this.runtimeResolver = this.compileTimeLookup.resolver;\n }\n }\n exports.default = RenderingTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/router', ['exports', 'internal-test-helpers/lib/test-cases/application'], function (exports, _application) {\n 'use strict';\n\n class RouterTestCase extends _application.default {\n constructor() {\n super(...arguments);\n\n this.router.map(function () {\n this.route('parent', { path: '/' }, function () {\n this.route('child');\n this.route('sister');\n this.route('brother');\n });\n this.route('dynamic', { path: '/dynamic/:dynamic_id' });\n this.route('dynamicWithChild', { path: '/dynamic-with-child/:dynamic_id' }, function () {\n this.route('child', { path: '/:child_id' });\n });\n });\n }\n\n get routerService() {\n return this.applicationInstance.lookup('service:router');\n }\n\n buildQueryParams(queryParams) {\n return {\n queryParams\n };\n }\n }\n exports.default = RouterTestCase;\n});","enifed('internal-test-helpers/lib/test-cases/test-resolver-application', ['exports', 'internal-test-helpers/lib/test-cases/abstract-application', 'internal-test-helpers/lib/test-resolver', '@ember/-internals/glimmer', '@ember/polyfills'], function (exports, _abstractApplication, _testResolver, _glimmer, _polyfills) {\n 'use strict';\n\n class TestResolverApplicationTestCase extends _abstractApplication.default {\n get applicationOptions() {\n return (0, _polyfills.assign)(super.applicationOptions, {\n Resolver: _testResolver.ModuleBasedResolver\n });\n }\n\n add(specifier, factory) {\n this.resolver.add(specifier, factory);\n }\n\n addTemplate(templateName, templateString) {\n this.resolver.add(`template:${templateName}`, this.compile(templateString, {\n moduleName: `my-app/templates/${templateName}.hbs`\n }));\n }\n\n addComponent(name, { ComponentClass = _glimmer.Component, template = null }) {\n if (ComponentClass) {\n this.resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n this.resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `my-app/templates/components/${name}.hbs`\n }));\n }\n }\n }\n exports.default = TestResolverApplicationTestCase;\n});","enifed('internal-test-helpers/lib/test-resolver', ['exports', 'ember-template-compiler'], function (exports, _emberTemplateCompiler) {\n 'use strict';\n\n exports.ModuleBasedResolver = undefined;\n\n\n const DELIMITER = '%';\n\n function serializeKey(specifier, source, namespace) {\n let [type, name] = specifier.split(':');\n return `${type}://${[name, namespace ? '[source invalid due to namespace]' : source, namespace].join(DELIMITER)}`;\n }\n\n class Resolver {\n constructor() {\n this._registered = {};\n }\n resolve(specifier) {\n return this._registered[specifier] || this._registered[serializeKey(specifier)];\n }\n expandLocalLookup(specifier, source, namespace) {\n if (specifier.indexOf('://') !== -1) {\n return specifier; // an already expanded specifier\n }\n\n if (source || namespace) {\n let key = serializeKey(specifier, source, namespace);\n if (this._registered[key]) {\n return key; // like local lookup\n }\n\n key = serializeKey(specifier);\n if (this._registered[key]) {\n return specifier; // top level resolution despite source/namespace\n }\n }\n\n return specifier; // didn't know how to expand it\n }\n add(lookup, factory) {\n let key;\n switch (typeof lookup) {\n case 'string':\n if (lookup.indexOf(':') === -1) {\n throw new Error('Specifiers added to the resolver must be in the format of type:name');\n }\n key = serializeKey(lookup);\n break;\n case 'object':\n key = serializeKey(lookup.specifier, lookup.source, lookup.namespace);\n break;\n default:\n throw new Error('Specifier string has an unknown type');\n }\n\n return this._registered[key] = factory;\n }\n addTemplate(templateName, template) {\n let templateType = typeof template;\n if (templateType !== 'string') {\n throw new Error(`You called addTemplate for \"${templateName}\" with a template argument of type of '${templateType}'. addTemplate expects an argument of an uncompiled template as a string.`);\n }\n return this._registered[serializeKey(`template:${templateName}`)] = (0, _emberTemplateCompiler.compile)(template, {\n moduleName: `my-app/templates/${templateName}.hbs`\n });\n }\n static create() {\n return new this();\n }\n }\n\n exports.default = Resolver;\n\n\n /*\n * A resolver with moduleBasedResolver = true handles error and loading\n * substates differently than a standard resolver.\n */\n class ModuleBasedResolver extends Resolver {\n get moduleBasedResolver() {\n return true;\n }\n }\n\n exports.ModuleBasedResolver = ModuleBasedResolver;\n});","enifed('internal-test-helpers/tests/index-test', ['internal-test-helpers'], function (_internalTestHelpers) {\n 'use strict';\n\n (0, _internalTestHelpers.moduleFor)('internal-test-helpers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test module present'](assert) {\n assert.ok(true, 'each package needs at least one test to be able to run through `npm test`');\n }\n });\n});","/*global enifed, module */\nenifed('node-module', ['exports'], function(_exports) {\n var IS_NODE = typeof module === 'object' && typeof module.require === 'function';\n if (IS_NODE) {\n _exports.require = module.require;\n _exports.module = module;\n _exports.IS_NODE = IS_NODE;\n } else {\n _exports.require = null;\n _exports.module = null;\n _exports.IS_NODE = IS_NODE;\n }\n});\n"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC72BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACh8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC97CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7mCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3qCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC19CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7vBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChmCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9zBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACleA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1iDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvyGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1zCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;","file":"ember-tests.js"}