Use JavaScript Optional chaining in vendors/*

This commit is contained in:
the-djmaze 2022-09-12 22:07:51 +02:00
parent e5e4675c1b
commit ef8b1f40e4
28 changed files with 619 additions and 750 deletions

View file

@ -5,7 +5,9 @@
*/
(doc => {
const setFocus = element => element.focus ? element.focus() : element.setActive();
const
setFocus = element => element.focus ? element.focus() : element.setActive(),
isArrow = e => 'ArrowUp' === e.key || 'ArrowDown' === e.key;
this.BSN = {
Dropdown: function(toggleBtn) {
@ -13,11 +15,11 @@
const self = this,
parent = toggleBtn.parentNode,
preventEmptyAnchor = e => {
const t = e.target, href = t.href || (t.parentNode && t.parentNode.href);
(href && href.slice(-1) === '#') && e.preventDefault();
const t = e.target;
('#' === (t.href || t.parentNode?.href)?.slice(-1)) && e.preventDefault();
},
open = bool => {
menu && menu.classList.toggle('show', bool);
menu?.classList.toggle('show', bool);
parent.classList.toggle('show', bool);
toggleBtn.setAttribute('aria-expanded', bool);
toggleBtn.open = bool;
@ -28,14 +30,14 @@
}
},
toggleEvents = () => {
let action = (toggleBtn.open ? 'add' : 'remove') + 'EventListener';
const action = (toggleBtn.open ? 'add' : 'remove') + 'EventListener';
doc[action]('click',dismissHandler);
doc[action]('keydown',preventScroll);
doc[action]('keyup',keyHandler);
doc[action]('focus',dismissHandler);
},
dismissHandler = e => {
let eventTarget = e.target;
const eventTarget = e.target;
if ((!menu.contains(eventTarget) && !toggleBtn.contains(eventTarget)) || e.type !== 'focus') {
self.hide();
preventEmptyAnchor(e);
@ -45,18 +47,19 @@
self.show();
preventEmptyAnchor(e);
},
preventScroll = e => (e.key === 'ArrowUp' || e.key === 'ArrowDown') && e.preventDefault(),
preventScroll = e => isArrow(e) && e.preventDefault(),
keyHandler = e => {
if (e.key === 'Escape') {
if ('Escape' === e.key) {
self.toggle();
} else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
} else if (isArrow(e)) {
let activeItem = doc.activeElement,
isMenuButton = activeItem === toggleBtn,
idx = isMenuButton ? 0 : menuItems.indexOf(activeItem);
if (parent.contains(activeItem)) {
if (!isMenuButton) {
idx = e.key === 'ArrowUp' ? (idx > 1 ? idx-1 : 0)
: e.key === 'ArrowDown' ? (idx < menuItems.length-1 ? idx+1 : idx) : idx;
idx = 'ArrowUp' === e.key
? (idx > 1 ? idx-1 : 0)
: (idx < menuItems.length-1 ? idx+1 : idx);
}
menuItems[idx] && setFocus(menuItems[idx]);
} else {

6
vendors/jua/jua.js vendored
View file

@ -10,7 +10,7 @@
*/
getDataFromFiles = (aItems, fFileCallback, iLimit, fLimitCallback) =>
{
if (aItems && aItems.length)
if (aItems?.length)
{
let
oFile,
@ -261,7 +261,7 @@
*/
runEvent(sName, ...aArgs)
{
this.oEvents[sName] && this.oEvents[sName].apply(null, aArgs);
this.oEvents[sName]?.apply(null, aArgs);
}
/**
@ -392,7 +392,7 @@
self.generateNewInput(oClickElement);
}, 10);
};
if (oInput.files && oInput.files.length) {
if (oInput.files?.length) {
getDataFromFiles(oInput.files, fFileCallback,
limit,
self.getEvent('onLimitReached')

View file

@ -63,8 +63,8 @@ module.exports = function(grunt) {
function buildMin(output, done) {
var cc = require('closure-compiler');
var options = {
language_in:'ECMASCRIPT_2018',
language_out:'ECMASCRIPT_2018',
language_in:'ECMASCRIPT_2020',
language_out:'ECMASCRIPT_2020',
compilation_level: 'ADVANCED_OPTIMIZATIONS',
output_wrapper: '(()=>{%output%})();'
};

View file

@ -37,7 +37,7 @@ ko.utils = {
// Ensure it's a real array, as we're about to reparent the nodes and
// we don't want the underlying collection to change while we're doing that.
var nodesArray = [...nodes];
var templateDocument = (nodesArray[0] && nodesArray[0].ownerDocument) || document;
var templateDocument = nodesArray[0]?.ownerDocument || document;
var container = templateDocument.createElement('div');
nodesArray.forEach(node => container.append(ko.cleanNode(node)));
@ -108,7 +108,7 @@ ko.utils = {
node.ownerDocument.documentElement.contains(node.nodeType !== 1 ? node.parentNode : node),
triggerEvent: (element, eventType) => {
if (!(element && element.nodeType))
if (!element?.nodeType)
throw new Error("element must be a DOM node when calling triggerEvent");
element.dispatchEvent(new Event(eventType));
@ -134,9 +134,7 @@ ko.utils.domData = {
if (dataStore.has(node)) {
dataStore.get(node)[key] = value;
} else {
let dataForNode = {};
dataForNode[key] = value;
dataStore.set(node, dataForNode);
dataStore.set(node, {[key]:value});
}
return value;
},
@ -238,18 +236,9 @@ ko.exportSymbol('utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisp
ko.tasks = (() => {
var taskQueue = [],
taskQueueLength = 0,
nextHandle = 1,
nextIndexToProcess = 0,
// Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+
// From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT
scheduler = (callback => {
var div = document.createElement("div");
new MutationObserver(callback).observe(div, {attributes: true});
return () => div.classList.toggle("foo");
})(scheduledProcess);
function processTasks() {
processTasks = () => {
if (taskQueueLength) {
// Each mark represents the end of a logical group of tasks and the number of these groups is
// limited to prevent unchecked recursion.
@ -276,34 +265,30 @@ ko.tasks = (() => {
}
}
}
}
},
function scheduledProcess() {
scheduledProcess = () => {
processTasks();
// Reset the queue
nextIndexToProcess = taskQueueLength = taskQueue.length = 0;
}
var tasks = {
schedule: func => {
if (!taskQueueLength) {
scheduler(scheduledProcess);
}
taskQueue[taskQueueLength++] = func;
return nextHandle++;
},
cancel: handle => {
var index = handle - (nextHandle - taskQueueLength);
if (index >= nextIndexToProcess && index < taskQueueLength) {
taskQueue[index] = null;
}
// Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+
// From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT
scheduler = (callback => {
var div = document.createElement("div");
new MutationObserver(callback).observe(div, {attributes: true});
return () => div.classList.toggle("foo");
})(scheduledProcess);
return {
schedule: func => {
taskQueueLength || scheduler(scheduledProcess);
taskQueue[taskQueueLength++] = func;
}
};
return tasks;
})();
ko.extenders = {
'debounce': (target, timeout) => target.limit(callback => debounce(callback, timeout)),
@ -554,7 +539,7 @@ ko.subscribable['fn'] = ko_subscribable_fn;
ko.isSubscribable = instance =>
instance != null && typeof instance.subscribe == "function" && typeof instance.notifySubscribers == "function";
typeof instance?.subscribe == "function" && typeof instance.notifySubscribers == "function";
(() => {
var outerFrames = [],
@ -591,11 +576,11 @@ ko.dependencyDetection = {
}
},
getDependenciesCount: () => currentFrame && currentFrame.computed.getDependenciesCount(),
getDependenciesCount: () => currentFrame?.computed.getDependenciesCount(),
isInitial: () => currentFrame && currentFrame.isInitial,
isInitial: () => currentFrame?.isInitial,
computed: () => currentFrame && currentFrame.computed
computed: () => currentFrame?.computed
};
})();
@ -615,12 +600,10 @@ ko.observable = initialValue => {
}
return this; // Permits chained assignments
}
else {
// Read
ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
return observable[observableLatestValue];
}
}
observable[observableLatestValue] = initialValue;
@ -641,7 +624,7 @@ ko.observable = initialValue => {
var observableFn = {
'toJSON': function() {
let value = this[observableLatestValue];
return value && value.toJSON ? value.toJSON() : value;
return value?.toJSON?.() || value;
},
equalityComparer: valuesArePrimitiveAndEqual,
peek: function() { return this[observableLatestValue]; },
@ -755,7 +738,7 @@ const arrayChangeEventName = 'arrayChange';
ko.extenders['trackArrayChanges'] = (target, options) => {
// Use the provided options--each call to trackArrayChanges overwrites the previously set options
target.compareArrayOptions = {};
if (options && typeof options == "object") {
if (typeof options == "object") {
ko.utils.extend(target.compareArrayOptions, options);
}
target.compareArrayOptions['sparse'] = true;
@ -834,7 +817,7 @@ ko.extenders['trackArrayChanges'] = (target, options) => {
cachedDiff = null;
pendingChanges = 0;
if (changes && changes.length) {
if (changes?.length) {
target.notifySubscribers(changes, arrayChangeEventName);
}
}
@ -950,7 +933,7 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
// Writing a value
writeFunction(...arguments);
return this; // Permits chained assignments
} else {
}
// Reading the value
state.isDisposed || ko.dependencyDetection.registerDependency(computedObservable);
if (state.isDirty || (state.isSleeping && computedObservable.haveDependenciesChanged())) {
@ -958,7 +941,6 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
}
return state.latestValue;
}
}
computedObservable[computedState] = state;
computedObservable.hasWriteFunction = typeof writeFunction === "function";
@ -1010,9 +992,7 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
// Utility function that disposes a given dependencyTracking entry
function computedDisposeDependencyCallback(id, entryToDispose) {
if (entryToDispose !== null && entryToDispose.dispose) {
entryToDispose.dispose();
}
entryToDispose?.dispose?.();
}
// This function gets called each time a dependency is detected while evaluating a computed.
@ -1101,8 +1081,8 @@ var computedFn = {
},
markDirty: function () {
// Process "dirty" events if we can handle delayed notifications
if (this._evalDelayed && !this[computedState].isBeingEvaluated) {
this._evalDelayed(false /*isChange*/);
if (!this[computedState].isBeingEvaluated) {
this._evalDelayed?.(false /*isChange*/);
}
},
isActive: function () {
@ -1123,7 +1103,7 @@ var computedFn = {
evaluatePossiblyAsync: function () {
var computedObservable = this,
throttleEvaluationTimeout = computedObservable['throttleEvaluation'];
if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {
if (throttleEvaluationTimeout >= 0) {
clearTimeout(this[computedState].evaluationTimeoutInstance);
this[computedState].evaluationTimeoutInstance = setTimeout(() =>
computedObservable.evaluateImmediate(true /*notifyChange*/)
@ -1153,7 +1133,7 @@ var computedFn = {
return;
}
if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen && disposeWhen()) {
if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen?.()) {
// See comment above about suppressDisposalUntilDisposeWhenReturnsFalse
if (!state.suppressDisposalUntilDisposeWhenReturnsFalse) {
computedObservable.dispose();
@ -1275,7 +1255,7 @@ var computedFn = {
var state = this[computedState];
if (!state.isSleeping && state.dependencyTracking) {
ko.utils.objectForEach(state.dependencyTracking, (id, dependency) =>
dependency.dispose && dependency.dispose()
dependency.dispose?.()
);
}
if (state.disposeWhenNodeIsRemoved && state.domNodeDisposalCallback) {
@ -1833,10 +1813,17 @@ ko.expressionRewriting = (() => {
ko.bindingContext = class {
constructor(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, options)
{
var self = this,
shouldInheritData = dataItemOrAccessor === inheritParentVm,
realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor,
isFunc = typeof(realDataItemOrAccessor) == "function" && !ko.isObservable(realDataItemOrAccessor),
subscribable,
dataDependency = options && options['dataDependency'],
// The binding context object includes static properties for the current, parent, and root view models.
// If a view model is actually stored in an observable, the corresponding binding context object, and
// any child contexts, must be updated when the view model is changed.
function updateContext() {
updateContext = () => {
// Most of the time, the context will directly get a view model object, but if a function is given,
// we call the function to retrieve the view model. If the function accesses any observables or returns
// an observable, the dependency is tracked, and those observables can later cause the binding
@ -1891,14 +1878,7 @@ ko.expressionRewriting = (() => {
}
return self['$data'];
}
var self = this,
shouldInheritData = dataItemOrAccessor === inheritParentVm,
realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor,
isFunc = typeof(realDataItemOrAccessor) == "function" && !ko.isObservable(realDataItemOrAccessor),
subscribable,
dataDependency = options && options['dataDependency'];
};
if (options && options['exportDependencies']) {
// The "exportDependencies" option means that the calling code will track any dependencies and re-create
@ -2306,13 +2286,12 @@ ko.expressionRewriting = (() => {
})();
(() => {
var loadingSubscribablesCache = Object.create(null), // Tracks component loads that are currently in flight
loadedDefinitionsCache = Object.create(null); // Tracks component loads that have already completed
loadedDefinitionsCache = new Map(); // Tracks component loads that have already completed
ko.components = {
get: (componentName, callback) => {
var cachedDefinition = loadedDefinitionsCache[componentName];
if (cachedDefinition) {
ko.tasks.schedule(() => callback(cachedDefinition.definition) );
if (loadedDefinitionsCache.has(componentName)) {
ko.tasks.schedule(() => callback(loadedDefinitionsCache.get(componentName)));
} else {
// Join the loading process that is already underway, or start a new one.
var subscribable = loadingSubscribablesCache[componentName],
@ -2324,8 +2303,8 @@ ko.expressionRewriting = (() => {
subscribable = loadingSubscribablesCache[componentName] = new ko.subscribable();
subscribable.subscribe(callback);
beginLoadingComponent(componentName, definition => {
loadedDefinitionsCache[componentName] = { definition: definition };
loadComponent(componentName, definition => {
loadedDefinitionsCache.set(componentName, definition);
delete loadingSubscribablesCache[componentName];
// For API consistency, all loads complete asynchronously. However we want to avoid
@ -2347,9 +2326,6 @@ ko.expressionRewriting = (() => {
}
},
clearCachedDefinition: componentName =>
delete loadedDefinitionsCache[componentName],
register: (componentName, config) => {
if (!config) {
throw new Error('Invalid configuration for ' + componentName);
@ -2373,8 +2349,9 @@ ko.expressionRewriting = (() => {
// 1. To supply configuration objects from some other source (e.g., conventions)
// 2. Or, to resolve configuration objects by loading viewmodels/templates via arbitrary logic.
var defaultConfigRegistry = Object.create(null);
var createViewModelKey = 'createViewModel';
var defaultConfigRegistry = Object.create(null),
createViewModelKey = 'createViewModel',
throwError = (componentName, message) => { throw new Error(`Component '${componentName}': ${message}`) },
// Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it
// into the standard component definition format:
@ -2382,7 +2359,8 @@ ko.expressionRewriting = (() => {
// Since both template and viewModel may need to be resolved asynchronously, both tasks are performed
// in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure,
// so this is implemented manually below.
function loadComponent(componentName, callback) {
loadComponent = (componentName, callback) => {
// Try the candidates
var result = {},
config = defaultConfigRegistry[componentName] || {},
templateConfig = config['template'],
@ -2414,29 +2392,10 @@ ko.expressionRewriting = (() => {
result[createViewModelKey] = viewModelConfig[createViewModelKey];
}
if (result['template'] && result[createViewModelKey]) {
callback(result);
} else {
callback(null);
}
}
function throwError(componentName, message) {
throw new Error(`Component '${componentName}': ${message}`)
}
function beginLoadingComponent(componentName, callback) {
// Try the candidates
var found = false;
loadComponent(componentName, result => {
// This candidate returned a value. Use it.
(found = result != null) && callback(result);
});
if (!found) {
// No candidates returned a value
callback(null);
}
}
// Did candidate return a value?
var found = (result['template'] && result[createViewModelKey]);
callback(found ? result : null);
};
ko.exportSymbol('components', ko.components);
ko.exportSymbol('components.register', ko.components.register);
@ -2539,9 +2498,6 @@ ko.bindingHandlers['attr'] = {
namespace ? element.removeAttributeNS(namespace, attrName) : element.removeAttribute(attrName);
} else {
attrValue = attrValue.toString();
}
if (!toRemove) {
namespace ? element.setAttributeNS(namespace, attrName, attrValue) : element.setAttribute(attrName, attrValue);
}
@ -2556,18 +2512,15 @@ ko.bindingHandlers['attr'] = {
}
};
var classesWrittenByBindingKey = '__ko__cssValue',
toggleClasses = (node, classNames, force) => {
if (classNames) {
classNames.split(/\s+/).forEach(className =>
toggleClasses = (node, classNames, force) =>
classNames && classNames.split(/\s+/).forEach(className =>
node.classList.toggle(className, force)
);
}
};
ko.bindingHandlers['css'] = {
'update': (element, valueAccessor) => {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value !== null && typeof value == "object") {
if (typeof value == "object") {
ko.utils.objectForEach(value, (className, shouldHaveClass) => {
shouldHaveClass = ko.utils.unwrapObservable(shouldHaveClass);
toggleClasses(element, className, !!shouldHaveClass);
@ -2585,7 +2538,7 @@ ko.bindingHandlers['enable'] = {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value && element.disabled)
element.removeAttribute("disabled");
else if ((!value) && (!element.disabled))
else if (!value && !element.disabled)
element.disabled = true;
}
};
@ -2599,12 +2552,9 @@ ko.bindingHandlers['disable'] = {
function makeEventHandlerShortcut(eventName) {
ko.bindingHandlers[eventName] = {
'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var newValueAccessor = () => {
return {
[eventName]: valueAccessor()
};
};
return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);
return ko.bindingHandlers['event']['init'].call(this, element,
() => ({[eventName]: valueAccessor()}), // newValueAccessor
allBindings, viewModel, bindingContext);
}
}
}
@ -2614,19 +2564,18 @@ ko.bindingHandlers['event'] = {
var eventsToHandle = valueAccessor() || {};
ko.utils.objectForEach(eventsToHandle, eventName => {
if (typeof eventName == "string") {
element.addEventListener(eventName, function (event) {
element.addEventListener(eventName, (...args) => {
var handlerReturnValue;
var handlerFunction = valueAccessor()[eventName];
if (!handlerFunction)
return;
if (handlerFunction) {
try {
viewModel = bindingContext['$data'];
// Take all the event args, and prefix with the viewmodel
handlerReturnValue = handlerFunction.apply(viewModel, [viewModel, ...arguments]);
handlerReturnValue = handlerFunction.apply(viewModel, [viewModel, ...args]);
} finally {
if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
event.preventDefault();
args[0].preventDefault();
}
}
}
});
@ -2728,7 +2677,7 @@ ko.bindingHandlers['html'] = {
}
}
};
(function () {
(() => {
// Makes a binding like with or if
function makeWithIfBinding(bindingKey, isWith, isNot) {
@ -2737,8 +2686,7 @@ function makeWithIfBinding(bindingKey, isWith, isNot) {
var savedNodes, contextOptions = {}, needAsyncContext;
if (isWith) {
var as = allBindings.get('as');
contextOptions = { 'as': as, 'exportDependencies': true };
contextOptions = { 'as': allBindings.get('as'), 'exportDependencies': true };
}
needAsyncContext = allBindings['has'](ko.bindingEvent.descendantsComplete);
@ -2804,17 +2752,15 @@ ko.bindingHandlers['options'] = {
throw new Error("options binding applies only to SELECT elements");
// Remove all existing <option>s.
while (element.length > 0) {
element.remove(0);
let l = element.length;
while (l--) {
element.remove(l);
}
// Ensures that the binding processor doesn't try to bind the options
return { 'controlsDescendantBindings': true };
},
'update': (element, valueAccessor, allBindings) => {
function selectedOptions() {
return Array.from(element.options).filter(node => node.selected);
}
var selectWasPreviouslyEmpty = element.length == 0,
multiple = element.multiple,
@ -2824,7 +2770,36 @@ ko.bindingHandlers['options'] = {
arrayToDomNodeChildrenOptions = {},
captionValue,
filteredArray,
previousSelectedValues = [];
previousSelectedValues = [],
selectedOptions = () => Array.from(element.options).filter(node => node.selected),
applyToObject = (object, predicate, defaultValue) => {
var predicateType = typeof predicate;
if (predicateType == "function") // Given a function; run it against the data value
return predicate(object);
else if (predicateType == "string") // Given a string; treat it as a property name on the data value
return object[predicate];
// Given no optionsText arg; use the data value itself
return defaultValue;
},
setSelectionCallback = (arrayEntry, newOptions) => {
if (itemUpdate && valueAllowUnset) {
// The model value is authoritative, so make sure its value is the one selected
ko.bindingEvent.notify(element, ko.bindingEvent.childrenComplete);
} else if (previousSelectedValues.length) {
// IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
// That's why we first added them without selection. Now it's time to set the selection.
var isSelected = previousSelectedValues.includes(ko.selectExtensions.readValue(newOptions[0]));
newOptions[0].selected = isSelected;
// If this option was changed from being selected during a single-item update, notify the change
if (itemUpdate && !isSelected) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
}
};
if (!valueAllowUnset) {
if (multiple) {
@ -2853,22 +2828,12 @@ ko.bindingHandlers['options'] = {
// If a falsy value is provided (e.g. null), we'll simply empty the select element
}
function applyToObject(object, predicate, defaultValue) {
var predicateType = typeof predicate;
if (predicateType == "function") // Given a function; run it against the data value
return predicate(object);
else if (predicateType == "string") // Given a string; treat it as a property name on the data value
return object[predicate];
else // Given no optionsText arg; use the data value itself
return defaultValue;
}
// The following functions can run at two different times:
// The first is when the whole array is being updated directly from this binding handler.
// The second is when an observable value for a specific array entry is updated.
// oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.
var itemUpdate = false;
function optionForArrayItem(arrayEntry, index, oldOptions) {
var itemUpdate = false,
optionForArrayItem = (arrayEntry, index, oldOptions) => {
if (oldOptions.length) {
previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ ko.selectExtensions.readValue(oldOptions[0]) ] : [];
itemUpdate = true;
@ -2887,29 +2852,12 @@ ko.bindingHandlers['options'] = {
ko.utils.setTextContent(option, optionText);
}
return [option];
}
};
// By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection
// problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208
arrayToDomNodeChildrenOptions['beforeRemove'] = option => element.removeChild(option);
function setSelectionCallback(arrayEntry, newOptions) {
if (itemUpdate && valueAllowUnset) {
// The model value is authoritative, so make sure its value is the one selected
ko.bindingEvent.notify(element, ko.bindingEvent.childrenComplete);
} else if (previousSelectedValues.length) {
// IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
// That's why we first added them without selection. Now it's time to set the selection.
var isSelected = previousSelectedValues.includes(ko.selectExtensions.readValue(newOptions[0]));
newOptions[0].selected = isSelected;
// If this option was changed from being selected during a single-item update, notify the change
if (itemUpdate && !isSelected) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
}
}
var callback = setSelectionCallback;
if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') == "function") {
callback = (arrayEntry, newOptions) => {
@ -2922,25 +2870,23 @@ ko.bindingHandlers['options'] = {
if (!valueAllowUnset) {
// Determine if the selection has changed as a result of updating the options list
var selectionChanged;
var selectionChanged, prevLength = previousSelectedValues.length;
if (multiple) {
// For a multiple-select box, compare the new selection count to the previous one
// But if nothing was selected before, the selection can't have changed
selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;
selectionChanged = prevLength && selectedOptions().length < prevLength;
} else {
// For a single-select box, compare the current value to the previous value
// But if nothing was selected before or nothing is selected now, just look for a change in selection
selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)
selectionChanged = (prevLength && element.selectedIndex >= 0)
? (ko.selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])
: (previousSelectedValues.length || element.selectedIndex >= 0);
: (prevLength || element.selectedIndex >= 0);
}
// Ensure consistency between model value and selected option.
// If the dropdown was changed so that selection is no longer the same,
// notify the value or selectedOptions binding.
if (selectionChanged) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
selectionChanged && ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
if (valueAllowUnset || ko.dependencyDetection.isInitial()) {
@ -2989,10 +2935,7 @@ ko.bindingHandlers['submit'] = {
try { handlerReturnValue = value.call(bindingContext['$data'], element); }
finally {
if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
if (event.preventDefault)
event.preventDefault();
else
event.returnValue = false;
}
}
});
@ -3294,9 +3237,9 @@ makeEventHandlerShortcut('click');
nextInQueue = ko.virtualElements.nextSibling(node);
action(node, nextInQueue);
}
};
},
function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {
activateBindingsOnContinuousNodeArray = (continuousNodeArray, bindingContext) => {
// To be used on any nodes that have been rendered by a template and have been inserted into some parent element
// Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because
// the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,
@ -3318,15 +3261,15 @@ makeEventHandlerShortcut('click');
// Make sure any changes done by applyBindings or unmemoize are reflected in the array
ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
}
}
},
function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
getFirstNodeFromPossibleArray = (nodeOrNodeArray) => {
return nodeOrNodeArray.nodeType ? nodeOrNodeArray
: nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]
: null;
}
},
function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext) {
executeTemplate = (targetNodeOrNodeArray, renderMode, template, bindingContext) => {
var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
var templateDocument = (firstTargetNode || template || {}).ownerDocument;
@ -3355,9 +3298,9 @@ makeEventHandlerShortcut('click');
}
return renderedNodesArray;
}
},
function resolveTemplateName(template, data, context) {
resolveTemplateName = (template, data, context) => {
// The template can be specified as:
if (ko.isObservable(template)) {
// 1. An observable, with string value
@ -3365,7 +3308,7 @@ makeEventHandlerShortcut('click');
}
// 2. A function of (data, context) returning a string ELSE 3. A string
return (typeof template === 'function') ? template(data, context) : template;
}
};
ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {
options = options || {};
@ -3379,7 +3322,7 @@ makeEventHandlerShortcut('click');
return ko.computed( // So the DOM is automatically updated when any dependency changes
() => {
// Ensure we've got a proper binding context to work with
var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))
var bindingContext = (dataOrBindingContext instanceof ko.bindingContext)
? dataOrBindingContext
: new ko.bindingContext(dataOrBindingContext, null, null, null, { "exportDependencies": true });
@ -3440,7 +3383,7 @@ makeEventHandlerShortcut('click');
subscription.disposeWhenNodeIsRemoved(targetNode);
return subscription;
} else {
}
return ko.computed(() => {
var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];
if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
@ -3449,14 +3392,12 @@ makeEventHandlerShortcut('click');
setDomNodeChildrenFromArrayMapping(unwrappedArray);
}, { disposeWhenNodeIsRemoved: targetNode });
}
};
var templateComputedDomDataKey = ko.utils.domData.nextKey();
function disposeOldComputedAndStoreNewOne(element, newComputed) {
var oldComputed = ko.utils.domData.get(element, templateComputedDomDataKey);
if (oldComputed && (typeof(oldComputed.dispose) == 'function'))
oldComputed.dispose();
oldComputed?.dispose?.();
ko.utils.domData.set(element, templateComputedDomDataKey, (newComputed && (!newComputed.isActive || newComputed.isActive())) ? newComputed : undefined);
}
@ -3480,7 +3421,7 @@ makeEventHandlerShortcut('click');
// If the nodes are already attached to a KO-generated container, we reuse that container without moving the
// elements to a new one (we check only the first node, as the nodes are always moved together)
let container = nodes[0] && nodes[0].parentNode;
let container = nodes[0]?.parentNode;
if (!container || !ko.utils.domData.get(container, cleanContainerDomDataKey)) {
container = ko.utils.moveCleanedNodesToContainerElement(nodes);
ko.utils.domData.set(container, cleanContainerDomDataKey, true);
@ -3490,7 +3431,7 @@ makeEventHandlerShortcut('click');
} else {
// It's an anonymous template - store the element contents, then clear the element
var templateNodes = ko.virtualElements.childNodes(element);
if (templateNodes.length > 0) {
if (templateNodes.length) {
let container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent
new ko.templateSources.anonymousTemplate(element).nodes(container);
} else {
@ -3581,23 +3522,9 @@ ko.utils.findMovesInArrayComparison = (left, right, limitFailedCompares) => {
};
ko.utils.compareArrays = (() => {
var statusNotInOld = 'added', statusNotInNew = 'deleted';
var statusNotInOld = 'added', statusNotInNew = 'deleted',
// Simple calculation based on Levenshtein distance.
function compareArrays(oldArray, newArray, options) {
// For backward compatibility, if the third arg is actually a bool, interpret
// it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
oldArray = oldArray || [];
newArray = newArray || [];
if (oldArray.length < newArray.length)
return compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options);
else
return compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
}
function compareSmallArrayToBigArray(smlArray, bigArray, statusNotInSml, statusNotInBig, options) {
compareSmallArrayToBigArray = (smlArray, bigArray, statusNotInSml, statusNotInBig, options) => {
var myMin = Math.min,
myMax = Math.max,
editDistanceMatrix = [],
@ -3657,9 +3584,20 @@ ko.utils.compareArrays = (() => {
ko.utils.findMovesInArrayComparison(notInBig, notInSml, !options['dontLimitMoves'] && smlIndexMax * 10);
return editScript.reverse();
}
};
return compareArrays;
// Simple calculation based on Levenshtein distance.
return (oldArray, newArray, options) => {
// For backward compatibility, if the third arg is actually a bool, interpret
// it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
oldArray = oldArray || [];
newArray = newArray || [];
return (oldArray.length < newArray.length)
? compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options)
: compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
};
})();
(() => {
// Objective:

View file

@ -4,72 +4,72 @@
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(T=>{function O(a,c){return null===a||U[typeof a]?a===c:!1}function V(a,c){var d;return()=>{d||(d=setTimeout(()=>{d=0;a()},c))}}function W(a,c){var d;return()=>{clearTimeout(d);d=setTimeout(a,c)}}function X(a,c){null!==c&&c.o&&c.o()}function Y(a,c){var d=this.Zb,g=d[A];g.X||(this.Ta&&this.za[c]?(d.sb(c,a,this.za[c]),this.za[c]=null,--this.Ta):g.u[c]||d.sb(c,a,g.v?{T:a}:d.Qb(a)),a.ja&&a.Vb())}var L=T.document,P={},b="undefined"!==typeof P?P:{};b.m=(a,c)=>{a=a.split(".");for(var d=b,g=
0,k=a.length-1;g<k;g++)d=d[a[g]];d[a[k]]=c};b.fa=(a,c,d)=>{a[c]=d};b.m("version","3.5.1-sm");b.a={extend:(a,c)=>c?Object.assign(a,c):a,L:(a,c)=>a&&Object.entries(a).forEach(d=>c(d[0],d[1])),Xa:a=>[...a.childNodes].forEach(c=>b.removeNode(c)),Jb:a=>{a=[...a];var c=(a[0]&&a[0].ownerDocument||L).createElement("div");a.forEach(d=>c.append(b.ca(d)));return c},ya:(a,c)=>Array.prototype.map.call(a,c?d=>b.ca(d.cloneNode(!0)):d=>d.cloneNode(!0)),ua:(a,c)=>{b.a.Xa(a);c&&a.append(...c)},Aa:(a,c)=>{if(a.length){for(c=
8===c.nodeType&&c.parentNode||c;a.length&&a[0].parentNode!==c;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==c;)--a.length;if(1<a.length){c=a[0];var d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},Pb:a=>null==a?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,""),Wa:a=>a.ownerDocument.documentElement.contains(1!==a.nodeType?a.parentNode:a),Sb:(a,c)=>{if(!a||!a.nodeType)throw Error("element must be a DOM node when calling triggerEvent");
a.dispatchEvent(new Event(c))},f:a=>b.O(a)?a():a,gb:(a,c)=>a.textContent=b.a.f(c)||""};b.m("utils",b.a);b.m("unwrap",b.a.f);(()=>{let a=0,c="__ko__"+Date.now(),d=new WeakMap;b.a.c={get:(g,k)=>(d.get(g)||{})[k],set:(g,k,t)=>{if(d.has(g))d.get(g)[k]=t;else{let e={};e[k]=t;d.set(g,e)}return t},Za:function(g,k,t){return this.get(g,k)||this.set(g,k,t)},clear:g=>d.delete(g),V:()=>a++ +c}})();b.a.I=(()=>{var a=b.a.c.V(),c={1:1,8:1,9:1},d={1:1,9:1};const g=(e,f)=>{var h=b.a.c.get(e,a);f&&!h&&(h=new Set,b.a.c.set(e,
a,h));return h},k=e=>{var f=g(e);f&&(new Set(f)).forEach(h=>h(e));b.a.c.clear(e);d[e.nodeType]&&t(e.childNodes,!0)},t=(e,f)=>{for(var h=[],r,p=0;p<e.length;p++)if(!f||8===e[p].nodeType)if(k(h[h.length]=r=e[p]),e[p]!==r)for(;p--&&!h.includes(e[p]););};return{ma:(e,f)=>{if("function"!=typeof f)throw Error("Callback must be a function");g(e,1).add(f)},fb:(e,f)=>{var h=g(e);h&&(h.delete(f),h.size||b.a.c.set(e,a,null))},ca:e=>{b.l.N(()=>{c[e.nodeType]&&(k(e),d[e.nodeType]&&t(e.getElementsByTagName("*")))});
return e},removeNode:e=>{b.ca(e);e.parentNode&&e.parentNode.removeChild(e)}}})();b.ca=b.a.I.ca;b.removeNode=b.a.I.removeNode;b.m("utils.domNodeDisposal",b.a.I);b.m("utils.domNodeDisposal.addDisposeCallback",b.a.I.ma);b.Rb=(()=>{function a(){if(g)for(var f=g,h=0,r;t<g;)if(r=d[t++]){if(t>f){if(5E3<=++h){t=g;setTimeout(()=>{throw Error(`'Too much recursion' after processing ${h} task groups.`);},0);break}f=g}try{r()}catch(p){setTimeout(()=>{throw p;},0)}}}function c(){a();t=g=d.length=0}var d=[],g=0,
k=1,t=0,e=(f=>{var h=L.createElement("div");(new MutationObserver(f)).observe(h,{attributes:!0});return()=>h.classList.toggle("foo")})(c);return{Nb:f=>{g||e(c);d[g++]=f;return k++},cancel:f=>{f-=k-g;f>=t&&f<g&&(d[f]=null)}}})();b.Ya={debounce:(a,c)=>a.Ha(d=>W(d,c)),rateLimit:(a,c)=>{if("number"==typeof c)var d=c;else{d=c.timeout;var g=c.method}var k="function"==typeof g?g:V;a.Ha(t=>k(t,d,c))},notify:(a,c)=>{a.ra="always"==c?null:O}};var U={undefined:1,"boolean":1,number:1,string:1};b.m("extenders",
b.Ya);class Z{constructor(a,c,d){this.T=a;this.mb=c;this.oa=d;this.Na=!1;this.C=this.W=null;b.fa(this,"dispose",this.o)}o(){this.Na||(this.C&&b.a.I.fb(this.W,this.C),this.Na=!0,this.oa(),this.T=this.mb=this.oa=this.W=this.C=null)}i(a){this.W=a;b.a.I.ma(a,this.C=this.o.bind(this))}}b.R=function(){Object.setPrototypeOf(this,H);H.Ea(this)};var H={Ea:a=>{a.S=new Map;a.S.set("change",new Set);a.rb=1},subscribe:function(a,c,d){var g=this;d=d||"change";var k=new Z(g,c?a.bind(c):a,()=>{g.S.get(d).delete(k);
g.wa&&g.wa(d)});g.na&&g.na(d);g.S.has(d)||g.S.set(d,new Set);g.S.get(d).add(k);return k},s:function(a,c){c=c||"change";"change"===c&&this.Ka();if(this.sa(c)){c="change"===c&&this.Tb||new Set(this.S.get(c));try{b.l.wb(),c.forEach(d=>{d.Na||d.mb(a)})}finally{b.l.end()}}},Ca:function(){return this.rb},ec:function(a){return this.Ca()!==a},Ka:function(){++this.rb},Ha:function(a){var c=this,d=b.O(c),g,k,t,e,f;c.va||(c.va=c.s,c.s=function(r,p){p&&"change"!==p?"beforeChange"===p?this.ob(r):this.va(r,p):this.pb(r)});
var h=a(()=>{c.ja=!1;d&&e===c&&(e=c.nb?c.nb():c());var r=k||f&&c.Ga(t,e);f=k=g=!1;r&&c.va(t=e)});c.pb=(r,p)=>{p&&c.ja||(f=!p);c.Tb=new Set(c.S.get("change"));c.ja=g=!0;e=r;h()};c.ob=r=>{g||(t=r,c.va(r,"beforeChange"))};c.qb=()=>{f=!0};c.Vb=()=>{c.Ga(t,c.G(!0))&&(k=!0)}},sa:function(a){return(this.S.get(a)||[]).size},Ga:function(a,c){return!this.ra||!this.ra(a,c)},toString:()=>"[object Object]",extend:function(a){var c=this;a&&b.a.L(a,(d,g)=>{d=b.Ya[d];"function"==typeof d&&(c=d(c,g)||c)});return c}};
b.fa(H,"init",H.Ea);b.fa(H,"subscribe",H.subscribe);b.fa(H,"extend",H.extend);Object.setPrototypeOf(H,Function.prototype);b.R.fn=H;b.ic=a=>null!=a&&"function"==typeof a.subscribe&&"function"==typeof a.s;(()=>{var a=[],c,d=0;b.l={wb:g=>{a.push(c);c=g},end:()=>c=a.pop(),Mb:g=>{if(c){if(!b.ic(g))throw Error("Only subscribable things can act as dependencies");c.Xb.call(c.Yb,g,g.Ub||(g.Ub=++d))}},N:(g,k,t)=>{try{return a.push(c),c=void 0,g.apply(k,t||[])}finally{c=a.pop()}},Ba:()=>c&&c.j.Ba(),ab:()=>c&&
c.ab,j:()=>c&&c.j}})();const G=Symbol("_latestValue");b.Z=a=>{function c(){if(0<arguments.length)return c.Ga(c[G],arguments[0])&&(c.kb(),c[G]=arguments[0],c.La()),this;b.l.Mb(c);return c[G]}c[G]=a;Object.defineProperty(c,"length",{get:()=>null==c[G]?void 0:c[G].length});b.R.fn.Ea(c);Object.setPrototypeOf(c,J);return c};var J={toJSON:function(){let a=this[G];return a&&a.toJSON?a.toJSON():a},ra:O,G:function(){return this[G]},La:function(){this.s(this[G],"spectate");this.s(this[G])},kb:function(){this.s(this[G],
"beforeChange")}};Object.setPrototypeOf(J,b.R.fn);var K=b.Z.C="__ko_proto__";J[K]=b.Z;b.O=a=>{if((a="function"==typeof a&&a[K])&&a!==J[K]&&a!==b.j.fn[K])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");return!!a};b.jc=a=>"function"==typeof a&&(a[K]===J[K]||a[K]===b.j.fn[K]&&a.fc);b.m("observable",b.Z);b.m("isObservable",b.O);b.m("observable.fn",J);b.fa(J,"valueHasMutated",J.La);b.ha=a=>{a=a||[];if("object"!=typeof a||!("length"in a))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");
a=b.Z(a);Object.setPrototypeOf(a,b.ha.fn);return a.extend({trackArrayChanges:!0})};b.ha.fn={remove:function(a){for(var c=this.G(),d=!1,g="function"!=typeof a||b.O(a)?e=>e===a:a,k=c.length;k--;){var t=c[k];if(g(t)){if(c[k]!==t)throw Error("Array modified during remove; cannot remove item");d||this.kb();d=!0;c.splice(k,1)}}d&&this.La()}};Object.setPrototypeOf(b.ha.fn,b.Z.fn);Object.getOwnPropertyNames(Array.prototype).forEach(a=>{"function"===typeof Array.prototype[a]&&"constructor"!=a&&("copyWithin fill pop push reverse shift sort splice unshift".split(" ").includes(a)?
b.ha.fn[a]=function(...c){var d=this.G();this.kb();this.yb(d,a,c);c=d[a](...c);this.La();return c===d?this:c}:b.ha.fn[a]=function(...c){return this()[a](...c)})});b.Hb=a=>b.O(a)&&"function"==typeof a.remove&&"function"==typeof a.push;b.m("observableArray",b.ha);b.m("isObservableArray",b.Hb);b.Ya.trackArrayChanges=(a,c)=>{function d(){function q(){if(f){var l=[].concat(a.G()||[]);if(a.sa("arrayChange")){if(!k||1<f)k=b.a.zb(h,l,a.Qa);var n=k}h=l;k=null;f=0;n&&n.length&&a.s(n,"arrayChange")}}g?q():(g=
!0,e=a.subscribe(()=>++f,null,"spectate"),h=[].concat(a.G()||[]),k=null,t=a.subscribe(q))}a.Qa={};c&&"object"==typeof c&&b.a.extend(a.Qa,c);a.Qa.sparse=!0;if(!a.yb){var g=!1,k=null,t,e,f=0,h,r=a.na,p=a.wa;a.na=q=>{r&&r.call(a,q);"arrayChange"===q&&d()};a.wa=q=>{p&&p.call(a,q);"arrayChange"!==q||a.sa("arrayChange")||(t&&t.o(),e&&e.o(),e=t=null,g=!1,h=void 0)};a.yb=(q,l,n)=>{function m(E,C,z){return u[u.length]={status:E,value:C,index:z}}if(g&&!f){var u=[],w=q.length,v=n.length,y=0;switch(l){case "push":y=
w;case "unshift":for(q=0;q<v;q++)m("added",n[q],y+q);break;case "pop":y=w-1;case "shift":w&&m("deleted",q[y],y);break;case "splice":y=Math.min(Math.max(0,0>n[0]?w+n[0]:n[0]),w);w=1===v?w:Math.min(y+(n[1]||0),w);v=y+v-2;l=Math.max(w,v);var x=[],B=[];for(let E=y,C=2;E<l;++E,++C)E<w&&B.push(m("deleted",q[E],E)),E<v&&x.push(m("added",n[C],E));b.a.Eb(B,x);break;default:return}k=u}}}};var A=Symbol("_state");b.j=(a,c)=>{function d(){if(0<arguments.length){if("function"!==typeof g)throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
g(...arguments);return this}k.X||b.l.Mb(d);(k.U||k.v&&d.ta())&&d.P();return k.J}"object"===typeof a?c=a:(c=c||{},a&&(c.read=a));if("function"!=typeof c.read)throw Error("Pass a function that returns the value of the ko.computed");var g=c.write,k={J:void 0,Y:!0,U:!0,Fa:!1,ib:!1,X:!1,eb:!1,v:!1,Lb:c.read,i:c.disposeWhenNodeIsRemoved||c.i||null,pa:c.disposeWhen||c.pa,Va:null,u:{},H:0,Db:null};d[A]=k;d.fc="function"===typeof g;b.R.fn.Ea(d);Object.setPrototypeOf(d,M);c.pure?(k.eb=!0,k.v=!0,b.a.extend(d,
aa)):c.deferEvaluation&&b.a.extend(d,ba);k.i&&(k.ib=!0,k.i.nodeType||(k.i=null));k.v||c.deferEvaluation||d.P();k.i&&d.ga()&&b.a.I.ma(k.i,k.Va=()=>{d.o()});return d};var M={ra:O,Ba:function(){return this[A].H},cc:function(){var a=[];b.a.L(this[A].u,(c,d)=>a[d.ka]=d.T);return a},$a:function(a){if(!this[A].H)return!1;var c=this.cc();return c.includes(a)||!!c.find(d=>d.$a&&d.$a(a))},sb:function(a,c,d){if(this[A].eb&&c===this)throw Error("A 'pure' computed must not be called recursively");this[A].u[a]=
d;d.ka=this[A].H++;d.la=c.Ca()},ta:function(){var a,c=this[A].u;for(a in c)if(Object.prototype.hasOwnProperty.call(c,a)){var d=c[a];if(this.ia&&d.T.ja||d.T.ec(d.la))return!0}},uc:function(){this.ia&&!this[A].Fa&&this.ia(!1)},ga:function(){var a=this[A];return a.U||0<a.H},vc:function(){this.ja?this[A].U&&(this[A].Y=!0):this.Cb()},Qb:function(a){return a.subscribe(this.Cb,this)},Cb:function(){var a=this,c=a.throttleEvaluation;c&&0<=c?(clearTimeout(this[A].Db),this[A].Db=setTimeout(()=>a.P(!0),c)):a.ia?
a.ia(!0):a.P(!0)},P:function(a){var c=this[A],d=c.pa,g=!1;if(!c.Fa&&!c.X){if(c.i&&!b.a.Wa(c.i)||d&&d()){if(!c.ib){this.o();return}}else c.ib=!1;c.Fa=!0;try{g=this.ac(a)}finally{c.Fa=!1}return g}},ac:function(a){var c=this[A],d=c.eb?void 0:!c.H;var g={Zb:this,za:c.u,Ta:c.H};b.l.wb({Yb:g,Xb:Y,j:this,ab:d});c.u={};c.H=0;a:{try{var k=c.Lb();break a}finally{b.l.end(),g.Ta&&!c.v&&b.a.L(g.za,X),c.Y=c.U=!1}k=void 0}c.H?g=this.Ga(c.J,k):(this.o(),g=!0);g&&(c.v?this.Ka():this.s(c.J,"beforeChange"),c.J=k,this.s(c.J,
"spectate"),!c.v&&a&&this.s(c.J),this.qb&&this.qb());d&&this.s(c.J,"awake");return g},G:function(a){var c=this[A];(c.U&&(a||!c.H)||c.v&&this.ta())&&this.P();return c.J},Ha:function(a){b.R.fn.Ha.call(this,a);this.nb=function(){this[A].v||(this[A].Y?this.P():this[A].U=!1);return this[A].J};this.ia=function(c){this.ob(this[A].J);this[A].U=!0;c&&(this[A].Y=!0);this.pb(this,!c)}},o:function(){var a=this[A];!a.v&&a.u&&b.a.L(a.u,(c,d)=>d.o&&d.o());a.i&&a.Va&&b.a.I.fb(a.i,a.Va);a.u=void 0;a.H=0;a.X=!0;a.Y=
!1;a.U=!1;a.v=!1;a.i=void 0;a.pa=void 0;a.Lb=void 0}},aa={na:function(a){var c=this,d=c[A];if(!d.X&&d.v&&"change"==a){d.v=!1;if(d.Y||c.ta())d.u=null,d.H=0,c.P()&&c.Ka();else{var g=[];b.a.L(d.u,(k,t)=>g[t.ka]=k);g.forEach((k,t)=>{var e=d.u[k],f=c.Qb(e.T);f.ka=t;f.la=e.la;d.u[k]=f});c.ta()&&c.P()&&c.Ka()}d.X||c.s(d.J,"awake")}},wa:function(a){var c=this[A];c.X||"change"!=a||this.sa("change")||(b.a.L(c.u,(d,g)=>{g.o&&(c.u[d]={T:g.T,ka:g.ka,la:g.la},g.o())}),c.v=!0,this.s(void 0,"asleep"))},Ca:function(){var a=
this[A];a.v&&(a.Y||this.ta())&&this.P();return b.R.fn.Ca.call(this)}},ba={na:function(a){"change"!=a&&"beforeChange"!=a||this.G()}};Object.setPrototypeOf(M,b.R.fn);var Q=b.Z.C;M[Q]=b.j;b.m("computed",b.j);b.m("isComputed",a=>"function"==typeof a&&a[Q]===M[Q]);b.m("computed.fn",M);b.fa(M,"dispose",M.o);b.oc=a=>{if("function"===typeof a)return b.j(a,{pure:!0});a={...a,pure:!0};return b.j(a)};(()=>{b.A={M:a=>{switch(a.nodeName){case "OPTION":return!0===a.__ko__hasDomDataOptionValue__?b.a.c.get(a,b.b.options.cb):
a.value;case "SELECT":return 0<=a.selectedIndex?b.A.M(a.options[a.selectedIndex]):void 0;default:return a.value}},Ma:(a,c,d)=>{switch(a.nodeName){case "OPTION":"string"===typeof c?(b.a.c.set(a,b.b.options.cb,void 0),delete a.__ko__hasDomDataOptionValue__,a.value=c):(b.a.c.set(a,b.b.options.cb,c),a.__ko__hasDomDataOptionValue__=!0,a.value="number"===typeof c?c:"");break;case "SELECT":for(var g=-1,k=""===c||null==c,t=0,e=a.options.length,f;t<e;++t)if(f=b.A.M(a.options[t]),f==c||""===f&&k){g=t;break}if(d||
0<=g||k&&1<a.size)a.selectedIndex=g;break;default:a.value=null==c?"":c}}}})();b.F=(()=>{function a(f){f=b.a.Pb(f);123===f.charCodeAt(0)&&(f=f.slice(1,-1));f+="\n,";var h=[],r=f.match(g),p=[],q=0;if(1<r.length){for(var l=0,n;n=r[l++];){var m=n.charCodeAt(0);if(44===m){if(0>=q){h.push(u&&p.length?{key:u,value:p.join("")}:{unknown:u||p.join("")});var u=q=0;p=[];continue}}else if(58===m){if(!q&&!u&&1===p.length){u=p.pop();continue}}else if(47===m&&1<n.length&&(47===n.charCodeAt(1)||42===n.charCodeAt(1)))continue;
else 47===m&&l&&1<n.length?(m=r[l-1].match(k))&&!t[m[0]]&&(f=f.slice(f.indexOf(n)+1),r=f.match(g),l=-1,n="/"):40===m||123===m||91===m?++q:41===m||125===m||93===m?--q:u||p.length||34!==m&&39!==m||(n=n.slice(1,-1));p.push(n)}if(0<q)throw Error("Unbalanced parentheses, braces, or brackets");}return h}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,g=/"(?:\\.|[^"])*"|'(?:\\.|[^'])*'|`(?:\\.|[^`])*`|\/\*(?:[^*]|\*+[^*/])*\*+\/|\/\/.*\n|\/(?:\\.|[^/])+\/w*|[^\s:,/][^,"'`{}()/:[\]]*[^\s,"'`{}()/:[\]]|[^\s]/g,
k=/[\])"'A-Za-z0-9_$]+$/,t={"in":1,"return":1,"typeof":1},e=new Set;return{Pa:[],jb:e,mc:a,nc:function(f,h){function r(m,u){if(!n){var w=b.b[m];if(w&&w.preprocess&&!(u=w.preprocess(u,m,r)))return;if(w=e.has(m)){var v=u;c.includes(v)?v=!1:(w=v.match(d),v=null===w?!1:w[1]?"Object("+w[1]+")"+w[2]:v);w=v}w&&q.push("'"+m+"':function(_z){"+v+"=_z}")}l&&(u="function(){return "+u+" }");p.push("'"+m+"':"+u)}h=h||{};var p=[],q=[],l=h.valueAccessors,n=h.bindingParams;("string"===typeof f?a(f):f).forEach(m=>
r(m.key||m.unknown,m.value));q.length&&r("_ko_property_writers","{"+q.join(",")+" }");return p.join(",")},kc:(f,h)=>-1<f.findIndex(r=>r.key==h),lb:(f,h,r,p,q)=>{if(f&&b.O(f))!b.jc(f)||q&&f.G()===p||f(p);else if((f=h.get("_ko_property_writers"))&&f[r])f[r](p)}}})();(()=>{function a(e){return 8==e.nodeType&&g.test(e.nodeValue)}function c(e){return 8==e.nodeType&&k.test(e.nodeValue)}function d(e,f){for(var h=e,r=1,p=[];h=h.nextSibling;){if(c(h)&&(b.a.c.set(h,t,!0),!--r))return p;p.push(h);a(h)&&++r}if(!f)throw Error("Cannot find closing comment tag to match: "+
e.nodeValue);return null}var g=/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=/^\s*\/ko\s*$/,t="__ko_matchedEndComment__";b.h={$:{},childNodes:e=>a(e)?d(e):e.childNodes,qa:e=>{a(e)?(e=d(e))&&[...e].forEach(f=>b.removeNode(f)):b.a.Xa(e)},ua:(e,f)=>{a(e)?(b.h.qa(e),e.after(...f)):b.a.ua(e,f)},prepend:(e,f)=>{a(e)?e.nextSibling.before(f):e.prepend(f)},Gb:(e,f,h)=>{h?h.after(f):b.h.prepend(e,f)},firstChild:e=>{if(a(e))return e=e.nextSibling,!e||c(e)?null:e;let f=e.firstChild;if(f&&c(f))throw Error("Found invalid end comment, as the first child of "+
e);return f},nextSibling:e=>{if(a(e)){var f=d(e,void 0);e=f?(f.length?f[f.length-1]:e).nextSibling:null}if((f=e.nextSibling)&&c(f)){if(c(f)&&!b.a.c.get(f,t))throw Error("Found end comment without a matching opening comment, as child of "+e);return null}return f},dc:a,sc:e=>(e=e.nodeValue.match(g))?e[1]:null}})();(()=>{const a=new Map;b.xb=new class{lc(c){switch(c.nodeType){case 1:return null!=c.getAttribute("data-bind");case 8:return b.h.dc(c);default:return!1}}bc(c,d){a:{switch(c.nodeType){case 1:var g=
c.getAttribute("data-bind");break a;case 8:g=b.h.sc(c);break a}g=null}if(g)try{let t={valueAccessors:!0},e=a.get(g);if(!e){var k="with($context){with($data||{}){return{"+b.F.nc(g,t)+"}}}";e=new Function("$context","$element",k);a.set(g,e)}return e(d,c)}catch(t){throw t.message="Unable to parse bindings.\nBindings value: "+g+"\nMessage: "+t.message,t;}return null}}})();(()=>{function a(l){var n=(l=b.a.c.get(l,p))&&l.D;n&&(l.D=null,n.Kb())}function c(l,n){for(var m,u=b.h.firstChild(n);m=u;)u=b.h.nextSibling(m),
d(l,m);b.g.notify(n,b.g.B)}function d(l,n){var m=l;if(1===n.nodeType||b.xb.lc(n))m=k(n,null,l).bindingContextForDescendants;m&&n.matches&&!n.matches("SCRIPT,TEXTAREA,TEMPLATE")&&c(m,n)}function g(l){var n=[],m={},u=[];b.a.L(l,function y(v){if(!m[v]){var x=b.b[v];x&&(x.after&&(u.push(v),x.after.forEach(B=>{if(l[B]){if(u.includes(B))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+u.join(", "));y(B)}}),u.length--),n.push({key:v,Fb:x}));m[v]=!0}});return n}
function k(l,n,m){var u=b.a.c.Za(l,p,{}),w=u.Wb;if(!n){if(w)throw Error("You cannot apply bindings multiple times to the same element.");u.Wb=!0}w||(u.context=m);u.bb||(u.bb={});if(n&&"function"!==typeof n)var v=n;else{var y=b.j(()=>{if(v=n?n(m,l):b.xb.bc(l,m)){if(m[e])m[e]();if(m[h])m[h]()}return v},{i:l});v&&y.ga()||(y=null)}var x=m,B;if(v){var E=y?z=>()=>y()[z]():z=>v[z],C={get:z=>v[z]&&E(z)(),has:z=>z in v};b.g.B in v&&b.g.subscribe(l,b.g.B,()=>{var z=v[b.g.B]();if(z){var D=b.h.childNodes(l);
D.length&&z(D,b.Bb(D[0]))}});b.g.da in v&&(x=b.g.hb(l,m),b.g.subscribe(l,b.g.da,()=>{var z=v[b.g.da]();z&&b.h.firstChild(l)&&z(l)}));g(v).forEach(z=>{var D=z.Fb.init,F=z.Fb.update,I=z.key;if(8===l.nodeType&&!b.h.$[I])throw Error("The binding '"+I+"' cannot be used with virtual elements");try{"function"==typeof D&&b.l.N(()=>{var N=D(l,E(I),C,x.$data,x);if(N&&N.controlsDescendantBindings){if(void 0!==B)throw Error("Multiple bindings ("+B+" and "+I+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
B=I}}),"function"==typeof F&&b.j(()=>F(l,E(I),C,x.$data,x),{i:l})}catch(N){throw N.message='Unable to process binding "'+I+": "+v[I]+'"\nMessage: '+N.message,N;}})}u=void 0===B;return{shouldBindDescendants:u,bindingContextForDescendants:u&&x}}function t(l,n){return l&&l instanceof b.ba?l:new b.ba(l,void 0,void 0,n)}var e=Symbol("_subscribable"),f=Symbol("_ancestorBindingInfo"),h=Symbol("_dataDependency");b.b={};var r={};b.ba=class{constructor(l,n,m,u,w){function v(){var D=E?B():B,F=b.a.f(D);n?(b.a.extend(y,
n),f in n&&(y[f]=n[f])):(y.$parents=[],y.$root=F,y.ko=b);y[e]=z;x?F=y.$data:(y.$rawData=D,y.$data=F);m&&(y[m]=F);u&&u(y,n,F);if(n&&n[e]&&!b.l.j().$a(n[e]))n[e]();C&&(y[h]=C);return y.$data}var y=this,x=l===r,B=x?void 0:l,E="function"==typeof B&&!b.O(B),C=w&&w.dataDependency;if(w&&w.exportDependencies)v();else{var z=b.oc(v);z.G();z.ga()?z.ra=null:y[e]=void 0}}["createChildContext"](l,n,m,u){!u&&n&&"object"==typeof n&&(u=n,n=u.as,m=u.extend);return new b.ba(l,this,n,(w,v)=>{w.$parentContext=v;w.$parent=
v.$data;w.$parents=(v.$parents||[]).slice(0);w.$parents.unshift(w.$parent);m&&m(w)},u)}["extend"](l,n){return new b.ba(r,this,null,m=>b.a.extend(m,"function"==typeof l?l(m):l),n)}};var p=b.a.c.V();class q{constructor(l,n,m){this.C=l;this.oa=n;this.xa=new Set;this.B=!1;n.D||b.a.I.ma(l,a);m&&m.D&&(m.D.xa.add(l),this.W=m)}Kb(){this.W&&this.W.D&&this.W.D.$b(this.C)}$b(l){this.xa.delete(l);!this.xa.size&&this.B&&this.Ab()}Ab(){this.B=!0;this.oa.D&&!this.xa.size&&(this.oa.D=null,b.a.I.fb(this.C,a),b.g.notify(this.C,
b.g.da),this.Kb())}}b.g={B:"childrenComplete",da:"descendantsComplete",subscribe:(l,n,m,u,w)=>{var v=b.a.c.Za(l,p,{});v.ea||(v.ea=new b.R);w&&w.notifyImmediately&&v.bb[n]&&b.l.N(m,u,[l]);return v.ea.subscribe(m,u,n)},notify:(l,n)=>{var m=b.a.c.get(l,p);if(m&&(m.bb[n]=!0,m.ea&&m.ea.s(l,n),n==b.g.B))if(m.D)m.D.Ab();else if(void 0===m.D&&m.ea&&m.ea.sa(b.g.da))throw Error("descendantsComplete event not supported for bindings on this node");},hb:(l,n)=>{var m=b.a.c.Za(l,p,{});m.D||(m.D=new q(l,m,n[f]));
return n[f]==m?n:n.extend(u=>{u[f]=m})}};b.rc=l=>(l=b.a.c.get(l,p))&&l.context;b.tb=(l,n,m)=>k(l,n,t(m));b.vb=(l,n)=>{1!==n.nodeType&&8!==n.nodeType||c(t(l),n)};b.ub=function(l,n,m){if(2>arguments.length){if(n=L.body,!n)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?");}else if(!n||1!==n.nodeType&&8!==n.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");d(t(l,m),n)};b.Bb=l=>(l=l&&[1,
8].includes(l.nodeType)&&b.rc(l))?l.$data:void 0;b.m("bindingHandlers",b.b);b.m("applyBindings",b.ub);b.m("applyBindingAccessorsToNode",b.tb);b.m("dataFor",b.Bb)})();(()=>{function a(f,h){var r={},p=t[f]||{},q=p.template;p=p.viewModel;if(q){q.element||c(f,"Unknown template value: "+q);q=q.element;var l=L.getElementById(q);l||c(f,"Cannot find element with ID "+q);l.matches("TEMPLATE")||c(f,"Template Source Element not a <template>");r.template=b.a.ya(l.content.childNodes)}p&&("function"!==typeof p[e]&&
c(f,"Unknown viewModel value: "+p),r[e]=p[e]);r.template&&r[e]?h(r):h(null)}function c(f,h){throw Error(`Component '${f}': ${h}`);}function d(f,h){var r=!1;a(f,p=>{(r=null!=p)&&h(p)});r||h(null)}var g=Object.create(null),k=Object.create(null);b.Ra={get:(f,h)=>{var r=k[f];if(r)b.Rb.Nb(()=>h(r.definition));else{var p=g[f];if(p)p.subscribe(h);else{p=g[f]=new b.R;p.subscribe(h);d(f,l=>{k[f]={definition:l};delete g[f];q?p.s(l):b.Rb.Nb(()=>p.s(l))});var q=!0}}},tc:f=>delete k[f],register:(f,h)=>{if(!h)throw Error("Invalid configuration for "+
f);if(t[f])throw Error("Component "+f+" is already registered");t[f]=h}};var t=Object.create(null),e="createViewModel";b.m("components",b.Ra);b.m("components.register",b.Ra.register)})();(()=>{var a=0;b.b.component={init:(c,d,g,k,t)=>{var e,f,h,r=()=>{var q=e&&e.dispose;"function"===typeof q&&q.call(e);h&&h.o();f=e=h=null},p=[...b.h.childNodes(c)];b.h.qa(c);b.a.I.ma(c,r);b.j(()=>{var q=b.a.f(d());if("string"!==typeof q){var l=b.a.f(q.params);q=b.a.f(q.name)}if(!q)throw Error("No component name specified");
var n=b.g.hb(c,t),m=f=++a;b.Ra.get(q,u=>{if(f===m){r();if(!u)throw Error("Unknown component '"+q+"'");var w=u.template;if(!w)throw Error("Component '"+q+"' has no template");b.h.ua(c,b.a.ya(w));e=u.createViewModel(l,{element:c,templateNodes:p});b.vb(n.createChildContext(e,{extend:v=>{v.$component=e;v.$componentTemplateNodes=p}}),c)}})},{i:c});return{controlsDescendantBindings:!0}}};b.h.$.component=!0})();b.b.attr={update:(a,c)=>{c=b.a.f(c())||{};b.a.L(c,function(d,g){g=b.a.f(g);var k=d.indexOf(":");
k="lookupNamespaceURI"in a&&0<k&&a.lookupNamespaceURI(d.slice(0,k));var t=!1===g||null==g;t?k?a.removeAttributeNS(k,d):a.removeAttribute(d):g=g.toString();t||(k?a.setAttributeNS(k,d,g):a.setAttribute(d,g));"name"===d&&(a.name=t?"":g)})}};var R=(a,c,d)=>{c&&c.split(/\s+/).forEach(g=>a.classList.toggle(g,d))};b.b.css={update:(a,c)=>{c=b.a.f(c());null!==c&&"object"==typeof c?b.a.L(c,(d,g)=>{g=b.a.f(g);R(a,d,!!g)}):(c=b.a.Pb(c),R(a,a.__ko__cssValue,!1),a.__ko__cssValue=c,R(a,c,!0))}};b.b.enable={update:(a,
c)=>{(c=b.a.f(c()))&&a.disabled?a.removeAttribute("disabled"):c||a.disabled||(a.disabled=!0)}};b.b.disable={update:(a,c)=>b.b.enable.update(a,()=>!b.a.f(c()))};b.b.event={init:(a,c,d,g,k)=>{d=c()||{};b.a.L(d,t=>{"string"==typeof t&&a.addEventListener(t,function(e){var f=c()[t];if(f)try{g=k.$data;var h=f.apply(g,[g,...arguments])}finally{!0!==h&&e.preventDefault()}})})}};b.b.foreach={Ib:a=>()=>{var c=a(),d=b.O(c)?c.G():c;if(!d||"number"==typeof d.length)return{foreach:c};b.a.f(c);return{foreach:d.data,
as:d.as,beforeRemove:d.beforeRemove}},init:(a,c)=>b.b.template.init(a,b.b.foreach.Ib(c)),update:(a,c,d,g,k)=>b.b.template.update(a,b.b.foreach.Ib(c),d,g,k)};b.F.Pa.foreach=!1;b.h.$.foreach=!0;b.b.hasfocus={init:(a,c,d)=>{var g=t=>{a.__ko_hasfocusUpdating=!0;t=a.ownerDocument.activeElement===a;var e=c();b.F.lb(e,d,"hasfocus",t,!0);a.__ko_hasfocusLastValue=t;a.__ko_hasfocusUpdating=!1},k=g.bind(null,!0);g=g.bind(null,!1);a.addEventListener("focus",k);a.addEventListener("focusin",k);a.addEventListener("blur",
g);a.addEventListener("focusout",g);a.__ko_hasfocusLastValue=!1},update:(a,c)=>{c=!!b.a.f(c());a.__ko_hasfocusUpdating||a.__ko_hasfocusLastValue===c||(c?a.focus():a.blur())}};b.F.jb.add("hasfocus");b.b.html={init:()=>({controlsDescendantBindings:!0}),update:(a,c)=>{b.a.Xa(a);c=b.a.f(c());if(null!=c){const d=L.createElement("template");d.innerHTML="string"!=typeof c?c.toString():c;a.appendChild(d.content)}}};(function(){function a(c,d,g){b.b[c]={init:(k,t,e,f,h)=>{var r,p={};d&&(p={as:e.get("as"),
exportDependencies:!0});var q=e.has(b.g.da);b.j(()=>{var l=b.a.f(t()),n=!g!==!l,m=!r;q&&(h=b.g.hb(k,h));if(n){p.dataDependency=b.l.j();var u=d?h.createChildContext("function"==typeof l?l:t,p):b.l.Ba()?h.extend(null,p):h}m&&b.l.Ba()&&(r=b.a.ya(b.h.childNodes(k),!0));n?(m||b.h.ua(k,b.a.ya(r)),b.vb(u,k)):(b.h.qa(k),b.g.notify(k,b.g.B))},{i:k});return{controlsDescendantBindings:!0}}};b.F.Pa[c]=!1;b.h.$[c]=!0}a("if");a("ifnot",!1,!0);a("with",!0)})();var S={};b.b.options={init:a=>{if(!a.matches("SELECT"))throw Error("options binding applies only to SELECT elements");
for(;0<a.length;)a.remove(0);return{controlsDescendantBindings:!0}},update:(a,c,d)=>{function g(){return Array.from(a.options).filter(m=>m.selected)}function k(m,u,w){var v=typeof u;return"function"==v?u(m):"string"==v?m[u]:w}function t(m,u){l&&r?b.g.notify(a,b.g.B):p.length&&(m=p.includes(b.A.M(u[0])),u[0].selected=m,l&&!m&&b.l.N(b.a.Sb,null,[a,"change"]))}var e=a.multiple,f=0!=a.length&&e?a.scrollTop:null,h=b.a.f(c()),r=d.get("valueAllowUnset")&&d.has("value");c={};var p=[];r||(e?p=g().map(b.A.M):
0<=a.selectedIndex&&p.push(b.A.M(a.options[a.selectedIndex])));if(h){"undefined"==typeof h.length&&(h=[h]);var q=h.filter(m=>m||null==m);d.has("optionsCaption")&&(h=b.a.f(d.get("optionsCaption")),null!==h&&void 0!==h&&q.unshift(S))}var l=!1;c.beforeRemove=m=>a.removeChild(m);h=t;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(h=(m,u)=>{t(m,u);b.l.N(d.get("optionsAfterRender"),null,[u[0],m!==S?m:void 0])});b.a.Ob(a,q,function(m,u,w){w.length&&(p=!r&&w[0].selected?[b.A.M(w[0])]:
[],l=!0);u=a.ownerDocument.createElement("option");m===S?(b.a.gb(u,d.get("optionsCaption")),b.A.Ma(u,void 0)):(w=k(m,d.get("optionsValue"),m),b.A.Ma(u,b.a.f(w)),m=k(m,d.get("optionsText"),w),b.a.gb(u,m));return[u]},c,h);if(!r){var n;e?n=p.length&&g().length<p.length:n=p.length&&0<=a.selectedIndex?b.A.M(a.options[a.selectedIndex])!==p[0]:p.length||0<=a.selectedIndex;n&&b.l.N(b.a.Sb,null,[a,"change"])}(r||b.l.ab())&&b.g.notify(a,b.g.B);f&&20<Math.abs(f-a.scrollTop)&&(a.scrollTop=f)}};b.b.options.cb=
b.a.c.V();b.b.style={update:(a,c)=>{c=b.a.f(c()||{});b.a.L(c,(d,g)=>{g=b.a.f(g);if(null==g||!1===g)g="";if(/^--/.test(d))a.style.setProperty(d,g);else{d=d.replace(/-(\w)/g,(t,e)=>e.toUpperCase());var k=a.style[d];a.style[d]=g;g===k||a.style[d]!=k||isNaN(g)||(a.style[d]=g+"px")}})}};b.b.submit={init:(a,c,d,g,k)=>{if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.addEventListener("submit",t=>{var e=c();try{var f=e.call(k.$data,a)}finally{!0!==f&&(t.preventDefault?
t.preventDefault():t.returnValue=!1)}})}};b.b.text={init:()=>({controlsDescendantBindings:!0}),update:(a,c)=>{8===a.nodeType&&(a.text||a.after(a.text=L.createTextNode("")),a=a.text);b.a.gb(a,c())}};b.h.$.text=!0;b.b.textInput={init:(a,c,d)=>{var g=a.value,k,t,e=()=>{clearTimeout(k);t=k=void 0;var h=a.value;g!==h&&(g=h,b.F.lb(c(),d,"textInput",h))},f=()=>{var h=b.a.f(c());null==h&&(h="");void 0!==t&&h===t?setTimeout(f,4):a.value!==h&&(a.value=h,g=a.value)};a.addEventListener("input",e);a.addEventListener("change",
e);a.addEventListener("blur",e);b.j(f,{i:a})}};b.F.jb.add("textInput");b.b.textinput={preprocess:(a,c,d)=>d("textInput",a)};b.b.value={init:(a,c,d)=>{var g=a.matches("SELECT"),k=a.matches("INPUT");if(!k||"checkbox"!=a.type&&"radio"!=a.type){var t=new Set,e=d.get("valueUpdate"),f=null;e&&("string"==typeof e?t.add(e):e.forEach(q=>t.add(q)),t.delete("change"));var h=()=>{f=null;var q=c(),l=b.A.M(a);b.F.lb(q,d,"value",l)};t.forEach(q=>{var l=h;(q||"").startsWith("after")&&(l=()=>{f=b.A.M(a);setTimeout(h,
0)},q=q.slice(5));a.addEventListener(q,l)});var r=k&&"file"==a.type?()=>{var q=b.a.f(c());null==q||""===q?a.value="":b.l.N(h)}:()=>{var q=b.a.f(c()),l=b.A.M(a);if(null!==f&&q===f)setTimeout(r,0);else if(q!==l||void 0===l)g?(l=d.get("valueAllowUnset"),b.A.Ma(a,q,l),l||q===b.A.M(a)||b.l.N(h)):b.A.Ma(a,q)};if(g){var p;b.g.subscribe(a,b.g.B,()=>{p?d.get("valueAllowUnset")?r():h():(a.addEventListener("change",h),p=b.j(r,{i:a}))},null,{notifyImmediately:!0})}else a.addEventListener("change",h),b.j(r,{i:a})}else b.tb(a,
{checkedValue:c})},update:()=>{}};b.F.jb.add("value");b.b.visible={update:(a,c)=>{c=b.a.f(c());var d="none"!=a.style.display;c&&!d?a.style.display="":d&&!c&&(a.style.display="none")}};b.b.hidden={update:(a,c)=>a.hidden=!!b.a.f(c())};(function(a){b.b[a]={init:function(c,d,g,k,t){return b.b.event.init.call(this,c,()=>({[a]:d()}),g,k,t)}}})("click");(()=>{let a=b.a.c.V();class c{constructor(g){this.Ua=g}Ia(...g){let k=this.Ua;if(!g.length)return b.a.c.get(k,a)||(11===this.C?k.content:1===this.C?k:void 0);
b.a.c.set(k,a,g[0])}}class d extends c{constructor(g){super(g);g&&(this.C=g.matches("TEMPLATE")&&g.content?g.content.nodeType:1)}}b.Ja={Ua:d,Oa:c}})();(()=>{function a(e,f){if(e.length){var h=e[0],r=h.parentNode;g(h,e[e.length-1],p=>{1!==p.nodeType&&8!==p.nodeType||b.ub(f,p)});b.a.Aa(e,r)}}function c(e,f,h,r){var p=(e&&(e.nodeType?e:0<e.length?e[0]:null)||h||{}).ownerDocument;if("string"==typeof h){p=p||L;p=p.getElementById(h);if(!p)throw Error("Cannot find template with ID "+h);h=new b.Ja.Ua(p)}else if([1,
8].includes(h.nodeType))h=new b.Ja.Oa(h);else throw Error("Unknown template type: "+h);h=(h=h.Ia?h.Ia():null)?[...h.cloneNode(!0).childNodes]:null;if("number"!=typeof h.length||0<h.length&&"number"!=typeof h[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(f){case "replaceChildren":b.h.ua(e,h);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+f);}p&&(a(h,r),"replaceChildren"==f&&b.g.notify(e,b.g.B));return h}function d(e,f,
h){return b.O(e)?e():"function"===typeof e?e(f,h):e}var g=(e,f,h)=>{var r;for(f=b.h.nextSibling(f);e&&(r=e)!==f;)e=b.h.nextSibling(r),h(r,e)};b.pc=function(e,f,h,r){h=h||{};var p=p||"replaceChildren";if(r){var q=r.nodeType?r:0<r.length?r[0]:null;return b.j(()=>{var l=f&&f instanceof b.ba?f:new b.ba(f,null,null,null,{exportDependencies:!0}),n=d(e,l.$data,l);c(r,p,n,l,h)},{pa:()=>!q||!b.a.Wa(q),i:q})}console.log("no targetNodeOrNodeArray")};b.qc=(e,f,h,r,p)=>{function q(v,y){b.l.N(b.a.Ob,null,[r,v,
m,h,u,y]);b.g.notify(r,b.g.B)}var l,n=h.as,m=(v,y)=>{l=p.createChildContext(v,{as:n,extend:x=>{x.$index=y;n&&(x[n+"Index"]=y)}});v=d(e,v,l);return c(r,"ignoreTargetNode",v,l,h)},u=(v,y)=>{a(y,l);l=null};if(!h.beforeRemove&&b.Hb(f)){q(f.G());var w=f.subscribe(v=>{q(f(),v)},null,"arrayChange");w.i(r);return w}return b.j(()=>{var v=b.a.f(f)||[];"undefined"==typeof v.length&&(v=[v]);q(v)},{i:r})};var k=b.a.c.V(),t=b.a.c.V();b.b.template={init:(e,f)=>{f=b.a.f(f());if("string"==typeof f||"name"in f)b.h.qa(e);
else if("nodes"in f){f=f.nodes||[];if(b.O(f))throw Error('The "nodes" option must be a plain, non-observable array.');let h=f[0]&&f[0].parentNode;h&&b.a.c.get(h,t)||(h=b.a.Jb(f),b.a.c.set(h,t,!0));(new b.Ja.Oa(e)).Ia(h)}else if(f=b.h.childNodes(e),0<f.length)f=b.a.Jb(f),(new b.Ja.Oa(e)).Ia(f);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:(e,f,h,r,p)=>{var q=f();f=b.a.f(q);h=!0;r=null;"string"==typeof f?f={}:(q="name"in
f?f.name:e,"if"in f&&(h=b.a.f(f["if"])),h&&"ifnot"in f&&(h=!b.a.f(f.ifnot)),h&&!q&&(h=!1));"foreach"in f?r=b.qc(q,h&&f.foreach||[],f,e,p):h?(h=p,"data"in f&&(h=p.createChildContext(f.data,{as:f.as,exportDependencies:!0})),r=b.pc(q,h,f,e)):b.h.qa(e);p=r;(f=b.a.c.get(e,k))&&"function"==typeof f.o&&f.o();b.a.c.set(e,k,!p||p.ga&&!p.ga()?void 0:p)}};b.F.Pa.template=e=>{e=b.F.mc(e);return 1==e.length&&e[0].unknown||b.F.kc(e,"name")?null:"This template engine does not support anonymous templates nested within its templates"};
b.h.$.template=!0})();b.a.Eb=(a,c,d)=>{if(a.length&&c.length){var g,k,t,e,f;for(g=k=0;(!d||g<d)&&(e=a[k]);++k){for(t=0;f=c[t];++t)if(e.value===f.value){e.moved=f.index;f.moved=e.index;c.splice(t,1);g=t=0;break}g+=t}}};b.a.zb=(()=>{function a(c,d,g,k,t){var e=Math.min,f=Math.max,h=[],r,p=c.length,q,l=d.length,n=l-p||1,m=p+l+1,u;for(r=0;r<=p;r++){var w=u;h.push(u=[]);var v=e(l,r+n);for(q=f(0,r-1);q<=v;q++)u[q]=q?r?c[r-1]===d[q-1]?w[q-1]:e(w[q]||m,u[q-1]||m)+1:q+1:r+1}e=[];f=[];n=[];r=p;for(q=l;r||q;)l=
h[r][q]-1,q&&l===h[r][q-1]?f.push(e[e.length]={status:g,value:d[--q],index:q}):r&&l===h[r-1][q]?n.push(e[e.length]={status:k,value:c[--r],index:r}):(--q,--r,t.sparse||e.push({status:"retained",value:d[q]}));b.a.Eb(n,f,!t.dontLimitMoves&&10*p);return e.reverse()}return function(c,d,g){g="boolean"===typeof g?{dontLimitMoves:g}:g||{};c=c||[];d=d||[];return c.length<d.length?a(c,d,"added","deleted",g):a(d,c,"deleted","added",g)}})();(()=>{function a(g,k,t,e,f){var h=[],r=b.j(()=>{var p=k(t,f,b.a.Aa(h,
g))||[];if(0<h.length){var q=h.nodeType?[h]:h;if(0<q.length){var l=q[0],n=l.parentNode,m;var u=0;for(m=p.length;u<m;u++)n.insertBefore(p[u],l);u=0;for(m=q.length;u<m;u++)b.removeNode(q[u])}e&&b.l.N(e,null,[t,p,f])}h.length=0;h.push(...p)},{i:g,pa:()=>!!h.find(b.a.Wa)});return{K:h,Sa:r.ga()?r:void 0}}var c=b.a.c.V(),d=b.a.c.V();b.a.Ob=(g,k,t,e,f,h)=>{function r(C){x={aa:C,Da:b.Z(m++)};l.push(x)}function p(C){x=q[C];x.Da(m++);b.a.Aa(x.K,g);l.push(x)}k=k||[];"undefined"==typeof k.length&&(k=[k]);e=e||
{};var q=b.a.c.get(g,c),l=[],n=0,m=0,u=[],w=[],v=[],y=0;if(q){if(!h||q&&q._countWaitingForRemove)h=Array.prototype.map.call(q,C=>C.aa),h=b.a.zb(h,k,{dontLimitMoves:e.dontLimitMoves,sparse:!0});for(let C=0,z,D,F;z=h[C];C++)switch(D=z.moved,F=z.index,z.status){case "deleted":for(;n<F;)p(n++);if(void 0===D){var x=q[n];x.Sa&&(x.Sa.o(),x.Sa=void 0);b.a.Aa(x.K,g).length&&(e.beforeRemove&&(l.push(x),y++,x.aa===d?x=null:v[x.Da.G()]=x),x&&u.push.apply(u,x.K))}n++;break;case "added":for(;m<F;)p(n++);void 0!==
D?(w.push(l.length),p(D)):r(z.value)}for(;m<k.length;)p(n++);l._countWaitingForRemove=y}else k.forEach(r);b.a.c.set(g,c,l);u.forEach(e.beforeRemove?b.ca:b.removeNode);var B,E;y=g.ownerDocument.activeElement;if(w.length)for(;void 0!=(k=w.shift());){x=l[k];for(B=void 0;k;)if((E=l[--k].K)&&E.length){B=E[E.length-1];break}for(n=0;u=x.K[n];B=u,n++)b.h.Gb(g,u,B)}for(k=0;x=l[k];k++){x.K||b.a.extend(x,a(g,t,x.aa,f,x.Da));for(n=0;u=x.K[n];B=u,n++)b.h.Gb(g,u,B);!x.hc&&f&&(f(x.aa,x.K,x.Da),x.hc=!0,B=x.K[x.K.length-
1])}y&&g.ownerDocument.activeElement!=y&&y.focus();(function(C,z){if(C)for(var D=0,F=z.length;D<F;D++)z[D]&&z[D].K.forEach(I=>C(I,D,z[D].aa))})(e.beforeRemove,v);for(k=0;k<v.length;++k)v[k]&&(v[k].aa=d)}})();T.ko=P})(this);
(T=>{function O(a,c){return null===a||U[typeof a]?a===c:!1}function V(a,c){var e;return()=>{e||(e=setTimeout(()=>{e=0;a()},c))}}function W(a,c){var e;return()=>{clearTimeout(e);e=setTimeout(a,c)}}function X(a,c){c?.A?.()}function Y(a,c){var e=this.bc,f=e[A];f.aa||(this.Wa&&this.Ca[c]?(e.vb(c,a,this.Ca[c]),this.Ca[c]=null,--this.Wa):f.C[c]||e.vb(c,a,f.D?{X:a}:e.Tb(a)),a.la&&a.Yb())}var L=T.document,P={},b="undefined"!==typeof P?P:{};b.v=(a,c)=>{a=a.split(".");for(var e=b,f=0,k=a.length-1;f<k;f++)e=
e[a[f]];e[a[k]]=c};b.ja=(a,c,e)=>{a[c]=e};b.v("version","3.5.1-sm");b.g={extend:(a,c)=>c?Object.assign(a,c):a,P:(a,c)=>a&&Object.entries(a).forEach(e=>c(e[0],e[1])),$a:a=>[...a.childNodes].forEach(c=>b.removeNode(c)),Mb:a=>{a=[...a];var c=(a[0]?.ownerDocument||L).createElement("div");a.forEach(e=>c.append(b.ga(e)));return c},Ba:(a,c)=>Array.prototype.map.call(a,c?e=>b.ga(e.cloneNode(!0)):e=>e.cloneNode(!0)),wa:(a,c)=>{b.g.$a(a);c&&a.append(...c)},Da:(a,c)=>{if(a.length){for(c=8===c.nodeType&&c.parentNode||
c;a.length&&a[0].parentNode!==c;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==c;)--a.length;if(1<a.length){c=a[0];var e=a[a.length-1];for(a.length=0;c!==e;)a.push(c),c=c.nextSibling;a.push(e)}}return a},Sb:a=>null==a?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,""),Za:a=>a.ownerDocument.documentElement.contains(1!==a.nodeType?a.parentNode:a),Vb:(a,c)=>{if(!a?.nodeType)throw Error("element must be a DOM node when calling triggerEvent");a.dispatchEvent(new Event(c))},
j:a=>b.T(a)?a():a,jb:(a,c)=>a.textContent=b.g.j(c)||""};b.v("utils",b.g);b.v("unwrap",b.g.j);(()=>{let a=0,c="__ko__"+Date.now(),e=new WeakMap;b.g.i={get:(f,k)=>(e.get(f)||{})[k],set:(f,k,n)=>{e.has(f)?e.get(f)[k]=n:e.set(f,{[k]:n});return n},bb:function(f,k,n){return this.get(f,k)||this.set(f,k,n)},clear:f=>e.delete(f),Z:()=>a++ +c}})();b.g.L=(()=>{var a=b.g.i.Z(),c={1:1,8:1,9:1},e={1:1,9:1};const f=(d,g)=>{var h=b.g.i.get(d,a);g&&!h&&(h=new Set,b.g.i.set(d,a,h));return h},k=d=>{var g=f(d);g&&(new Set(g)).forEach(h=>
h(d));b.g.i.clear(d);e[d.nodeType]&&n(d.childNodes,!0)},n=(d,g)=>{for(var h=[],r,t=0;t<d.length;t++)if(!g||8===d[t].nodeType)if(k(h[h.length]=r=d[t]),d[t]!==r)for(;t--&&!h.includes(d[t]););};return{oa:(d,g)=>{if("function"!=typeof g)throw Error("Callback must be a function");f(d,1).add(g)},ib:(d,g)=>{var h=f(d);h&&(h.delete(g),h.size||b.g.i.set(d,a,null))},ga:d=>{b.u.S(()=>{c[d.nodeType]&&(k(d),e[d.nodeType]&&n(d.getElementsByTagName("*")))});return d},removeNode:d=>{b.ga(d);d.parentNode&&d.parentNode.removeChild(d)}}})();
b.ga=b.g.L.ga;b.removeNode=b.g.L.removeNode;b.v("utils.domNodeDisposal",b.g.L);b.v("utils.domNodeDisposal.addDisposeCallback",b.g.L.oa);b.Ub=(()=>{var a=[],c=0,e=0,f=()=>{if(c)for(var d=c,g=0,h;e<c;)if(h=a[e++]){if(e>d){if(5E3<=++g){e=c;setTimeout(()=>{throw Error(`'Too much recursion' after processing ${g} task groups.`);},0);break}d=c}try{h()}catch(r){setTimeout(()=>{throw r;},0)}}},k=()=>{f();e=c=a.length=0},n=(d=>{var g=L.createElement("div");(new MutationObserver(d)).observe(g,{attributes:!0});
return()=>g.classList.toggle("foo")})(k);return{Qb:d=>{c||n(k);a[c++]=d}}})();b.ab={debounce:(a,c)=>a.Ka(e=>W(e,c)),rateLimit:(a,c)=>{if("number"==typeof c)var e=c;else{e=c.timeout;var f=c.method}var k="function"==typeof f?f:V;a.Ka(n=>k(n,e,c))},notify:(a,c)=>{a.sa="always"==c?null:O}};var U={undefined:1,"boolean":1,number:1,string:1};b.v("extenders",b.ab);class Z{constructor(a,c,e){this.X=a;this.pb=c;this.va=e;this.Qa=!1;this.M=this.$=null;b.ja(this,"dispose",this.A)}A(){this.Qa||(this.M&&b.g.L.ib(this.$,
this.M),this.Qa=!0,this.va(),this.X=this.pb=this.va=this.$=this.M=null)}o(a){this.$=a;b.g.L.oa(a,this.M=this.A.bind(this))}}b.V=function(){Object.setPrototypeOf(this,G);G.Ha(this)};var G={Ha:a=>{a.W=new Map;a.W.set("change",new Set);a.ub=1},subscribe:function(a,c,e){var f=this;e=e||"change";var k=new Z(f,c?a.bind(c):a,()=>{f.W.get(e).delete(k);f.za&&f.za(e)});f.pa&&f.pa(e);f.W.has(e)||f.W.set(e,new Set);f.W.get(e).add(k);return k},B:function(a,c){c=c||"change";"change"===c&&this.Na();if(this.ta(c)){c=
"change"===c&&this.Wb||new Set(this.W.get(c));try{b.u.zb(),c.forEach(e=>{e.Qa||e.pb(a)})}finally{b.u.end()}}},Fa:function(){return this.ub},ic:function(a){return this.Fa()!==a},Na:function(){++this.ub},Ka:function(a){var c=this,e=b.T(c),f,k,n,d,g;c.ya||(c.ya=c.B,c.B=function(r,t){t&&"change"!==t?"beforeChange"===t?this.rb(r):this.ya(r,t):this.sb(r)});var h=a(()=>{c.la=!1;e&&d===c&&(d=c.qb?c.qb():c());var r=k||g&&c.Ja(n,d);g=k=f=!1;r&&c.ya(n=d)});c.sb=(r,t)=>{t&&c.la||(g=!t);c.Wb=new Set(c.W.get("change"));
c.la=f=!0;d=r;h()};c.rb=r=>{f||(n=r,c.ya(r,"beforeChange"))};c.tb=()=>{g=!0};c.Yb=()=>{c.Ja(n,c.J(!0))&&(k=!0)}},ta:function(a){return(this.W.get(a)||[]).size},Ja:function(a,c){return!this.sa||!this.sa(a,c)},toString:()=>"[object Object]",extend:function(a){var c=this;a&&b.g.P(a,(e,f)=>{e=b.ab[e];"function"==typeof e&&(c=e(c,f)||c)});return c}};b.ja(G,"init",G.Ha);b.ja(G,"subscribe",G.subscribe);b.ja(G,"extend",G.extend);Object.setPrototypeOf(G,Function.prototype);b.V.fn=G;b.lc=a=>"function"==typeof a?.subscribe&&
"function"==typeof a.B;(()=>{var a=[],c,e=0;b.u={zb:f=>{a.push(c);c=f},end:()=>c=a.pop(),Pb:f=>{if(c){if(!b.lc(f))throw Error("Only subscribable things can act as dependencies");c.$b.call(c.ac,f,f.Xb||(f.Xb=++e))}},S:(f,k,n)=>{try{return a.push(c),c=void 0,f.apply(k,n||[])}finally{c=a.pop()}},Ea:()=>c?.s.Ea(),eb:()=>c?.eb,s:()=>c?.s}})();const F=Symbol("_latestValue");b.ca=a=>{function c(){if(0<arguments.length)return c.Ja(c[F],arguments[0])&&(c.nb(),c[F]=arguments[0],c.Oa()),this;b.u.Pb(c);return c[F]}
c[F]=a;Object.defineProperty(c,"length",{get:()=>null==c[F]?void 0:c[F].length});b.V.fn.Ha(c);Object.setPrototypeOf(c,I);return c};var I={toJSON:function(){let a=this[F];return a?.toJSON?.()||a},sa:O,J:function(){return this[F]},Oa:function(){this.B(this[F],"spectate");this.B(this[F])},nb:function(){this.B(this[F],"beforeChange")}};Object.setPrototypeOf(I,b.V.fn);var J=b.ca.rc="__ko_proto__";I[J]=b.ca;b.T=a=>{if((a="function"==typeof a&&a[J])&&a!==I[J]&&a!==b.s.fn[J])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");
return!!a};b.mc=a=>"function"==typeof a&&(a[J]===I[J]||a[J]===b.s.fn[J]&&a.jc);b.v("observable",b.ca);b.v("isObservable",b.T);b.v("observable.fn",I);b.ja(I,"valueHasMutated",I.Oa);b.ka=a=>{a=a||[];if("object"!=typeof a||!("length"in a))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");a=b.ca(a);Object.setPrototypeOf(a,b.ka.fn);return a.extend({trackArrayChanges:!0})};b.ka.fn={remove:function(a){for(var c=this.J(),e=!1,f="function"!=typeof a||
b.T(a)?d=>d===a:a,k=c.length;k--;){var n=c[k];if(f(n)){if(c[k]!==n)throw Error("Array modified during remove; cannot remove item");e||this.nb();e=!0;c.splice(k,1)}}e&&this.Oa()}};Object.setPrototypeOf(b.ka.fn,b.ca.fn);Object.getOwnPropertyNames(Array.prototype).forEach(a=>{"function"===typeof Array.prototype[a]&&"constructor"!=a&&("copyWithin fill pop push reverse shift sort splice unshift".split(" ").includes(a)?b.ka.fn[a]=function(...c){var e=this.J();this.nb();this.Bb(e,a,c);c=e[a](...c);this.Oa();
return c===e?this:c}:b.ka.fn[a]=function(...c){return this()[a](...c)})});b.Kb=a=>b.T(a)&&"function"==typeof a.remove&&"function"==typeof a.push;b.v("observableArray",b.ka);b.v("isObservableArray",b.Kb);b.ab.trackArrayChanges=(a,c)=>{function e(){function q(){if(g){var m=[].concat(a.J()||[]);if(a.ta("arrayChange")){if(!k||1<g)k=b.g.Cb(h,m,a.Ta);var l=k}h=m;k=null;g=0;l?.length&&a.B(l,"arrayChange")}}f?q():(f=!0,d=a.subscribe(()=>++g,null,"spectate"),h=[].concat(a.J()||[]),k=null,n=a.subscribe(q))}
a.Ta={};"object"==typeof c&&b.g.extend(a.Ta,c);a.Ta.sparse=!0;if(!a.Bb){var f=!1,k=null,n,d,g=0,h,r=a.pa,t=a.za;a.pa=q=>{r&&r.call(a,q);"arrayChange"===q&&e()};a.za=q=>{t&&t.call(a,q);"arrayChange"!==q||a.ta("arrayChange")||(n&&n.A(),d&&d.A(),d=n=null,f=!1,h=void 0)};a.Bb=(q,m,l)=>{function p(D,B,y){return u[u.length]={status:D,value:B,index:y}}if(f&&!g){var u=[],w=q.length,v=l.length,z=0;switch(m){case "push":z=w;case "unshift":for(q=0;q<v;q++)p("added",l[q],z+q);break;case "pop":z=w-1;case "shift":w&&
p("deleted",q[z],z);break;case "splice":z=Math.min(Math.max(0,0>l[0]?w+l[0]:l[0]),w);w=1===v?w:Math.min(z+(l[1]||0),w);v=z+v-2;m=Math.max(w,v);var x=[],E=[];for(let D=z,B=2;D<m;++D,++B)D<w&&E.push(p("deleted",q[D],D)),D<v&&x.push(p("added",l[B],D));b.g.Hb(E,x);break;default:return}k=u}}}};var A=Symbol("_state");b.s=(a,c)=>{function e(){if(0<arguments.length){if("function"!==typeof f)throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
f(...arguments);return this}k.aa||b.u.Pb(e);(k.Y||k.D&&e.ua())&&e.U();return k.N}"object"===typeof a?c=a:(c=c||{},a&&(c.read=a));if("function"!=typeof c.read)throw Error("Pass a function that returns the value of the ko.computed");var f=c.write,k={N:void 0,ba:!0,Y:!0,Ia:!1,lb:!1,aa:!1,hb:!1,D:!1,Ob:c.read,o:c.disposeWhenNodeIsRemoved||c.o||null,qa:c.disposeWhen||c.qa,Ya:null,C:{},K:0,Gb:null};e[A]=k;e.jc="function"===typeof f;b.V.fn.Ha(e);Object.setPrototypeOf(e,M);c.pure?(k.hb=!0,k.D=!0,b.g.extend(e,
aa)):c.deferEvaluation&&b.g.extend(e,ba);k.o&&(k.lb=!0,k.o.nodeType||(k.o=null));k.D||c.deferEvaluation||e.U();k.o&&e.isActive()&&b.g.L.oa(k.o,k.Ya=()=>{e.A()});return e};var M={sa:O,Ea:function(){return this[A].K},fc:function(){var a=[];b.g.P(this[A].C,(c,e)=>a[e.ma]=e.X);return a},cb:function(a){if(!this[A].K)return!1;var c=this.fc();return c.includes(a)||!!c.find(e=>e.cb&&e.cb(a))},vb:function(a,c,e){if(this[A].hb&&c===this)throw Error("A 'pure' computed must not be called recursively");this[A].C[a]=
e;e.ma=this[A].K++;e.na=c.Fa()},ua:function(){var a,c=this[A].C;for(a in c)if(Object.prototype.hasOwnProperty.call(c,a)){var e=c[a];if(this.xa&&e.X.la||e.X.ic(e.na))return!0}},xc:function(){this[A].Ia||this.xa?.(!1)},isActive:function(){var a=this[A];return a.Y||0<a.K},yc:function(){this.la?this[A].Y&&(this[A].ba=!0):this.Fb()},Tb:function(a){return a.subscribe(this.Fb,this)},Fb:function(){var a=this,c=a.throttleEvaluation;0<=c?(clearTimeout(this[A].Gb),this[A].Gb=setTimeout(()=>a.U(!0),c)):a.xa?
a.xa(!0):a.U(!0)},U:function(a){var c=this[A],e=c.qa,f=!1;if(!c.Ia&&!c.aa){if(c.o&&!b.g.Za(c.o)||e?.()){if(!c.lb){this.A();return}}else c.lb=!1;c.Ia=!0;try{f=this.dc(a)}finally{c.Ia=!1}return f}},dc:function(a){var c=this[A],e=c.hb?void 0:!c.K;var f={bc:this,Ca:c.C,Wa:c.K};b.u.zb({ac:f,$b:Y,s:this,eb:e});c.C={};c.K=0;a:{try{var k=c.Ob();break a}finally{b.u.end(),f.Wa&&!c.D&&b.g.P(f.Ca,X),c.ba=c.Y=!1}k=void 0}c.K?f=this.Ja(c.N,k):(this.A(),f=!0);f&&(c.D?this.Na():this.B(c.N,"beforeChange"),c.N=k,this.B(c.N,
"spectate"),!c.D&&a&&this.B(c.N),this.tb&&this.tb());e&&this.B(c.N,"awake");return f},J:function(a){var c=this[A];(c.Y&&(a||!c.K)||c.D&&this.ua())&&this.U();return c.N},Ka:function(a){b.V.fn.Ka.call(this,a);this.qb=function(){this[A].D||(this[A].ba?this.U():this[A].Y=!1);return this[A].N};this.xa=function(c){this.rb(this[A].N);this[A].Y=!0;c&&(this[A].ba=!0);this.sb(this,!c)}},A:function(){var a=this[A];!a.D&&a.C&&b.g.P(a.C,(c,e)=>e.A?.());a.o&&a.Ya&&b.g.L.ib(a.o,a.Ya);a.C=void 0;a.K=0;a.aa=!0;a.ba=
!1;a.Y=!1;a.D=!1;a.o=void 0;a.qa=void 0;a.Ob=void 0}},aa={pa:function(a){var c=this,e=c[A];if(!e.aa&&e.D&&"change"==a){e.D=!1;if(e.ba||c.ua())e.C=null,e.K=0,c.U()&&c.Na();else{var f=[];b.g.P(e.C,(k,n)=>f[n.ma]=k);f.forEach((k,n)=>{var d=e.C[k],g=c.Tb(d.X);g.ma=n;g.na=d.na;e.C[k]=g});c.ua()&&c.U()&&c.Na()}e.aa||c.B(e.N,"awake")}},za:function(a){var c=this[A];c.aa||"change"!=a||this.ta("change")||(b.g.P(c.C,(e,f)=>{f.A&&(c.C[e]={X:f.X,ma:f.ma,na:f.na},f.A())}),c.D=!0,this.B(void 0,"asleep"))},Fa:function(){var a=
this[A];a.D&&(a.ba||this.ua())&&this.U();return b.V.fn.Fa.call(this)}},ba={pa:function(a){"change"!=a&&"beforeChange"!=a||this.J()}};Object.setPrototypeOf(M,b.V.fn);var Q=b.ca.rc;M[Q]=b.s;b.v("computed",b.s);b.v("isComputed",a=>"function"==typeof a&&a[Q]===M[Q]);b.v("computed.fn",M);b.ja(M,"dispose",M.A);b.sc=a=>{if("function"===typeof a)return b.s(a,{pure:!0});a={...a,pure:!0};return b.s(a)};(()=>{b.F={R:a=>{switch(a.nodeName){case "OPTION":return!0===a.__ko__hasDomDataOptionValue__?b.g.i.get(a,
b.h.options.gb):a.value;case "SELECT":return 0<=a.selectedIndex?b.F.R(a.options[a.selectedIndex]):void 0;default:return a.value}},Pa:(a,c,e)=>{switch(a.nodeName){case "OPTION":"string"===typeof c?(b.g.i.set(a,b.h.options.gb,void 0),delete a.__ko__hasDomDataOptionValue__,a.value=c):(b.g.i.set(a,b.h.options.gb,c),a.__ko__hasDomDataOptionValue__=!0,a.value="number"===typeof c?c:"");break;case "SELECT":for(var f=-1,k=""===c||null==c,n=0,d=a.options.length,g;n<d;++n)if(g=b.F.R(a.options[n]),g==c||""===
g&&k){f=n;break}if(e||0<=f||k&&1<a.size)a.selectedIndex=f;break;default:a.value=null==c?"":c}}}})();b.I=(()=>{function a(g){g=b.g.Sb(g);123===g.charCodeAt(0)&&(g=g.slice(1,-1));g+="\n,";var h=[],r=g.match(f),t=[],q=0;if(1<r.length){for(var m=0,l;l=r[m++];){var p=l.charCodeAt(0);if(44===p){if(0>=q){h.push(u&&t.length?{key:u,value:t.join("")}:{unknown:u||t.join("")});var u=q=0;t=[];continue}}else if(58===p){if(!q&&!u&&1===t.length){u=t.pop();continue}}else if(47===p&&1<l.length&&(47===l.charCodeAt(1)||
42===l.charCodeAt(1)))continue;else 47===p&&m&&1<l.length?(p=r[m-1].match(k))&&!n[p[0]]&&(g=g.slice(g.indexOf(l)+1),r=g.match(f),m=-1,l="/"):40===p||123===p||91===p?++q:41===p||125===p||93===p?--q:u||t.length||34!==p&&39!==p||(l=l.slice(1,-1));t.push(l)}if(0<q)throw Error("Unbalanced parentheses, braces, or brackets");}return h}var c=["true","false","null","undefined"],e=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,f=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]",
"g"),k=/[\])"'A-Za-z0-9_$]+$/,n={"in":1,"return":1,"typeof":1},d=new Set;return{Sa:[],mb:d,pc:a,qc:function(g,h){function r(p,u){if(!l){var w=b.h[p];if(w&&w.preprocess&&!(u=w.preprocess(u,p,r)))return;if(w=d.has(p)){var v=u;c.includes(v)?v=!1:(w=v.match(e),v=null===w?!1:w[1]?"Object("+w[1]+")"+w[2]:v);w=v}w&&q.push("'"+p+"':function(_z){"+v+"=_z}")}m&&(u="function(){return "+u+" }");t.push("'"+p+"':"+u)}h=h||{};var t=[],q=[],m=h.valueAccessors,l=h.bindingParams;("string"===typeof g?a(g):g).forEach(p=>
r(p.key||p.unknown,p.value));q.length&&r("_ko_property_writers","{"+q.join(",")+" }");return t.join(",")},nc:(g,h)=>-1<g.findIndex(r=>r.key==h),ob:(g,h,r,t,q)=>{if(g&&b.T(g))!b.mc(g)||q&&g.J()===t||g(t);else if((g=h.get("_ko_property_writers"))&&g[r])g[r](t)}}})();(()=>{function a(d){return 8==d.nodeType&&f.test(d.nodeValue)}function c(d){return 8==d.nodeType&&k.test(d.nodeValue)}function e(d,g){for(var h=d,r=1,t=[];h=h.nextSibling;){if(c(h)&&(b.g.i.set(h,n,!0),!--r))return t;t.push(h);a(h)&&++r}if(!g)throw Error("Cannot find closing comment tag to match: "+
d.nodeValue);return null}var f=/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=/^\s*\/ko\s*$/,n="__ko_matchedEndComment__";b.m={da:{},childNodes:d=>a(d)?e(d):d.childNodes,ra:d=>{a(d)?(d=e(d))&&[...d].forEach(g=>b.removeNode(g)):b.g.$a(d)},wa:(d,g)=>{a(d)?(b.m.ra(d),d.after(...g)):b.g.wa(d,g)},prepend:(d,g)=>{a(d)?d.nextSibling.before(g):d.prepend(g)},Jb:(d,g,h)=>{h?h.after(g):b.m.prepend(d,g)},firstChild:d=>{if(a(d))return d=d.nextSibling,!d||c(d)?null:d;let g=d.firstChild;if(g&&c(g))throw Error("Found invalid end comment, as the first child of "+
d);return g},nextSibling:d=>{if(a(d)){var g=e(d,void 0);d=g?(g.length?g[g.length-1]:d).nextSibling:null}if((g=d.nextSibling)&&c(g)){if(c(g)&&!b.g.i.get(g,n))throw Error("Found end comment without a matching opening comment, as child of "+d);return null}return g},hc:a,wc:d=>(d=d.nodeValue.match(f))?d[1]:null}})();(()=>{const a=new Map;b.Ab=new class{oc(c){switch(c.nodeType){case 1:return null!=c.getAttribute("data-bind");case 8:return b.m.hc(c);default:return!1}}ec(c,e){a:{switch(c.nodeType){case 1:var f=
c.getAttribute("data-bind");break a;case 8:f=b.m.wc(c);break a}f=null}if(f)try{let n={valueAccessors:!0},d=a.get(f);if(!d){var k="with($context){with($data||{}){return{"+b.I.qc(f,n)+"}}}";d=new Function("$context","$element",k);a.set(f,d)}return d(e,c)}catch(n){throw n.message="Unable to parse bindings.\nBindings value: "+f+"\nMessage: "+n.message,n;}return null}}})();(()=>{function a(m){var l=(m=b.g.i.get(m,t))&&m.H;l&&(m.H=null,l.Nb())}function c(m,l){for(var p,u=b.m.firstChild(l);p=u;)u=b.m.nextSibling(p),
e(m,p);b.l.notify(l,b.l.G)}function e(m,l){var p=m;if(1===l.nodeType||b.Ab.oc(l))p=k(l,null,m).bindingContextForDescendants;p&&l.matches&&!l.matches("SCRIPT,TEXTAREA,TEMPLATE")&&c(p,l)}function f(m){var l=[],p={},u=[];b.g.P(m,function z(v){if(!p[v]){var x=b.h[v];x&&(x.after&&(u.push(v),x.after.forEach(E=>{if(m[E]){if(u.includes(E))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+u.join(", "));z(E)}}),u.length--),l.push({key:v,Ib:x}));p[v]=!0}});return l}
function k(m,l,p){var u=b.g.i.bb(m,t,{}),w=u.Zb;if(!l){if(w)throw Error("You cannot apply bindings multiple times to the same element.");u.Zb=!0}w||(u.context=p);u.fb||(u.fb={});if(l&&"function"!==typeof l)var v=l;else{var z=b.s(()=>{if(v=l?l(p,m):b.Ab.ec(m,p)){if(p[d])p[d]();if(p[h])p[h]()}return v},{o:m});v&&z.isActive()||(z=null)}var x=p,E;if(v){var D=z?y=>()=>z()[y]():y=>v[y],B={get:y=>v[y]&&D(y)(),has:y=>y in v};b.l.G in v&&b.l.subscribe(m,b.l.G,()=>{var y=v[b.l.G]();if(y){var C=b.m.childNodes(m);
C.length&&y(C,b.Eb(C[0]))}});b.l.ha in v&&(x=b.l.kb(m,p),b.l.subscribe(m,b.l.ha,()=>{var y=v[b.l.ha]();y&&b.m.firstChild(m)&&y(m)}));f(v).forEach(y=>{var C=y.Ib.init,K=y.Ib.update,H=y.key;if(8===m.nodeType&&!b.m.da[H])throw Error("The binding '"+H+"' cannot be used with virtual elements");try{"function"==typeof C&&b.u.S(()=>{var N=C(m,D(H),B,x.$data,x);if(N&&N.controlsDescendantBindings){if(void 0!==E)throw Error("Multiple bindings ("+E+" and "+H+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
E=H}}),"function"==typeof K&&b.s(()=>K(m,D(H),B,x.$data,x),{o:m})}catch(N){throw N.message='Unable to process binding "'+H+": "+v[H]+'"\nMessage: '+N.message,N;}})}u=void 0===E;return{shouldBindDescendants:u,bindingContextForDescendants:u&&x}}function n(m,l){return m&&m instanceof b.fa?m:new b.fa(m,void 0,void 0,l)}var d=Symbol("_subscribable"),g=Symbol("_ancestorBindingInfo"),h=Symbol("_dataDependency");b.h={};var r={};b.fa=class{constructor(m,l,p,u,w){var v=this,z=m===r,x=z?void 0:m,E="function"==
typeof x&&!b.T(x),D=w&&w.dataDependency;m=()=>{var y=E?x():x,C=b.g.j(y);l?(b.g.extend(v,l),g in l&&(v[g]=l[g])):(v.$parents=[],v.$root=C,v.ko=b);v[d]=B;z?C=v.$data:(v.$rawData=y,v.$data=C);p&&(v[p]=C);u&&u(v,l,C);if(l&&l[d]&&!b.u.s().cb(l[d]))l[d]();D&&(v[h]=D);return v.$data};if(w&&w.exportDependencies)m();else{var B=b.sc(m);B.J();B.isActive()?B.sa=null:v[d]=void 0}}createChildContext(m,l,p,u){!u&&l&&"object"==typeof l&&(u=l,l=u.as,p=u.extend);return new b.fa(m,this,l,(w,v)=>{w.$parentContext=v;
w.$parent=v.$data;w.$parents=(v.$parents||[]).slice(0);w.$parents.unshift(w.$parent);p&&p(w)},u)}extend(m,l){return new b.fa(r,this,null,p=>b.g.extend(p,"function"==typeof m?m(p):m),l)}};var t=b.g.i.Z();class q{constructor(m,l,p){this.M=m;this.va=l;this.Aa=new Set;this.G=!1;l.H||b.g.L.oa(m,a);p&&p.H&&(p.H.Aa.add(m),this.$=p)}Nb(){this.$&&this.$.H&&this.$.H.cc(this.M)}cc(m){this.Aa.delete(m);!this.Aa.size&&this.G&&this.Db()}Db(){this.G=!0;this.va.H&&!this.Aa.size&&(this.va.H=null,b.g.L.ib(this.M,a),
b.l.notify(this.M,b.l.ha),this.Nb())}}b.l={G:"childrenComplete",ha:"descendantsComplete",subscribe:(m,l,p,u,w)=>{var v=b.g.i.bb(m,t,{});v.ia||(v.ia=new b.V);w&&w.notifyImmediately&&v.fb[l]&&b.u.S(p,u,[m]);return v.ia.subscribe(p,u,l)},notify:(m,l)=>{var p=b.g.i.get(m,t);if(p&&(p.fb[l]=!0,p.ia&&p.ia.B(m,l),l==b.l.G))if(p.H)p.H.Db();else if(void 0===p.H&&p.ia&&p.ia.ta(b.l.ha))throw Error("descendantsComplete event not supported for bindings on this node");},kb:(m,l)=>{var p=b.g.i.bb(m,t,{});p.H||(p.H=
new q(m,p,l[g]));return l[g]==p?l:l.extend(u=>{u[g]=p})}};b.vc=m=>(m=b.g.i.get(m,t))&&m.context;b.wb=(m,l,p)=>k(m,l,n(p));b.yb=(m,l)=>{1!==l.nodeType&&8!==l.nodeType||c(n(m),l)};b.xb=function(m,l,p){if(2>arguments.length){if(l=L.body,!l)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?");}else if(!l||1!==l.nodeType&&8!==l.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");e(n(m,p),l)};
b.Eb=m=>(m=m&&[1,8].includes(m.nodeType)&&b.vc(m))?m.$data:void 0;b.v("bindingHandlers",b.h);b.v("applyBindings",b.xb);b.v("applyBindingAccessorsToNode",b.wb);b.v("dataFor",b.Eb)})();(()=>{var a=Object.create(null),c=new Map;b.Ua={get:(n,d)=>{if(c.has(n))b.Ub.Qb(()=>d(c.get(n)));else{var g=a[n];if(g)g.subscribe(d);else{g=a[n]=new b.V;g.subscribe(d);k(n,r=>{c.set(n,r);delete a[n];h?g.B(r):b.Ub.Qb(()=>g.B(r))});var h=!0}}},register:(n,d)=>{if(!d)throw Error("Invalid configuration for "+n);if(e[n])throw Error("Component "+
n+" is already registered");e[n]=d}};var e=Object.create(null),f=(n,d)=>{throw Error(`Component '${n}': ${d}`);},k=(n,d)=>{var g={},h=e[n]||{},r=h.template;h=h.viewModel;if(r){r.element||f(n,"Unknown template value: "+r);r=r.element;var t=L.getElementById(r);t||f(n,"Cannot find element with ID "+r);t.matches("TEMPLATE")||f(n,"Template Source Element not a <template>");g.template=b.g.Ba(t.content.childNodes)}h&&("function"!==typeof h.createViewModel&&f(n,"Unknown viewModel value: "+h),g.createViewModel=
h.createViewModel);d(g.template&&g.createViewModel?g:null)};b.v("components",b.Ua);b.v("components.register",b.Ua.register)})();(()=>{var a=0;b.h.component={init:(c,e,f,k,n)=>{var d,g,h,r=()=>{var q=d&&d.dispose;"function"===typeof q&&q.call(d);h&&h.A();g=d=h=null},t=[...b.m.childNodes(c)];b.m.ra(c);b.g.L.oa(c,r);b.s(()=>{var q=b.g.j(e());if("string"!==typeof q){var m=b.g.j(q.params);q=b.g.j(q.name)}if(!q)throw Error("No component name specified");var l=b.l.kb(c,n),p=g=++a;b.Ua.get(q,u=>{if(g===p){r();
if(!u)throw Error("Unknown component '"+q+"'");var w=u.template;if(!w)throw Error("Component '"+q+"' has no template");b.m.wa(c,b.g.Ba(w));d=u.createViewModel(m,{element:c,templateNodes:t});b.yb(l.createChildContext(d,{extend:v=>{v.$component=d;v.$componentTemplateNodes=t}}),c)}})},{o:c});return{controlsDescendantBindings:!0}}};b.m.da.component=!0})();b.h.attr={update:(a,c)=>{c=b.g.j(c())||{};b.g.P(c,function(e,f){f=b.g.j(f);var k=e.indexOf(":");k="lookupNamespaceURI"in a&&0<k&&a.lookupNamespaceURI(e.slice(0,
k));var n=!1===f||null==f;n?k?a.removeAttributeNS(k,e):a.removeAttribute(e):(f=f.toString(),k?a.setAttributeNS(k,e,f):a.setAttribute(e,f));"name"===e&&(a.name=n?"":f)})}};var R=(a,c,e)=>c&&c.split(/\s+/).forEach(f=>a.classList.toggle(f,e));b.h.css={update:(a,c)=>{c=b.g.j(c());"object"==typeof c?b.g.P(c,(e,f)=>{f=b.g.j(f);R(a,e,!!f)}):(c=b.g.Sb(c),R(a,a.__ko__cssValue,!1),a.__ko__cssValue=c,R(a,c,!0))}};b.h.enable={update:(a,c)=>{(c=b.g.j(c()))&&a.disabled?a.removeAttribute("disabled"):c||a.disabled||
(a.disabled=!0)}};b.h.disable={update:(a,c)=>b.h.enable.update(a,()=>!b.g.j(c()))};b.h.event={init:(a,c,e,f,k)=>{e=c()||{};b.g.P(e,n=>{"string"==typeof n&&a.addEventListener(n,(...d)=>{var g=c()[n];if(g)try{f=k.$data;var h=g.apply(f,[f,...d])}finally{!0!==h&&d[0].preventDefault()}})})}};b.h.foreach={Lb:a=>()=>{var c=a(),e=b.T(c)?c.J():c;if(!e||"number"==typeof e.length)return{foreach:c};b.g.j(c);return{foreach:e.data,as:e.as,beforeRemove:e.beforeRemove}},init:(a,c)=>b.h.template.init(a,b.h.foreach.Lb(c)),
update:(a,c,e,f,k)=>b.h.template.update(a,b.h.foreach.Lb(c),e,f,k)};b.I.Sa.foreach=!1;b.m.da.foreach=!0;b.h.hasfocus={init:(a,c,e)=>{var f=n=>{a.__ko_hasfocusUpdating=!0;n=a.ownerDocument.activeElement===a;var d=c();b.I.ob(d,e,"hasfocus",n,!0);a.__ko_hasfocusLastValue=n;a.__ko_hasfocusUpdating=!1},k=f.bind(null,!0);f=f.bind(null,!1);a.addEventListener("focus",k);a.addEventListener("focusin",k);a.addEventListener("blur",f);a.addEventListener("focusout",f);a.__ko_hasfocusLastValue=!1},update:(a,c)=>
{c=!!b.g.j(c());a.__ko_hasfocusUpdating||a.__ko_hasfocusLastValue===c||(c?a.focus():a.blur())}};b.I.mb.add("hasfocus");b.h.html={init:()=>({controlsDescendantBindings:!0}),update:(a,c)=>{b.g.$a(a);c=b.g.j(c());if(null!=c){const e=L.createElement("template");e.innerHTML="string"!=typeof c?c.toString():c;a.appendChild(e.content)}}};(()=>{function a(c,e,f){b.h[c]={init:(k,n,d,g,h)=>{var r,t={};e&&(t={as:d.get("as"),exportDependencies:!0});var q=d.has(b.l.ha);b.s(()=>{var m=b.g.j(n()),l=!f!==!m,p=!r;
q&&(h=b.l.kb(k,h));if(l){t.dataDependency=b.u.s();var u=e?h.createChildContext("function"==typeof m?m:n,t):b.u.Ea()?h.extend(null,t):h}p&&b.u.Ea()&&(r=b.g.Ba(b.m.childNodes(k),!0));l?(p||b.m.wa(k,b.g.Ba(r)),b.yb(u,k)):(b.m.ra(k),b.l.notify(k,b.l.G))},{o:k});return{controlsDescendantBindings:!0}}};b.I.Sa[c]=!1;b.m.da[c]=!0}a("if");a("ifnot",!1,!0);a("with",!0)})();var S={};b.h.options={init:a=>{if(!a.matches("SELECT"))throw Error("options binding applies only to SELECT elements");let c=a.length;for(;c--;)a.remove(c);
return{controlsDescendantBindings:!0}},update:(a,c,e)=>{var f=a.multiple,k=0!=a.length&&f?a.scrollTop:null,n=b.g.j(c()),d=e.get("valueAllowUnset")&&e.has("value"),g={},h=[];c=()=>Array.from(a.options).filter(l=>l.selected);var r=(l,p,u)=>{var w=typeof p;return"function"==w?p(l):"string"==w?l[p]:u},t=(l,p)=>{m&&d?b.l.notify(a,b.l.G):h.length&&(l=h.includes(b.F.R(p[0])),p[0].selected=l,m&&!l&&b.u.S(b.g.Vb,null,[a,"change"]))};d||(f?h=c().map(b.F.R):0<=a.selectedIndex&&h.push(b.F.R(a.options[a.selectedIndex])));
if(n){"undefined"==typeof n.length&&(n=[n]);var q=n.filter(l=>l||null==l);e.has("optionsCaption")&&(n=b.g.j(e.get("optionsCaption")),null!==n&&void 0!==n&&q.unshift(S))}var m=!1;g.beforeRemove=l=>a.removeChild(l);n=t;e.has("optionsAfterRender")&&"function"==typeof e.get("optionsAfterRender")&&(n=(l,p)=>{t(l,p);b.u.S(e.get("optionsAfterRender"),null,[p[0],l!==S?l:void 0])});b.g.Rb(a,q,(l,p,u)=>{u.length&&(h=!d&&u[0].selected?[b.F.R(u[0])]:[],m=!0);p=a.ownerDocument.createElement("option");l===S?(b.g.jb(p,
e.get("optionsCaption")),b.F.Pa(p,void 0)):(u=r(l,e.get("optionsValue"),l),b.F.Pa(p,b.g.j(u)),l=r(l,e.get("optionsText"),u),b.g.jb(p,l));return[p]},g,n);d||(q=h.length,(f?q&&c().length<q:q&&0<=a.selectedIndex?b.F.R(a.options[a.selectedIndex])!==h[0]:q||0<=a.selectedIndex)&&b.u.S(b.g.Vb,null,[a,"change"]));(d||b.u.eb())&&b.l.notify(a,b.l.G);k&&20<Math.abs(k-a.scrollTop)&&(a.scrollTop=k)}};b.h.options.gb=b.g.i.Z();b.h.style={update:(a,c)=>{c=b.g.j(c()||{});b.g.P(c,(e,f)=>{f=b.g.j(f);if(null==f||!1===
f)f="";if(/^--/.test(e))a.style.setProperty(e,f);else{e=e.replace(/-(\w)/g,(n,d)=>d.toUpperCase());var k=a.style[e];a.style[e]=f;f===k||a.style[e]!=k||isNaN(f)||(a.style[e]=f+"px")}})}};b.h.submit={init:(a,c,e,f,k)=>{if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.addEventListener("submit",n=>{var d=c();try{var g=d.call(k.$data,a)}finally{!0!==g&&n.preventDefault()}})}};b.h.text={init:()=>({controlsDescendantBindings:!0}),update:(a,c)=>{8===a.nodeType&&
(a.text||a.after(a.text=L.createTextNode("")),a=a.text);b.g.jb(a,c())}};b.m.da.text=!0;b.h.textInput={init:(a,c,e)=>{var f=a.value,k,n,d=()=>{clearTimeout(k);n=k=void 0;var h=a.value;f!==h&&(f=h,b.I.ob(c(),e,"textInput",h))},g=()=>{var h=b.g.j(c());null==h&&(h="");void 0!==n&&h===n?setTimeout(g,4):a.value!==h&&(a.value=h,f=a.value)};a.addEventListener("input",d);a.addEventListener("change",d);a.addEventListener("blur",d);b.s(g,{o:a})}};b.I.mb.add("textInput");b.h.textinput={preprocess:(a,c,e)=>e("textInput",
a)};b.h.value={init:(a,c,e)=>{var f=a.matches("SELECT"),k=a.matches("INPUT");if(!k||"checkbox"!=a.type&&"radio"!=a.type){var n=new Set,d=e.get("valueUpdate"),g=null;d&&("string"==typeof d?n.add(d):d.forEach(q=>n.add(q)),n.delete("change"));var h=()=>{g=null;var q=c(),m=b.F.R(a);b.I.ob(q,e,"value",m)};n.forEach(q=>{var m=h;(q||"").startsWith("after")&&(m=()=>{g=b.F.R(a);setTimeout(h,0)},q=q.slice(5));a.addEventListener(q,m)});var r=k&&"file"==a.type?()=>{var q=b.g.j(c());null==q||""===q?a.value="":
b.u.S(h)}:()=>{var q=b.g.j(c()),m=b.F.R(a);if(null!==g&&q===g)setTimeout(r,0);else if(q!==m||void 0===m)f?(m=e.get("valueAllowUnset"),b.F.Pa(a,q,m),m||q===b.F.R(a)||b.u.S(h)):b.F.Pa(a,q)};if(f){var t;b.l.subscribe(a,b.l.G,()=>{t?e.get("valueAllowUnset")?r():h():(a.addEventListener("change",h),t=b.s(r,{o:a}))},null,{notifyImmediately:!0})}else a.addEventListener("change",h),b.s(r,{o:a})}else b.wb(a,{checkedValue:c})},update:()=>{}};b.I.mb.add("value");b.h.visible={update:(a,c)=>{c=b.g.j(c());var e=
"none"!=a.style.display;c&&!e?a.style.display="":e&&!c&&(a.style.display="none")}};b.h.hidden={update:(a,c)=>a.hidden=!!b.g.j(c())};(function(a){b.h[a]={init:function(c,e,f,k,n){return b.h.event.init.call(this,c,()=>({[a]:e()}),f,k,n)}}})("click");(()=>{let a=b.g.i.Z();class c{constructor(f){this.Xa=f}La(...f){let k=this.Xa;if(!f.length)return b.g.i.get(k,a)||(11===this.M?k.content:1===this.M?k:void 0);b.g.i.set(k,a,f[0])}}class e extends c{constructor(f){super(f);f&&(this.M=f.matches("TEMPLATE")&&
f.content?f.content.nodeType:1)}}b.Ma={Xa:e,Ra:c}})();(()=>{var a=(d,g,h)=>{var r;for(g=b.m.nextSibling(g);d&&(r=d)!==g;)d=b.m.nextSibling(r),h(r,d)},c=(d,g)=>{if(d.length){var h=d[0],r=h.parentNode;a(h,d[d.length-1],t=>{1!==t.nodeType&&8!==t.nodeType||b.xb(g,t)});b.g.Da(d,r)}},e=(d,g,h,r)=>{var t=(d&&(d.nodeType?d:0<d.length?d[0]:null)||h||{}).ownerDocument;if("string"==typeof h){t=t||L;t=t.getElementById(h);if(!t)throw Error("Cannot find template with ID "+h);h=new b.Ma.Xa(t)}else if([1,8].includes(h.nodeType))h=
new b.Ma.Ra(h);else throw Error("Unknown template type: "+h);h=(h=h.La?h.La():null)?[...h.cloneNode(!0).childNodes]:null;if("number"!=typeof h.length||0<h.length&&"number"!=typeof h[0].nodeType)throw Error("Template engine must return an array of DOM nodes");t=!1;switch(g){case "replaceChildren":b.m.wa(d,h);t=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+g);}t&&(c(h,r),"replaceChildren"==g&&b.l.notify(d,b.l.G));return h},f=(d,g,h)=>b.T(d)?d():"function"===typeof d?
d(g,h):d;b.tc=function(d,g,h,r){h=h||{};var t=t||"replaceChildren";if(r){var q=r.nodeType?r:0<r.length?r[0]:null;return b.s(()=>{var m=g instanceof b.fa?g:new b.fa(g,null,null,null,{exportDependencies:!0}),l=f(d,m.$data,m);e(r,t,l,m,h)},{qa:()=>!q||!b.g.Za(q),o:q})}console.log("no targetNodeOrNodeArray")};b.uc=(d,g,h,r,t)=>{function q(v,z){b.u.S(b.g.Rb,null,[r,v,p,h,u,z]);b.l.notify(r,b.l.G)}var m,l=h.as,p=(v,z)=>{m=t.createChildContext(v,{as:l,extend:x=>{x.$index=z;l&&(x[l+"Index"]=z)}});v=f(d,v,
m);return e(r,"ignoreTargetNode",v,m,h)},u=(v,z)=>{c(z,m);m=null};if(!h.beforeRemove&&b.Kb(g)){q(g.J());var w=g.subscribe(v=>{q(g(),v)},null,"arrayChange");w.o(r);return w}return b.s(()=>{var v=b.g.j(g)||[];"undefined"==typeof v.length&&(v=[v]);q(v)},{o:r})};var k=b.g.i.Z(),n=b.g.i.Z();b.h.template={init:(d,g)=>{g=b.g.j(g());if("string"==typeof g||"name"in g)b.m.ra(d);else if("nodes"in g){g=g.nodes||[];if(b.T(g))throw Error('The "nodes" option must be a plain, non-observable array.');let h=g[0]?.parentNode;
h&&b.g.i.get(h,n)||(h=b.g.Mb(g),b.g.i.set(h,n,!0));(new b.Ma.Ra(d)).La(h)}else if(g=b.m.childNodes(d),g.length)g=b.g.Mb(g),(new b.Ma.Ra(d)).La(g);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:(d,g,h,r,t)=>{var q=g();g=b.g.j(q);h=!0;r=null;"string"==typeof g?g={}:(q="name"in g?g.name:d,"if"in g&&(h=b.g.j(g["if"])),h&&"ifnot"in g&&(h=!b.g.j(g.ifnot)),h&&!q&&(h=!1));"foreach"in g?r=b.uc(q,h&&g.foreach||[],g,d,t):h?(h=
t,"data"in g&&(h=t.createChildContext(g.data,{as:g.as,exportDependencies:!0})),r=b.tc(q,h,g,d)):b.m.ra(d);t=r;b.g.i.get(d,k)?.A?.();b.g.i.set(d,k,!t||t.isActive&&!t.isActive()?void 0:t)}};b.I.Sa.template=d=>{d=b.I.pc(d);return 1==d.length&&d[0].unknown||b.I.nc(d,"name")?null:"This template engine does not support anonymous templates nested within its templates"};b.m.da.template=!0})();b.g.Hb=(a,c,e)=>{if(a.length&&c.length){var f,k,n,d,g;for(f=k=0;(!e||f<e)&&(d=a[k]);++k){for(n=0;g=c[n];++n)if(d.value===
g.value){d.moved=g.index;g.moved=d.index;c.splice(n,1);f=n=0;break}f+=n}}};b.g.Cb=(()=>{var a=(c,e,f,k,n)=>{var d=Math.min,g=Math.max,h=[],r,t=c.length,q,m=e.length,l=m-t||1,p=t+m+1,u;for(r=0;r<=t;r++){var w=u;h.push(u=[]);var v=d(m,r+l);for(q=g(0,r-1);q<=v;q++)u[q]=q?r?c[r-1]===e[q-1]?w[q-1]:d(w[q]||p,u[q-1]||p)+1:q+1:r+1}d=[];g=[];l=[];r=t;for(q=m;r||q;)m=h[r][q]-1,q&&m===h[r][q-1]?g.push(d[d.length]={status:f,value:e[--q],index:q}):r&&m===h[r-1][q]?l.push(d[d.length]={status:k,value:c[--r],index:r}):
(--q,--r,n.sparse||d.push({status:"retained",value:e[q]}));b.g.Hb(l,g,!n.dontLimitMoves&&10*t);return d.reverse()};return(c,e,f)=>{f="boolean"===typeof f?{dontLimitMoves:f}:f||{};c=c||[];e=e||[];return c.length<e.length?a(c,e,"added","deleted",f):a(e,c,"deleted","added",f)}})();(()=>{function a(f,k,n,d,g){var h=[],r=b.s(()=>{var t=k(n,g,b.g.Da(h,f))||[];if(0<h.length){var q=h.nodeType?[h]:h;if(0<q.length){var m=q[0],l=m.parentNode,p;var u=0;for(p=t.length;u<p;u++)l.insertBefore(t[u],m);u=0;for(p=
q.length;u<p;u++)b.removeNode(q[u])}d&&b.u.S(d,null,[n,t,g])}h.length=0;h.push(...t)},{o:f,qa:()=>!!h.find(b.g.Za)});return{O:h,Va:r.isActive()?r:void 0}}var c=b.g.i.Z(),e=b.g.i.Z();b.g.Rb=(f,k,n,d,g,h)=>{function r(B){x={ea:B,Ga:b.ca(p++)};m.push(x)}function t(B){x=q[B];x.Ga(p++);b.g.Da(x.O,f);m.push(x)}k=k||[];"undefined"==typeof k.length&&(k=[k]);d=d||{};var q=b.g.i.get(f,c),m=[],l=0,p=0,u=[],w=[],v=[],z=0;if(q){if(!h||q&&q._countWaitingForRemove)h=Array.prototype.map.call(q,B=>B.ea),h=b.g.Cb(h,
k,{dontLimitMoves:d.dontLimitMoves,sparse:!0});for(let B=0,y,C,K;y=h[B];B++)switch(C=y.moved,K=y.index,y.status){case "deleted":for(;l<K;)t(l++);if(void 0===C){var x=q[l];x.Va&&(x.Va.A(),x.Va=void 0);b.g.Da(x.O,f).length&&(d.beforeRemove&&(m.push(x),z++,x.ea===e?x=null:v[x.Ga.J()]=x),x&&u.push.apply(u,x.O))}l++;break;case "added":for(;p<K;)t(l++);void 0!==C?(w.push(m.length),t(C)):r(y.value)}for(;p<k.length;)t(l++);m._countWaitingForRemove=z}else k.forEach(r);b.g.i.set(f,c,m);u.forEach(d.beforeRemove?
b.ga:b.removeNode);var E,D;z=f.ownerDocument.activeElement;if(w.length)for(;void 0!=(k=w.shift());){x=m[k];for(E=void 0;k;)if((D=m[--k].O)&&D.length){E=D[D.length-1];break}for(l=0;u=x.O[l];E=u,l++)b.m.Jb(f,u,E)}for(k=0;x=m[k];k++){x.O||b.g.extend(x,a(f,n,x.ea,g,x.Ga));for(l=0;u=x.O[l];E=u,l++)b.m.Jb(f,u,E);!x.kc&&g&&(g(x.ea,x.O,x.Ga),x.kc=!0,E=x.O[x.O.length-1])}z&&f.ownerDocument.activeElement!=z&&z.focus();(function(B,y){if(B)for(var C=0,K=y.length;C<K;C++)y[C]&&y[C].O.forEach(H=>B(H,C,y[C].ea))})(d.beforeRemove,
v);for(k=0;k<v.length;++k)v[k]&&(v[k].ea=e)}})();T.ko=P})(this);

View file

@ -33,11 +33,11 @@
}
],
"devDependencies": {
"grunt": "~0.4.1",
"grunt-cli": "~0.1.0"
"grunt": "^1.5.3",
"grunt-cli": "^1.4.3"
},
"dependencies": {
"closure-compiler": "^0.2.12",
"google-closure-compiler": "^20200830.0.0"
"closure-compiler": "0.2.12",
"google-closure-compiler": "^20220905.0.0"
}
}

View file

@ -13,10 +13,17 @@
ko.bindingContext = class {
constructor(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, options)
{
var self = this,
shouldInheritData = dataItemOrAccessor === inheritParentVm,
realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor,
isFunc = typeof(realDataItemOrAccessor) == "function" && !ko.isObservable(realDataItemOrAccessor),
subscribable,
dataDependency = options && options['dataDependency'],
// The binding context object includes static properties for the current, parent, and root view models.
// If a view model is actually stored in an observable, the corresponding binding context object, and
// any child contexts, must be updated when the view model is changed.
function updateContext() {
updateContext = () => {
// Most of the time, the context will directly get a view model object, but if a function is given,
// we call the function to retrieve the view model. If the function accesses any observables or returns
// an observable, the dependency is tracked, and those observables can later cause the binding
@ -71,14 +78,7 @@
}
return self['$data'];
}
var self = this,
shouldInheritData = dataItemOrAccessor === inheritParentVm,
realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor,
isFunc = typeof(realDataItemOrAccessor) == "function" && !ko.isObservable(realDataItemOrAccessor),
subscribable,
dataDependency = options && options['dataDependency'];
};
if (options && options['exportDependencies']) {
// The "exportDependencies" option means that the calling code will track any dependencies and re-create

View file

@ -16,9 +16,6 @@ ko.bindingHandlers['attr'] = {
namespace ? element.removeAttributeNS(namespace, attrName) : element.removeAttribute(attrName);
} else {
attrValue = attrValue.toString();
}
if (!toRemove) {
namespace ? element.setAttributeNS(namespace, attrName, attrValue) : element.setAttribute(attrName, attrValue);
}

View file

@ -1,16 +1,13 @@
var classesWrittenByBindingKey = '__ko__cssValue',
toggleClasses = (node, classNames, force) => {
if (classNames) {
classNames.split(/\s+/).forEach(className =>
toggleClasses = (node, classNames, force) =>
classNames && classNames.split(/\s+/).forEach(className =>
node.classList.toggle(className, force)
);
}
};
ko.bindingHandlers['css'] = {
'update': (element, valueAccessor) => {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value !== null && typeof value == "object") {
if (typeof value == "object") {
ko.utils.objectForEach(value, (className, shouldHaveClass) => {
shouldHaveClass = ko.utils.unwrapObservable(shouldHaveClass);
toggleClasses(element, className, !!shouldHaveClass);

View file

@ -3,7 +3,7 @@ ko.bindingHandlers['enable'] = {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value && element.disabled)
element.removeAttribute("disabled");
else if ((!value) && (!element.disabled))
else if (!value && !element.disabled)
element.disabled = true;
}
};

View file

@ -3,12 +3,9 @@
function makeEventHandlerShortcut(eventName) {
ko.bindingHandlers[eventName] = {
'init': function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var newValueAccessor = () => {
return {
[eventName]: valueAccessor()
};
};
return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);
return ko.bindingHandlers['event']['init'].call(this, element,
() => ({[eventName]: valueAccessor()}), // newValueAccessor
allBindings, viewModel, bindingContext);
}
}
}
@ -18,19 +15,18 @@ ko.bindingHandlers['event'] = {
var eventsToHandle = valueAccessor() || {};
ko.utils.objectForEach(eventsToHandle, eventName => {
if (typeof eventName == "string") {
element.addEventListener(eventName, function (event) {
element.addEventListener(eventName, (...args) => {
var handlerReturnValue;
var handlerFunction = valueAccessor()[eventName];
if (!handlerFunction)
return;
if (handlerFunction) {
try {
viewModel = bindingContext['$data'];
// Take all the event args, and prefix with the viewmodel
handlerReturnValue = handlerFunction.apply(viewModel, [viewModel, ...arguments]);
handlerReturnValue = handlerFunction.apply(viewModel, [viewModel, ...args]);
} finally {
if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
event.preventDefault();
args[0].preventDefault();
}
}
}
});

View file

@ -1,4 +1,4 @@
(function () {
(() => {
// Makes a binding like with or if
function makeWithIfBinding(bindingKey, isWith, isNot) {
@ -7,8 +7,7 @@ function makeWithIfBinding(bindingKey, isWith, isNot) {
var savedNodes, contextOptions = {}, needAsyncContext;
if (isWith) {
var as = allBindings.get('as');
contextOptions = { 'as': as, 'exportDependencies': true };
contextOptions = { 'as': allBindings.get('as'), 'exportDependencies': true };
}
needAsyncContext = allBindings['has'](ko.bindingEvent.descendantsComplete);

View file

@ -5,17 +5,15 @@ ko.bindingHandlers['options'] = {
throw new Error("options binding applies only to SELECT elements");
// Remove all existing <option>s.
while (element.length > 0) {
element.remove(0);
let l = element.length;
while (l--) {
element.remove(l);
}
// Ensures that the binding processor doesn't try to bind the options
return { 'controlsDescendantBindings': true };
},
'update': (element, valueAccessor, allBindings) => {
function selectedOptions() {
return Array.from(element.options).filter(node => node.selected);
}
var selectWasPreviouslyEmpty = element.length == 0,
multiple = element.multiple,
@ -25,7 +23,36 @@ ko.bindingHandlers['options'] = {
arrayToDomNodeChildrenOptions = {},
captionValue,
filteredArray,
previousSelectedValues = [];
previousSelectedValues = [],
selectedOptions = () => Array.from(element.options).filter(node => node.selected),
applyToObject = (object, predicate, defaultValue) => {
var predicateType = typeof predicate;
if (predicateType == "function") // Given a function; run it against the data value
return predicate(object);
else if (predicateType == "string") // Given a string; treat it as a property name on the data value
return object[predicate];
// Given no optionsText arg; use the data value itself
return defaultValue;
},
setSelectionCallback = (arrayEntry, newOptions) => {
if (itemUpdate && valueAllowUnset) {
// The model value is authoritative, so make sure its value is the one selected
ko.bindingEvent.notify(element, ko.bindingEvent.childrenComplete);
} else if (previousSelectedValues.length) {
// IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
// That's why we first added them without selection. Now it's time to set the selection.
var isSelected = previousSelectedValues.includes(ko.selectExtensions.readValue(newOptions[0]));
newOptions[0].selected = isSelected;
// If this option was changed from being selected during a single-item update, notify the change
if (itemUpdate && !isSelected) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
}
};
if (!valueAllowUnset) {
if (multiple) {
@ -54,22 +81,12 @@ ko.bindingHandlers['options'] = {
// If a falsy value is provided (e.g. null), we'll simply empty the select element
}
function applyToObject(object, predicate, defaultValue) {
var predicateType = typeof predicate;
if (predicateType == "function") // Given a function; run it against the data value
return predicate(object);
else if (predicateType == "string") // Given a string; treat it as a property name on the data value
return object[predicate];
else // Given no optionsText arg; use the data value itself
return defaultValue;
}
// The following functions can run at two different times:
// The first is when the whole array is being updated directly from this binding handler.
// The second is when an observable value for a specific array entry is updated.
// oldOptions will be empty in the first case, but will be filled with the previously generated option in the second.
var itemUpdate = false;
function optionForArrayItem(arrayEntry, index, oldOptions) {
var itemUpdate = false,
optionForArrayItem = (arrayEntry, index, oldOptions) => {
if (oldOptions.length) {
previousSelectedValues = !valueAllowUnset && oldOptions[0].selected ? [ ko.selectExtensions.readValue(oldOptions[0]) ] : [];
itemUpdate = true;
@ -88,29 +105,12 @@ ko.bindingHandlers['options'] = {
ko.utils.setTextContent(option, optionText);
}
return [option];
}
};
// By using a beforeRemove callback, we delay the removal until after new items are added. This fixes a selection
// problem in IE<=8 and Firefox. See https://github.com/knockout/knockout/issues/1208
arrayToDomNodeChildrenOptions['beforeRemove'] = option => element.removeChild(option);
function setSelectionCallback(arrayEntry, newOptions) {
if (itemUpdate && valueAllowUnset) {
// The model value is authoritative, so make sure its value is the one selected
ko.bindingEvent.notify(element, ko.bindingEvent.childrenComplete);
} else if (previousSelectedValues.length) {
// IE6 doesn't like us to assign selection to OPTION nodes before they're added to the document.
// That's why we first added them without selection. Now it's time to set the selection.
var isSelected = previousSelectedValues.includes(ko.selectExtensions.readValue(newOptions[0]));
newOptions[0].selected = isSelected;
// If this option was changed from being selected during a single-item update, notify the change
if (itemUpdate && !isSelected) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
}
}
var callback = setSelectionCallback;
if (allBindings['has']('optionsAfterRender') && typeof allBindings.get('optionsAfterRender') == "function") {
callback = (arrayEntry, newOptions) => {
@ -123,25 +123,23 @@ ko.bindingHandlers['options'] = {
if (!valueAllowUnset) {
// Determine if the selection has changed as a result of updating the options list
var selectionChanged;
var selectionChanged, prevLength = previousSelectedValues.length;
if (multiple) {
// For a multiple-select box, compare the new selection count to the previous one
// But if nothing was selected before, the selection can't have changed
selectionChanged = previousSelectedValues.length && selectedOptions().length < previousSelectedValues.length;
selectionChanged = prevLength && selectedOptions().length < prevLength;
} else {
// For a single-select box, compare the current value to the previous value
// But if nothing was selected before or nothing is selected now, just look for a change in selection
selectionChanged = (previousSelectedValues.length && element.selectedIndex >= 0)
selectionChanged = (prevLength && element.selectedIndex >= 0)
? (ko.selectExtensions.readValue(element.options[element.selectedIndex]) !== previousSelectedValues[0])
: (previousSelectedValues.length || element.selectedIndex >= 0);
: (prevLength || element.selectedIndex >= 0);
}
// Ensure consistency between model value and selected option.
// If the dropdown was changed so that selection is no longer the same,
// notify the value or selectedOptions binding.
if (selectionChanged) {
ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
selectionChanged && ko.dependencyDetection.ignore(ko.utils.triggerEvent, null, [element, "change"]);
}
if (valueAllowUnset || ko.dependencyDetection.isInitial()) {

View file

@ -8,10 +8,7 @@ ko.bindingHandlers['submit'] = {
try { handlerReturnValue = value.call(bindingContext['$data'], element); }
finally {
if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
if (event.preventDefault)
event.preventDefault();
else
event.returnValue = false;
}
}
});

View file

@ -18,23 +18,9 @@ ko.utils.findMovesInArrayComparison = (left, right, limitFailedCompares) => {
};
ko.utils.compareArrays = (() => {
var statusNotInOld = 'added', statusNotInNew = 'deleted';
var statusNotInOld = 'added', statusNotInNew = 'deleted',
// Simple calculation based on Levenshtein distance.
function compareArrays(oldArray, newArray, options) {
// For backward compatibility, if the third arg is actually a bool, interpret
// it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
oldArray = oldArray || [];
newArray = newArray || [];
if (oldArray.length < newArray.length)
return compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options);
else
return compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
}
function compareSmallArrayToBigArray(smlArray, bigArray, statusNotInSml, statusNotInBig, options) {
compareSmallArrayToBigArray = (smlArray, bigArray, statusNotInSml, statusNotInBig, options) => {
var myMin = Math.min,
myMax = Math.max,
editDistanceMatrix = [],
@ -94,7 +80,18 @@ ko.utils.compareArrays = (() => {
ko.utils.findMovesInArrayComparison(notInBig, notInSml, !options['dontLimitMoves'] && smlIndexMax * 10);
return editScript.reverse();
}
};
return compareArrays;
// Simple calculation based on Levenshtein distance.
return (oldArray, newArray, options) => {
// For backward compatibility, if the third arg is actually a bool, interpret
// it as the old parameter 'dontLimitMoves'. Newer code should use { dontLimitMoves: true }.
options = (typeof options === 'boolean') ? { 'dontLimitMoves': options } : (options || {});
oldArray = oldArray || [];
newArray = newArray || [];
return (oldArray.length < newArray.length)
? compareSmallArrayToBigArray(oldArray, newArray, statusNotInOld, statusNotInNew, options)
: compareSmallArrayToBigArray(newArray, oldArray, statusNotInNew, statusNotInOld, options);
};
})();

View file

@ -1,12 +1,11 @@
(() => {
var loadingSubscribablesCache = Object.create(null), // Tracks component loads that are currently in flight
loadedDefinitionsCache = Object.create(null); // Tracks component loads that have already completed
loadedDefinitionsCache = new Map(); // Tracks component loads that have already completed
ko.components = {
get: (componentName, callback) => {
var cachedDefinition = loadedDefinitionsCache[componentName];
if (cachedDefinition) {
ko.tasks.schedule(() => callback(cachedDefinition.definition) );
if (loadedDefinitionsCache.has(componentName)) {
ko.tasks.schedule(() => callback(loadedDefinitionsCache.get(componentName)));
} else {
// Join the loading process that is already underway, or start a new one.
var subscribable = loadingSubscribablesCache[componentName],
@ -18,8 +17,8 @@
subscribable = loadingSubscribablesCache[componentName] = new ko.subscribable();
subscribable.subscribe(callback);
beginLoadingComponent(componentName, definition => {
loadedDefinitionsCache[componentName] = { definition: definition };
loadComponent(componentName, definition => {
loadedDefinitionsCache.set(componentName, definition);
delete loadingSubscribablesCache[componentName];
// For API consistency, all loads complete asynchronously. However we want to avoid
@ -41,9 +40,6 @@
}
},
clearCachedDefinition: componentName =>
delete loadedDefinitionsCache[componentName],
register: (componentName, config) => {
if (!config) {
throw new Error('Invalid configuration for ' + componentName);
@ -67,8 +63,9 @@
// 1. To supply configuration objects from some other source (e.g., conventions)
// 2. Or, to resolve configuration objects by loading viewmodels/templates via arbitrary logic.
var defaultConfigRegistry = Object.create(null);
var createViewModelKey = 'createViewModel';
var defaultConfigRegistry = Object.create(null),
createViewModelKey = 'createViewModel',
throwError = (componentName, message) => { throw new Error(`Component '${componentName}': ${message}`) },
// Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it
// into the standard component definition format:
@ -76,7 +73,8 @@
// Since both template and viewModel may need to be resolved asynchronously, both tasks are performed
// in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure,
// so this is implemented manually below.
function loadComponent(componentName, callback) {
loadComponent = (componentName, callback) => {
// Try the candidates
var result = {},
config = defaultConfigRegistry[componentName] || {},
templateConfig = config['template'],
@ -108,29 +106,10 @@
result[createViewModelKey] = viewModelConfig[createViewModelKey];
}
if (result['template'] && result[createViewModelKey]) {
callback(result);
} else {
callback(null);
}
}
function throwError(componentName, message) {
throw new Error(`Component '${componentName}': ${message}`)
}
function beginLoadingComponent(componentName, callback) {
// Try the candidates
var found = false;
loadComponent(componentName, result => {
// This candidate returned a value. Use it.
(found = result != null) && callback(result);
});
if (!found) {
// No candidates returned a value
callback(null);
}
}
// Did candidate return a value?
var found = (result['template'] && result[createViewModelKey]);
callback(found ? result : null);
};
ko.exportSymbol('components', ko.components);
ko.exportSymbol('components.register', ko.components.register);

View file

@ -34,11 +34,11 @@ ko.dependencyDetection = {
}
},
getDependenciesCount: () => currentFrame && currentFrame.computed.getDependenciesCount(),
getDependenciesCount: () => currentFrame?.computed.getDependenciesCount(),
isInitial: () => currentFrame && currentFrame.isInitial,
isInitial: () => currentFrame?.isInitial,
computed: () => currentFrame && currentFrame.computed
computed: () => currentFrame?.computed
};
})();

View file

@ -41,7 +41,7 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
// Writing a value
writeFunction(...arguments);
return this; // Permits chained assignments
} else {
}
// Reading the value
state.isDisposed || ko.dependencyDetection.registerDependency(computedObservable);
if (state.isDirty || (state.isSleeping && computedObservable.haveDependenciesChanged())) {
@ -49,7 +49,6 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
}
return state.latestValue;
}
}
computedObservable[computedState] = state;
computedObservable.hasWriteFunction = typeof writeFunction === "function";
@ -101,9 +100,7 @@ ko.computed = (evaluatorFunctionOrOptions, options) => {
// Utility function that disposes a given dependencyTracking entry
function computedDisposeDependencyCallback(id, entryToDispose) {
if (entryToDispose !== null && entryToDispose.dispose) {
entryToDispose.dispose();
}
entryToDispose?.dispose?.();
}
// This function gets called each time a dependency is detected while evaluating a computed.
@ -192,8 +189,8 @@ var computedFn = {
},
markDirty: function () {
// Process "dirty" events if we can handle delayed notifications
if (this._evalDelayed && !this[computedState].isBeingEvaluated) {
this._evalDelayed(false /*isChange*/);
if (!this[computedState].isBeingEvaluated) {
this._evalDelayed?.(false /*isChange*/);
}
},
isActive: function () {
@ -214,7 +211,7 @@ var computedFn = {
evaluatePossiblyAsync: function () {
var computedObservable = this,
throttleEvaluationTimeout = computedObservable['throttleEvaluation'];
if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) {
if (throttleEvaluationTimeout >= 0) {
clearTimeout(this[computedState].evaluationTimeoutInstance);
this[computedState].evaluationTimeoutInstance = setTimeout(() =>
computedObservable.evaluateImmediate(true /*notifyChange*/)
@ -244,7 +241,7 @@ var computedFn = {
return;
}
if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen && disposeWhen()) {
if (state.disposeWhenNodeIsRemoved && !ko.utils.domNodeIsAttachedToDocument(state.disposeWhenNodeIsRemoved) || disposeWhen?.()) {
// See comment above about suppressDisposalUntilDisposeWhenReturnsFalse
if (!state.suppressDisposalUntilDisposeWhenReturnsFalse) {
computedObservable.dispose();
@ -366,7 +363,7 @@ var computedFn = {
var state = this[computedState];
if (!state.isSleeping && state.dependencyTracking) {
ko.utils.objectForEach(state.dependencyTracking, (id, dependency) =>
dependency.dispose && dependency.dispose()
dependency.dispose?.()
);
}
if (state.disposeWhenNodeIsRemoved && state.domNodeDisposalCallback) {

View file

@ -14,12 +14,10 @@ ko.observable = initialValue => {
}
return this; // Permits chained assignments
}
else {
// Read
ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
return observable[observableLatestValue];
}
}
observable[observableLatestValue] = initialValue;
@ -40,7 +38,7 @@ ko.observable = initialValue => {
var observableFn = {
'toJSON': function() {
let value = this[observableLatestValue];
return value && value.toJSON ? value.toJSON() : value;
return value?.toJSON?.() || value;
},
equalityComparer: valuesArePrimitiveAndEqual,
peek: function() { return this[observableLatestValue]; },

View file

@ -2,7 +2,7 @@ const arrayChangeEventName = 'arrayChange';
ko.extenders['trackArrayChanges'] = (target, options) => {
// Use the provided options--each call to trackArrayChanges overwrites the previously set options
target.compareArrayOptions = {};
if (options && typeof options == "object") {
if (typeof options == "object") {
ko.utils.extend(target.compareArrayOptions, options);
}
target.compareArrayOptions['sparse'] = true;
@ -81,7 +81,7 @@ ko.extenders['trackArrayChanges'] = (target, options) => {
cachedDiff = null;
pendingChanges = 0;
if (changes && changes.length) {
if (changes?.length) {
target.notifySubscribers(changes, arrayChangeEventName);
}
}

View file

@ -197,4 +197,4 @@ ko.subscribable['fn'] = ko_subscribable_fn;
ko.isSubscribable = instance =>
instance != null && typeof instance.subscribe == "function" && typeof instance.notifySubscribers == "function";
typeof instance?.subscribe == "function" && typeof instance.notifySubscribers == "function";

View file

@ -1,18 +1,9 @@
ko.tasks = (() => {
var taskQueue = [],
taskQueueLength = 0,
nextHandle = 1,
nextIndexToProcess = 0,
// Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+
// From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT
scheduler = (callback => {
var div = document.createElement("div");
new MutationObserver(callback).observe(div, {attributes: true});
return () => div.classList.toggle("foo");
})(scheduledProcess);
function processTasks() {
processTasks = () => {
if (taskQueueLength) {
// Each mark represents the end of a logical group of tasks and the number of these groups is
// limited to prevent unchecked recursion.
@ -39,32 +30,28 @@ ko.tasks = (() => {
}
}
}
}
},
function scheduledProcess() {
scheduledProcess = () => {
processTasks();
// Reset the queue
nextIndexToProcess = taskQueueLength = taskQueue.length = 0;
}
var tasks = {
schedule: func => {
if (!taskQueueLength) {
scheduler(scheduledProcess);
}
taskQueue[taskQueueLength++] = func;
return nextHandle++;
},
cancel: handle => {
var index = handle - (nextHandle - taskQueueLength);
if (index >= nextIndexToProcess && index < taskQueueLength) {
taskQueue[index] = null;
}
// Chrome 27+, Firefox 14+, IE 11+, Opera 15+, Safari 6.1+
// From https://github.com/petkaantonov/bluebird * Copyright (c) 2014 Petka Antonov * License: MIT
scheduler = (callback => {
var div = document.createElement("div");
new MutationObserver(callback).observe(div, {attributes: true});
return () => div.classList.toggle("foo");
})(scheduledProcess);
return {
schedule: func => {
taskQueueLength || scheduler(scheduledProcess);
taskQueue[taskQueueLength++] = func;
}
};
return tasks;
})();

View file

@ -28,9 +28,9 @@
nextInQueue = ko.virtualElements.nextSibling(node);
action(node, nextInQueue);
}
};
},
function activateBindingsOnContinuousNodeArray(continuousNodeArray, bindingContext) {
activateBindingsOnContinuousNodeArray = (continuousNodeArray, bindingContext) => {
// To be used on any nodes that have been rendered by a template and have been inserted into some parent element
// Walks through continuousNodeArray (which *must* be continuous, i.e., an uninterrupted sequence of sibling nodes, because
// the algorithm for walking them relies on this), and for each top-level item in the virtual-element sense,
@ -52,15 +52,15 @@
// Make sure any changes done by applyBindings or unmemoize are reflected in the array
ko.utils.fixUpContinuousNodeArray(continuousNodeArray, parentNode);
}
}
},
function getFirstNodeFromPossibleArray(nodeOrNodeArray) {
getFirstNodeFromPossibleArray = (nodeOrNodeArray) => {
return nodeOrNodeArray.nodeType ? nodeOrNodeArray
: nodeOrNodeArray.length > 0 ? nodeOrNodeArray[0]
: null;
}
},
function executeTemplate(targetNodeOrNodeArray, renderMode, template, bindingContext) {
executeTemplate = (targetNodeOrNodeArray, renderMode, template, bindingContext) => {
var firstTargetNode = targetNodeOrNodeArray && getFirstNodeFromPossibleArray(targetNodeOrNodeArray);
var templateDocument = (firstTargetNode || template || {}).ownerDocument;
@ -89,9 +89,9 @@
}
return renderedNodesArray;
}
},
function resolveTemplateName(template, data, context) {
resolveTemplateName = (template, data, context) => {
// The template can be specified as:
if (ko.isObservable(template)) {
// 1. An observable, with string value
@ -99,7 +99,7 @@
}
// 2. A function of (data, context) returning a string ELSE 3. A string
return (typeof template === 'function') ? template(data, context) : template;
}
};
ko.renderTemplate = function (template, dataOrBindingContext, options, targetNodeOrNodeArray, renderMode) {
options = options || {};
@ -113,7 +113,7 @@
return ko.computed( // So the DOM is automatically updated when any dependency changes
() => {
// Ensure we've got a proper binding context to work with
var bindingContext = (dataOrBindingContext && (dataOrBindingContext instanceof ko.bindingContext))
var bindingContext = (dataOrBindingContext instanceof ko.bindingContext)
? dataOrBindingContext
: new ko.bindingContext(dataOrBindingContext, null, null, null, { "exportDependencies": true });
@ -174,7 +174,7 @@
subscription.disposeWhenNodeIsRemoved(targetNode);
return subscription;
} else {
}
return ko.computed(() => {
var unwrappedArray = ko.utils.unwrapObservable(arrayOrObservableArray) || [];
if (typeof unwrappedArray.length == "undefined") // Coerce single value into array
@ -183,14 +183,12 @@
setDomNodeChildrenFromArrayMapping(unwrappedArray);
}, { disposeWhenNodeIsRemoved: targetNode });
}
};
var templateComputedDomDataKey = ko.utils.domData.nextKey();
function disposeOldComputedAndStoreNewOne(element, newComputed) {
var oldComputed = ko.utils.domData.get(element, templateComputedDomDataKey);
if (oldComputed && (typeof(oldComputed.dispose) == 'function'))
oldComputed.dispose();
oldComputed?.dispose?.();
ko.utils.domData.set(element, templateComputedDomDataKey, (newComputed && (!newComputed.isActive || newComputed.isActive())) ? newComputed : undefined);
}
@ -214,7 +212,7 @@
// If the nodes are already attached to a KO-generated container, we reuse that container without moving the
// elements to a new one (we check only the first node, as the nodes are always moved together)
let container = nodes[0] && nodes[0].parentNode;
let container = nodes[0]?.parentNode;
if (!container || !ko.utils.domData.get(container, cleanContainerDomDataKey)) {
container = ko.utils.moveCleanedNodesToContainerElement(nodes);
ko.utils.domData.set(container, cleanContainerDomDataKey, true);
@ -224,7 +222,7 @@
} else {
// It's an anonymous template - store the element contents, then clear the element
var templateNodes = ko.virtualElements.childNodes(element);
if (templateNodes.length > 0) {
if (templateNodes.length) {
let container = ko.utils.moveCleanedNodesToContainerElement(templateNodes); // This also removes the nodes from their current parent
new ko.templateSources.anonymousTemplate(element).nodes(container);
} else {

View file

@ -10,9 +10,7 @@ ko.utils.domData = {
if (dataStore.has(node)) {
dataStore.get(node)[key] = value;
} else {
let dataForNode = {};
dataForNode[key] = value;
dataStore.set(node, dataForNode);
dataStore.set(node, {[key]:value});
}
return value;
},

View file

@ -9,7 +9,7 @@ ko.utils = {
// Ensure it's a real array, as we're about to reparent the nodes and
// we don't want the underlying collection to change while we're doing that.
var nodesArray = [...nodes];
var templateDocument = (nodesArray[0] && nodesArray[0].ownerDocument) || document;
var templateDocument = nodesArray[0]?.ownerDocument || document;
var container = templateDocument.createElement('div');
nodesArray.forEach(node => container.append(ko.cleanNode(node)));
@ -80,7 +80,7 @@ ko.utils = {
node.ownerDocument.documentElement.contains(node.nodeType !== 1 ? node.parentNode : node),
triggerEvent: (element, eventType) => {
if (!(element && element.nodeType))
if (!element?.nodeType)
throw new Error("element must be a DOM node when calling triggerEvent");
element.dispatchEvent(new Event(eventType));

View file

@ -34,7 +34,7 @@
while (n--) {
route = routes[n];
if ((!i || route.greedy) && route.match(request)) {
route.callback && route.callback(...route._getParamsArray(request));
route.callback?.(...route._getParamsArray(request));
++i;
}
}
@ -68,14 +68,14 @@
var val = values[key],
isValid = false;
if (key === 'normalize_'
|| (val == null && this._optionalParamsIds && this._optionalParamsIds.indexOf(key) !== -1)) {
|| (val == null && this._optionalParamsIds?.includes(key))) {
isValid = true;
}
else if (validationRule instanceof RegExp) {
isValid = validationRule.test(val);
}
else if (Array.isArray(validationRule)) {
isValid = validationRule.indexOf(val) !== -1;
isValid = validationRule.includes(val);
}
else if (isFunction(validationRule)) {
isValid = validationRule(val, request, values);
@ -133,7 +133,7 @@
captureVals = (regex, pattern) => {
var vals = [], match;
while (match = regex.exec(pattern)) {
while ((match = regex.exec(pattern))) {
vals.push(match[1]);
}
return vals;
@ -141,9 +141,7 @@
getParamValues = (request, regexp) => {
var vals = regexp.exec(request);
if (vals) {
vals.shift();
}
vals?.shift();
return vals;
},
compilePattern = pattern => {

View file

@ -15,11 +15,11 @@
_hashValRegexp = /#(.*)$/,
_hashRegexp = /^[#/]+/,
_hashTrim = /^\/|\$/g,
_trimHash = hash => hash ? hash.replace(_hashTrim, '') : '',
_trimHash = hash => hash?.replace(_hashTrim, '') || '',
_getWindowHash = () => {
//parsed full URL instead of getting window.location.hash because Firefox decode hash value (and all the other browsers don't)
var result = _hashValRegexp.exec( location.href );
return (result && result[1]) ? decodeURIComponent(result[1]) : '';
return result?.[1] ? decodeURIComponent(result[1]) : '';
},
_registerChange = newHash => {
if (_hash !== newHash) {

View file

@ -144,7 +144,7 @@ const
},
getClosest = ( node, root, selector ) => {
node = (node && !node.closest) ? node.parentElement : node;
node = node && node.closest(selector);
node = node?.closest(selector);
return (node && root.contains(node)) ? node : null;
},
getNearest = ( node, root, tag, attributes ) => {
@ -188,8 +188,7 @@ const
detach = node => {
// node.remove();
let parent = node.parentNode;
parent && parent.removeChild( node );
node.parentNode?.removeChild( node );
return node;
},
@ -254,8 +253,7 @@ const
if ( isInline( node ) ) {
child = node.firstChild;
while ( isWebKit && child &&
child.nodeType === TEXT_NODE && !child.data ) {
while ( isWebKit && child?.nodeType === TEXT_NODE && !child.data ) {
child.remove( );
child = node.firstChild;
}
@ -317,9 +315,7 @@ const
}
wrapper = null;
}
if ( isContainer( child ) ) {
fixContainer( child, root );
}
isContainer( child ) && fixContainer( child, root );
}
/*
// Not live
@ -349,9 +345,7 @@ const
}
});
*/
if ( wrapper ) {
container.append( fixCursor( wrapper, root ) );
}
wrapper && container.append( fixCursor( wrapper, root ) );
return container;
},
@ -488,7 +482,7 @@ const
// Remove extra <BR> fixer if present.
last = block.lastChild;
if ( last && last.nodeName === 'BR' ) {
if ( last?.nodeName === 'BR' ) {
last.remove( );
--offset;
}
@ -648,10 +642,8 @@ const
// Merge text nodes if adjacent. IE10 in particular will not focus
// between two text nodes
after = common.childNodes[ startOffset ];
before = after && after.previousSibling;
if ( before &&
before.nodeType === TEXT_NODE &&
after.nodeType === TEXT_NODE ) {
before = after?.previousSibling;
if ( before?.nodeType === TEXT_NODE && after.nodeType === TEXT_NODE ) {
startContainer = before;
startOffset = before.length;
beforeText = before.data;
@ -822,7 +814,7 @@ const
if ( nodeAfterSplit && isContainer( nodeAfterSplit ) ) {
mergeContainers( nodeAfterSplit, root );
}
nodeAfterSplit = nodeBeforeSplit && nodeBeforeSplit.nextSibling;
nodeAfterSplit = nodeBeforeSplit?.nextSibling;
if ( nodeAfterSplit && isContainer( nodeAfterSplit ) ) {
mergeContainers( nodeAfterSplit, root );
}
@ -872,7 +864,7 @@ const
while ( endContainer.nodeType !== TEXT_NODE ) {
child = endContainer.childNodes[ endOffset - 1 ];
if ( !child || isLeaf( child ) ) {
if ( maySkipBR && child && child.nodeName === 'BR' ) {
if ( maySkipBR && child?.nodeName === 'BR' ) {
--endOffset;
maySkipBR = false;
continue;
@ -1295,7 +1287,7 @@ const
break;
}
while ( child && child.nodeType === TEXT_NODE && !child.data ) {
while ( child?.nodeType === TEXT_NODE && !child.data ) {
next = child.nextSibling;
if ( !next || next.nodeName === 'BR' ) {
break;
@ -1327,7 +1319,7 @@ const
toggleList = ( type, methodIfNotInList ) => ( self, event ) => {
event.preventDefault();
let parent = self.getSelectionClosest('UL,OL');
if (parent && type == parent.nodeName) {
if (type == parent?.nodeName) {
self.removeList();
} else {
self[ methodIfNotInList ]();
@ -1680,7 +1672,7 @@ const
base = base || {};
extras && Object.entries(extras).forEach(([prop,value])=>{
if ( mayOverride || !( prop in base ) ) {
base[ prop ] = ( value && value.constructor === Object ) ?
base[ prop ] = ( value?.constructor === Object ) ?
mergeObjects( base[ prop ], value, mayOverride ) :
value;
}
@ -1996,7 +1988,7 @@ function onCopy ( event ) {
function onPaste ( event ) {
let clipboardData = event.clipboardData;
let items = clipboardData && clipboardData.items;
let items = clipboardData?.items;
let imageItem = null;
let plainItem = null;
let htmlItem = null;
@ -2198,7 +2190,7 @@ let keyHandlers = {
cursorOffset = range.endOffset;
if ( cursorContainer.nodeType === ELEMENT_NODE ) {
nodeAfterCursor = cursorContainer.childNodes[ cursorOffset ];
if ( nodeAfterCursor && nodeAfterCursor.nodeName === 'IMG' ) {
if ( nodeAfterCursor?.nodeName === 'IMG' ) {
event.preventDefault();
detach( nodeAfterCursor );
moveRangeBoundariesDownTree( range );
@ -2665,7 +2657,7 @@ class Squire
win.focus();
}
let sel = win.getSelection();
if ( sel && sel.setBaseAndExtent ) {
if ( sel?.setBaseAndExtent ) {
sel.setBaseAndExtent(
range.startContainer,
range.startOffset,
@ -2690,7 +2682,7 @@ class Squire
let range, startContainer, endContainer, node;
// If not focused, always rely on cached range; another function may
// have set it but the DOM is not modified until focus again
if ( this._isFocused && sel && sel.rangeCount ) {
if ( this._isFocused && sel?.rangeCount ) {
range = sel.getRangeAt( 0 ).cloneRange();
startContainer = range.startContainer;
endContainer = range.endContainer;
@ -2841,7 +2833,7 @@ class Squire
endContainer =
startContainer.childNodes[ range.startOffset - 1 ];
}
if ( endContainer && endContainer.nodeType === TEXT_NODE ) {
if ( endContainer?.nodeType === TEXT_NODE ) {
range.setStart( endContainer, 0 );
range.collapse( true );
}
@ -3647,7 +3639,7 @@ class Squire
let text, event;
if ( !node || node.nodeType !== TEXT_NODE ) {
text = doc.createTextNode( '' );
node && node.childNodes[ offset ].before( text );
node?.childNodes[ offset ].before( text );
node = text;
offset = 0;
}
@ -3735,7 +3727,7 @@ class Squire
let start = range ? range.startContainer : 0;
let end = range ? range.endContainer : 0;
// When the selection is all the text inside an element, set style on the element itself
if ( start && TEXT_NODE === start.nodeType && 0 === range.startOffset && start === end && end.length === range.endOffset ) {
if ( TEXT_NODE === start?.nodeType && 0 === range.startOffset && start === end && end.length === range.endOffset ) {
this.saveUndoState( range );
setStyle( start.parentNode, style );
this.setSelection( range );