-// Knockout JavaScript library v2.0.0\r
+// Knockout JavaScript library v2.1.0pre\r
// (c) Steven Sanderson - http://knockoutjs.com/\r
// License: MIT (http://www.opensource.org/licenses/mit-license.php)\r
\r
-(function(window,undefined){ \r
-var ko = window["ko"] = {};\r
+(function(window,document,navigator,undefined){ \r
+!function(factory) {\r
+ // Support AMD where available and opted in via define.amd.ko\r
+ if (typeof define === 'function' && define['amd'] && define['amd']['ko']) {\r
+ // Register as an AMD anonymous module\r
+ define(['exports'], factory);\r
+ } else {\r
+ // AMD not in use (e.g., when referenced via aplain <script> tag) - put ko directly in global namespace\r
+ factory(window['ko'] = {});\r
+ }\r
+}(function(koExports){\r
+// Internally, all KO objects are attached to koExports (even the non-exported ones whose names will be minified by the closure compiler).\r
+// In the future, the following "ko" variable may be made distinct from "koExports" so that private objects are not externally reachable.\r
+var ko = typeof koExports !== 'undefined' ? koExports : {};\r
// Google Closure Compiler helpers (used only to make the minified file smaller)\r
-ko.exportSymbol = function(publicPath, object) {\r
- var tokens = publicPath.split(".");\r
- var target = window;\r
+ko.exportSymbol = function(koPath, object) {\r
+ var tokens = koPath.split(".");\r
+ \r
+ // In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable)\r
+ // At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko)\r
+ var target = ko;\r
+\r
for (var i = 0; i < tokens.length - 1; i++)\r
target = target[tokens[i]];\r
target[tokens[tokens.length - 1]] = object;\r
ko.exportProperty = function(owner, publicName, object) {\r
owner[publicName] = object;\r
};\r
+\r
ko.utils = new (function () {\r
var stringTrimRegex = /^(\s|\u00A0)+|(\s|\u00A0)+$/g;\r
\r
return string.substring(0, startsWith.length) === startsWith;\r
},\r
\r
- evalWithinScope: function (expression /*, scope1, scope2, scope3... */) {\r
+ buildEvalWithinScopeFunction: function (expression, scopeLevels) {\r
// Build the source for a function that evaluates "expression"\r
// For each scope variable, add an extra level of "with" nesting\r
// Example result: with(sc[1]) { with(sc[0]) { return (expression) } }\r
- var scopes = Array.prototype.slice.call(arguments, 1);\r
var functionBody = "return (" + expression + ")";\r
- for (var i = 0; i < scopes.length; i++) {\r
- if (scopes[i] && typeof scopes[i] == "object")\r
- functionBody = "with(sc[" + i + "]) { " + functionBody + " } ";\r
+ for (var i = 0; i < scopeLevels; i++) {\r
+ functionBody = "with(sc[" + i + "]) { " + functionBody + " } ";\r
}\r
- return (new Function("sc", functionBody))(scopes);\r
+ return new Function("sc", functionBody);\r
},\r
\r
domNodeIsContainedBy: function (node, containedByNode) {\r
\r
if (ieVersion >= 9) {\r
// Believe it or not, this actually fixes an IE9 rendering bug. Insane. https://github.com/SteveSanderson/knockout/issues/209\r
- element.innerHTML = element.innerHTML;\r
+ element.style.display = element.style.display;\r
}\r
},\r
\r
}\r
})();\r
\r
-ko.exportSymbol('ko.utils', ko.utils);\r
-ko.utils.arrayForEach([\r
- ['arrayForEach', ko.utils.arrayForEach],\r
- ['arrayFirst', ko.utils.arrayFirst],\r
- ['arrayFilter', ko.utils.arrayFilter],\r
- ['arrayGetDistinctValues', ko.utils.arrayGetDistinctValues],\r
- ['arrayIndexOf', ko.utils.arrayIndexOf],\r
- ['arrayMap', ko.utils.arrayMap],\r
- ['arrayPushAll', ko.utils.arrayPushAll],\r
- ['arrayRemoveItem', ko.utils.arrayRemoveItem],\r
- ['extend', ko.utils.extend],\r
- ['fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost],\r
- ['getFormFields', ko.utils.getFormFields],\r
- ['postJson', ko.utils.postJson],\r
- ['parseJson', ko.utils.parseJson],\r
- ['registerEventHandler', ko.utils.registerEventHandler],\r
- ['stringifyJson', ko.utils.stringifyJson],\r
- ['range', ko.utils.range],\r
- ['toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass],\r
- ['triggerEvent', ko.utils.triggerEvent],\r
- ['unwrapObservable', ko.utils.unwrapObservable]\r
-], function(item) {\r
- ko.exportSymbol('ko.utils.' + item[0], item[1]);\r
-});\r
+ko.exportSymbol('utils', ko.utils);\r
+ko.exportSymbol('utils.arrayForEach', ko.utils.arrayForEach);\r
+ko.exportSymbol('utils.arrayFirst', ko.utils.arrayFirst);\r
+ko.exportSymbol('utils.arrayFilter', ko.utils.arrayFilter);\r
+ko.exportSymbol('utils.arrayGetDistinctValues', ko.utils.arrayGetDistinctValues);\r
+ko.exportSymbol('utils.arrayIndexOf', ko.utils.arrayIndexOf);\r
+ko.exportSymbol('utils.arrayMap', ko.utils.arrayMap);\r
+ko.exportSymbol('utils.arrayPushAll', ko.utils.arrayPushAll);\r
+ko.exportSymbol('utils.arrayRemoveItem', ko.utils.arrayRemoveItem);\r
+ko.exportSymbol('utils.extend', ko.utils.extend);\r
+ko.exportSymbol('utils.fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost);\r
+ko.exportSymbol('utils.getFormFields', ko.utils.getFormFields);\r
+ko.exportSymbol('utils.postJson', ko.utils.postJson);\r
+ko.exportSymbol('utils.parseJson', ko.utils.parseJson);\r
+ko.exportSymbol('utils.registerEventHandler', ko.utils.registerEventHandler);\r
+ko.exportSymbol('utils.stringifyJson', ko.utils.stringifyJson);\r
+ko.exportSymbol('utils.range', ko.utils.range);\r
+ko.exportSymbol('utils.toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass);\r
+ko.exportSymbol('utils.triggerEvent', ko.utils.triggerEvent);\r
+ko.exportSymbol('utils.unwrapObservable', ko.utils.unwrapObservable);\r
\r
if (!Function.prototype['bind']) {\r
// Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)\r
}; \r
};\r
}\r
+\r
ko.utils.domData = new (function () {\r
var uniqueId = 0;\r
var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime();\r
}\r
})();\r
\r
-ko.exportSymbol('ko.utils.domData', ko.utils.domData);\r
-ko.exportSymbol('ko.utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully\r
+ko.exportSymbol('utils.domData', ko.utils.domData);\r
+ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully\r
ko.utils.domNodeDisposal = new (function () {\r
var domDataKey = "__ko_domNodeDisposal__" + (new Date).getTime();\r
\r
})();\r
ko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience\r
ko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience\r
-ko.exportSymbol('ko.cleanNode', ko.cleanNode); \r
-ko.exportSymbol('ko.removeNode', ko.removeNode);\r
-ko.exportSymbol('ko.utils.domNodeDisposal', ko.utils.domNodeDisposal);\r
-ko.exportSymbol('ko.utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);\r
-ko.exportSymbol('ko.utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);(function () {\r
+ko.exportSymbol('cleanNode', ko.cleanNode); \r
+ko.exportSymbol('removeNode', ko.removeNode);\r
+ko.exportSymbol('utils.domNodeDisposal', ko.utils.domNodeDisposal);\r
+ko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback);\r
+ko.exportSymbol('utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);(function () {\r
var leadingCommentRegex = /^(\s*)<!--(.*?)-->/;\r
\r
function simpleHtmlParse(html) {\r
};\r
})();\r
\r
-ko.exportSymbol('ko.utils.parseHtmlFragment', ko.utils.parseHtmlFragment);\r
-ko.exportSymbol('ko.utils.setHtml', ko.utils.setHtml);\r
+ko.exportSymbol('utils.parseHtmlFragment', ko.utils.parseHtmlFragment);\r
+ko.exportSymbol('utils.setHtml', ko.utils.setHtml);\r
+\r
ko.memoization = (function () {\r
var memos = {};\r
\r
};\r
})();\r
\r
-ko.exportSymbol('ko.memoization', ko.memoization);\r
-ko.exportSymbol('ko.memoization.memoize', ko.memoization.memoize);\r
-ko.exportSymbol('ko.memoization.unmemoize', ko.memoization.unmemoize);\r
-ko.exportSymbol('ko.memoization.parseMemoText', ko.memoization.parseMemoText);\r
-ko.exportSymbol('ko.memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);\r
+ko.exportSymbol('memoization', ko.memoization);\r
+ko.exportSymbol('memoization.memoize', ko.memoization.memoize);\r
+ko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);\r
+ko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);\r
+ko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);\r
ko.extenders = {\r
'throttle': function(target, timeout) {\r
// Throttling means two things:\r
return target;\r
}\r
\r
-ko.exportSymbol('ko.extenders', ko.extenders);\r
+ko.exportSymbol('extenders', ko.extenders);\r
+\r
ko.subscription = function (callback, disposeCallback) {\r
this.callback = callback;\r
this.disposeCallback = disposeCallback;\r
return typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function";\r
};\r
\r
-ko.exportSymbol('ko.subscribable', ko.subscribable);\r
-ko.exportSymbol('ko.isSubscribable', ko.isSubscribable);\r
+ko.exportSymbol('subscribable', ko.subscribable);\r
+ko.exportSymbol('isSubscribable', ko.isSubscribable);\r
\r
ko.dependencyDetection = (function () {\r
var _frames = [];\r
}\r
\r
\r
-ko.exportSymbol('ko.observable', ko.observable);\r
-ko.exportSymbol('ko.isObservable', ko.isObservable);\r
-ko.exportSymbol('ko.isWriteableObservable', ko.isWriteableObservable);\r
+ko.exportSymbol('observable', ko.observable);\r
+ko.exportSymbol('isObservable', ko.isObservable);\r
+ko.exportSymbol('isWriteableObservable', ko.isWriteableObservable);\r
ko.observableArray = function (initialValues) {\r
if (arguments.length == 0) {\r
// Zero-parameter constructor initializes to empty array\r
\r
// Populate ko.observableArray.fn with read/write functions from native arrays\r
ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) {\r
- ko.observableArray['fn'][methodName] = function () {\r
+ ko.observableArray['fn'][methodName] = function () { \r
var underlyingArray = this();\r
this.valueWillMutate();\r
var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments);\r
};\r
});\r
\r
-ko.exportSymbol('ko.observableArray', ko.observableArray);\r
+ko.exportSymbol('observableArray', ko.observableArray);\r
function prepareOptions(evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) {\r
if (evaluatorFunctionOrOptions && typeof evaluatorFunctionOrOptions == "object") {\r
// Single-parameter syntax - everything is on this "options" param\r
\r
ko.dependentObservable.__ko_proto__ = ko.observable;\r
\r
-ko.exportSymbol('ko.dependentObservable', ko.dependentObservable);\r
-ko.exportSymbol('ko.computed', ko.dependentObservable); // Make "ko.computed" an alias for "ko.dependentObservable"\r
+ko.exportSymbol('dependentObservable', ko.dependentObservable);\r
+ko.exportSymbol('computed', ko.dependentObservable); // Make "ko.computed" an alias for "ko.dependentObservable"\r
+\r
(function() { \r
var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle)\r
\r
};\r
})();\r
\r
-ko.exportSymbol('ko.toJS', ko.toJS);\r
-ko.exportSymbol('ko.toJSON', ko.toJSON);(function () {\r
+ko.exportSymbol('toJS', ko.toJS);\r
+ko.exportSymbol('toJSON', ko.toJSON);(function () {\r
var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';\r
\r
// Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values\r
}; \r
})();\r
\r
-ko.exportSymbol('ko.selectExtensions', ko.selectExtensions);\r
-ko.exportSymbol('ko.selectExtensions.readValue', ko.selectExtensions.readValue);\r
-ko.exportSymbol('ko.selectExtensions.writeValue', ko.selectExtensions.writeValue);\r
+ko.exportSymbol('selectExtensions', ko.selectExtensions);\r
+ko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);\r
+ko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);\r
\r
ko.jsonExpressionRewriting = (function () {\r
var restoreCapturedTokensRegex = /\@ko_token_(\d+)\@/g;\r
};\r
})();\r
\r
-ko.exportSymbol('ko.jsonExpressionRewriting', ko.jsonExpressionRewriting);\r
-ko.exportSymbol('ko.jsonExpressionRewriting.bindingRewriteValidators', ko.jsonExpressionRewriting.bindingRewriteValidators);\r
-ko.exportSymbol('ko.jsonExpressionRewriting.parseObjectLiteral', ko.jsonExpressionRewriting.parseObjectLiteral);\r
-ko.exportSymbol('ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson);\r
+ko.exportSymbol('jsonExpressionRewriting', ko.jsonExpressionRewriting);\r
+ko.exportSymbol('jsonExpressionRewriting.bindingRewriteValidators', ko.jsonExpressionRewriting.bindingRewriteValidators);\r
+ko.exportSymbol('jsonExpressionRewriting.parseObjectLiteral', ko.jsonExpressionRewriting.parseObjectLiteral);\r
+ko.exportSymbol('jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson);\r
(function() {\r
// "Virtual elements" is an abstraction on top of the usual DOM API which understands the notion that comment nodes\r
// may be used to represent hierarchy (in addition to the DOM's natural hierarchy). \r
(function() {\r
var defaultBindingAttributeName = "data-bind";\r
\r
- ko.bindingProvider = function() { };\r
+ ko.bindingProvider = function() {\r
+ this.bindingCache = {};\r
+ };\r
\r
ko.utils.extend(ko.bindingProvider.prototype, {\r
'nodeHasBindings': function(node) {\r
// It's not part of the interface definition for a general binding provider.\r
'parseBindingsString': function(bindingsString, bindingContext) {\r
try {\r
- var viewModel = bindingContext['$data'];\r
- var rewrittenBindings = " { " + ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson(bindingsString) + " } ";\r
- return ko.utils.evalWithinScope(rewrittenBindings, viewModel === null ? window : viewModel, bindingContext);\r
+ var viewModel = bindingContext['$data'],\r
+ scopes = (typeof viewModel == 'object' && viewModel != null) ? [viewModel, bindingContext] : [bindingContext],\r
+ bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, scopes.length, this.bindingCache);\r
+ return bindingFunction(scopes);\r
} catch (ex) {\r
throw new Error("Unable to parse bindings.\nMessage: " + ex + ";\nBindings value: " + bindingsString);\r
} \r
});\r
\r
ko.bindingProvider['instance'] = new ko.bindingProvider();\r
+\r
+ function createBindingsStringEvaluatorViaCache(bindingsString, scopesCount, cache) {\r
+ var cacheKey = scopesCount + '_' + bindingsString;\r
+ return cache[cacheKey] \r
+ || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, scopesCount));\r
+ }\r
+\r
+ function createBindingsStringEvaluator(bindingsString, scopesCount) {\r
+ var rewrittenBindings = " { " + ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson(bindingsString) + " } ";\r
+ return ko.utils.buildEvalWithinScopeFunction(rewrittenBindings, scopesCount);\r
+ } \r
})();\r
\r
-ko.exportSymbol('ko.bindingProvider', ko.bindingProvider);(function () {\r
+ko.exportSymbol('bindingProvider', ko.bindingProvider);\r
+(function () {\r
ko.bindingHandlers = {};\r
\r
ko.bindingContext = function(dataItem, parentBindingContext) {\r
return context ? context['$data'] : undefined;\r
}; \r
\r
- ko.exportSymbol('ko.bindingHandlers', ko.bindingHandlers);\r
- ko.exportSymbol('ko.applyBindings', ko.applyBindings);\r
- ko.exportSymbol('ko.applyBindingsToDescendants', ko.applyBindingsToDescendants);\r
- ko.exportSymbol('ko.applyBindingsToNode', ko.applyBindingsToNode);\r
- ko.exportSymbol('ko.contextFor', ko.contextFor);\r
- ko.exportSymbol('ko.dataFor', ko.dataFor);\r
+ ko.exportSymbol('bindingHandlers', ko.bindingHandlers);\r
+ ko.exportSymbol('applyBindings', ko.applyBindings);\r
+ ko.exportSymbol('applyBindingsToDescendants', ko.applyBindingsToDescendants);\r
+ ko.exportSymbol('applyBindingsToNode', ko.applyBindingsToNode);\r
+ ko.exportSymbol('contextFor', ko.contextFor);\r
+ ko.exportSymbol('dataFor', ko.dataFor);\r
})();// For certain common events (currently just 'click'), allow a simplified data-binding syntax\r
// e.g. click:handler instead of the usual full-length event:{click:handler}\r
var eventHandlersWithShortcuts = ['click'];\r
};\r
ko.jsonExpressionRewriting.bindingRewriteValidators['foreach'] = false; // Can't rewrite control flow bindings\r
ko.virtualElements.allowedBindings['foreach'] = true;\r
-ko.exportSymbol('ko.allowedVirtualElementBindings', ko.virtualElements.allowedBindings);// If you want to make a custom template engine,\r
+ko.exportSymbol('allowedVirtualElementBindings', ko.virtualElements.allowedBindings);\r
+// If you want to make a custom template engine,\r
// \r
// [1] Inherit from this class (like ko.nativeTemplateEngine does)\r
// [2] Override 'renderTemplateSource', supplying a function with this signature:\r
}\r
};\r
\r
-ko.exportSymbol('ko.templateEngine', ko.templateEngine);\r
+ko.exportSymbol('templateEngine', ko.templateEngine);\r
+\r
ko.templateRewriting = (function () {\r
var memoizeDataBindingAttributeSyntaxRegex = /(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi;\r
var memoizeVirtualContainerBindingSyntaxRegex = /<!--\s*ko\b\s*([\s\S]*?)\s*-->/g;\r
}\r
})();\r
\r
-ko.exportSymbol('ko.templateRewriting', ko.templateRewriting);\r
-ko.exportSymbol('ko.templateRewriting.applyMemoizedBindingsToNextSibling', ko.templateRewriting.applyMemoizedBindingsToNextSibling); // Exported only because it has to be referenced by string lookup from within rewritten template\r
+ko.exportSymbol('templateRewriting', ko.templateRewriting);\r
+ko.exportSymbol('templateRewriting.applyMemoizedBindingsToNextSibling', ko.templateRewriting.applyMemoizedBindingsToNextSibling); // Exported only because it has to be referenced by string lookup from within rewritten template\r
(function() { \r
// A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving\r
// logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.)\r
}\r
};\r
\r
- ko.exportSymbol('ko.templateSources', ko.templateSources);\r
- ko.exportSymbol('ko.templateSources.domElement', ko.templateSources.domElement);\r
- ko.exportSymbol('ko.templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);\r
+ ko.exportSymbol('templateSources', ko.templateSources);\r
+ ko.exportSymbol('templateSources.domElement', ko.templateSources.domElement);\r
+ ko.exportSymbol('templateSources.anonymousTemplate', ko.templateSources.anonymousTemplate);\r
})();\r
(function () {\r
var _templateEngine;\r
ko.virtualElements.allowedBindings['template'] = true;\r
})();\r
\r
-ko.exportSymbol('ko.setTemplateEngine', ko.setTemplateEngine);\r
-ko.exportSymbol('ko.renderTemplate', ko.renderTemplate);\r
+ko.exportSymbol('setTemplateEngine', ko.setTemplateEngine);\r
+ko.exportSymbol('renderTemplate', ko.renderTemplate);\r
+\r
(function () {\r
// Simple calculation based on Levenshtein distance.\r
function calculateEditDistanceMatrix(oldArray, newArray, maxAllowedDistance) {\r
}; \r
})();\r
\r
-ko.exportSymbol('ko.utils.compareArrays', ko.utils.compareArrays);\r
+ko.exportSymbol('utils.compareArrays', ko.utils.compareArrays);\r
\r
(function () {\r
// Objective:\r
}\r
})();\r
\r
-ko.exportSymbol('ko.utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);\r
+ko.exportSymbol('utils.setDomNodeChildrenFromArrayMapping', ko.utils.setDomNodeChildrenFromArrayMapping);\r
ko.nativeTemplateEngine = function () {\r
this['allowTemplateRewriting'] = false;\r
}\r
ko.nativeTemplateEngine.instance = new ko.nativeTemplateEngine();\r
ko.setTemplateEngine(ko.nativeTemplateEngine.instance);\r
\r
-ko.exportSymbol('ko.nativeTemplateEngine', ko.nativeTemplateEngine);(function() {\r
+ko.exportSymbol('nativeTemplateEngine', ko.nativeTemplateEngine);(function() {\r
ko.jqueryTmplTemplateEngine = function () {\r
// Detect which version of jquery-tmpl you're using. Unfortunately jquery-tmpl \r
// doesn't expose a version number, so we have to infer it.\r
if (jqueryTmplTemplateEngineInstance.jQueryTmplVersion > 0)\r
ko.setTemplateEngine(jqueryTmplTemplateEngineInstance);\r
\r
- ko.exportSymbol('ko.jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);\r
-})();})(window); \r
+ ko.exportSymbol('jqueryTmplTemplateEngine', ko.jqueryTmplTemplateEngine);\r
+})();});\r
+})(window,document,navigator);
\ No newline at end of file