resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
327 lines • 26.8 kB
JavaScript
/**
* DOM Adapter - Bridges categorical primitives to browser APIs
* Provides vanilla DOM integration for Signal-Σ, Blocks, CRDTs, and Scheduler
*/
import { signal } from '../../core/signal';
import { getGlobalScheduler, Priority } from '../../scheduler';
export const domSignal = (initial) => {
const sig = signal(initial);
const domSig = {
...sig,
bindToElement: (element, property) => {
const updateElement = (value) => {
element[property] = value;
};
updateElement(sig.value());
return sig.subscribe(updateElement);
},
bindToAttribute: (element, attribute) => {
const updateAttribute = (value) => {
element.setAttribute(attribute, String(value));
};
updateAttribute(sig.value());
return sig.subscribe(updateAttribute);
},
bindToTextContent: (element) => {
const updateText = (value) => {
element.textContent = String(value);
};
updateText(sig.value());
return sig.subscribe(updateText);
},
bindToValue: (element) => {
const updateValue = (value) => {
element.value = String(value);
};
const handleInput = () => {
sig._set(element.value);
};
updateValue(sig.value());
element.addEventListener('input', handleInput);
const unsubscribe = sig.subscribe(updateValue);
return () => {
element.removeEventListener('input', handleInput);
unsubscribe();
};
},
};
return domSig;
};
// Convenience functions for common DOM operations
export const bindElement = (element, signal) => {
const updateElement = (value) => {
element.textContent = String(value);
};
updateElement(signal.value());
return signal.subscribe(updateElement);
};
export const bindAttribute = (element, attribute, signal) => {
const updateAttribute = (value) => {
element.setAttribute(attribute, String(value));
};
updateAttribute(signal.value());
return signal.subscribe(updateAttribute);
};
export const bindProperty = (element, property, signal) => {
const updateProperty = (value) => {
element[property] = value;
};
updateProperty(signal.value());
return signal.subscribe(updateProperty);
};
export const bindEvent = (element, event, signal, extractor = (e) => e.target.value) => {
const handler = (e) => {
signal._set(extractor(e));
};
element.addEventListener(event, handler);
return () => {
element.removeEventListener(event, handler);
};
};
// DOM Block utilities
export const domBlock = (tag, props = {}) => {
const id = `dom-${tag}-${Math.random().toString(36).substr(2, 9)}`;
let element = null;
let children = [];
return {
id,
arity: Infinity,
render: (parent) => {
if (element) {
parent.appendChild(element);
return element;
}
element = document.createElement(tag);
// Apply properties
Object.entries(props).forEach(([key, value]) => {
if (key === 'className') {
element.className = value;
}
else if (key === 'style' && typeof value === 'object') {
Object.assign(element.style, value);
}
else if (key.startsWith('on') && typeof value === 'function') {
const eventName = key.slice(2).toLowerCase();
element.addEventListener(eventName, value);
}
else {
element.setAttribute(key, String(value));
}
});
// Render children
children.forEach((child) => child.render(element));
parent.appendChild(element);
return element;
},
plug: (newChildren) => {
children = [...newChildren];
// If already rendered, update children
if (element) {
// Clear existing children
element.innerHTML = '';
// Render new children
children.forEach((child) => child.render(element));
}
return domBlock(tag, props);
},
destroy: () => {
children.forEach((child) => child.destroy());
if (element && element.parentNode) {
element.parentNode.removeChild(element);
}
element = null;
children = [];
},
};
};
// Reactive DOM block
export const reactiveDOMBlock = (tag, propsSignal) => {
const id = `reactive-dom-${tag}-${Math.random().toString(36).substr(2, 9)}`;
let element = null;
let children = [];
const updateElement = (props) => {
if (!element)
return;
// Clear existing attributes and event listeners
Array.from(element.attributes).forEach((attr) => {
if (!attr.name.startsWith('data-block-')) {
element.removeAttribute(attr.name);
}
});
// Apply new properties
Object.entries(props).forEach(([key, value]) => {
if (key === 'className') {
element.className = value;
}
else if (key === 'style' && typeof value === 'object') {
Object.assign(element.style, value);
}
else if (key.startsWith('on') && typeof value === 'function') {
const eventName = key.slice(2).toLowerCase();
element.addEventListener(eventName, value);
}
else {
element.setAttribute(key, String(value));
}
});
};
const instance = {
id,
arity: Infinity,
signal: propsSignal,
render: (parent) => {
if (element) {
parent.appendChild(element);
return element;
}
element = document.createElement(tag);
element.setAttribute('data-block-id', id);
element.setAttribute('data-block-type', `reactive-dom-${tag}`);
// Initial render
updateElement(propsSignal.value());
// Subscribe to changes
propsSignal.subscribe(updateElement);
// Render children
children.forEach((child) => child.render(element));
parent.appendChild(element);
return element;
},
plug: (newChildren) => {
children = [...newChildren];
// If already rendered, update children
if (element) {
// Clear existing children
element.innerHTML = '';
// Render new children
children.forEach((child) => child.render(element));
}
return instance;
},
update: (newProps) => {
propsSignal._set(newProps);
},
destroy: () => {
children.forEach((child) => child.destroy());
if (element && element.parentNode) {
element.parentNode.removeChild(element);
}
element = null;
children = [];
},
};
return instance;
};
// CRDT DOM synchronization
export const syncCRDTToDOM = (reactiveCRDT, element, renderer) => {
const updateDOM = (value) => {
getGlobalScheduler().schedule({
id: `crdt-sync-${element.id || 'unknown'}`,
priority: Priority.HIGH,
execute: () => renderer(value, element),
});
};
// Initial render
updateDOM(reactiveCRDT.signal.value());
// Subscribe to changes
return reactiveCRDT.subscribe(updateDOM);
};
// Form utilities
export const bindFormToSignal = (form, signal) => {
const updateForm = (data) => {
Object.entries(data).forEach(([key, value]) => {
const input = form.querySelector(`[name="${key}"]`);
if (input) {
if (input.type === 'checkbox') {
input.checked = Boolean(value);
}
else {
input.value = String(value);
}
}
});
};
const handleFormChange = () => {
const formData = new FormData(form);
const data = {};
const entries = Array.from(formData.entries());
for (const [key, value] of entries) {
const input = form.querySelector(`[name="${key}"]`);
if (input) {
if (input.type === 'checkbox') {
data[key] = input.checked;
}
else if (input.type === 'number') {
data[key] = Number(value);
}
else {
data[key] = value;
}
}
}
signal._set(data);
};
// Initial sync
updateForm(signal.value());
// Listen for form changes
form.addEventListener('input', handleFormChange);
form.addEventListener('change', handleFormChange);
// Subscribe to signal changes
const unsubscribe = signal.subscribe(updateForm);
return () => {
form.removeEventListener('input', handleFormChange);
form.removeEventListener('change', handleFormChange);
unsubscribe();
};
};
// Event delegation utilities
export const delegate = (container, selector, eventType, handler) => {
const delegatedHandler = (event) => {
const target = event.target;
const match = target.closest(selector);
if (match && container.contains(match)) {
handler(event, match);
}
};
container.addEventListener(eventType, delegatedHandler);
return () => {
container.removeEventListener(eventType, delegatedHandler);
};
};
// Animation utilities
export const animateElement = (element, keyframes, options = {}) => {
return new Promise((resolve, reject) => {
try {
const animation = element.animate(keyframes, options);
animation.addEventListener('finish', () => resolve());
animation.addEventListener('cancel', () => reject(new Error('Animation cancelled')));
}
catch (error) {
reject(error);
}
});
};
// Intersection Observer integration
export const observeIntersection = (element, callback, options = {}) => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
callback(entry.isIntersecting, entry);
});
}, options);
observer.observe(element);
return () => {
observer.unobserve(element);
observer.disconnect();
};
};
// Resize Observer integration
export const observeResize = (element, callback) => {
const observer = new ResizeObserver((entries) => {
entries.forEach(callback);
});
observer.observe(element);
return () => {
observer.unobserve(element);
observer.disconnect();
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWRhcHRlcnMvZG9tL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFnQi9ELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFJLE9BQVUsRUFBZ0IsRUFBRTtJQUN2RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFNUIsTUFBTSxNQUFNLEdBQWlCO1FBQzNCLEdBQUcsR0FBRztRQUVOLGFBQWEsRUFBRSxDQUFDLE9BQW9CLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO1lBQ3hELE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7Z0JBQ2hDLE9BQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDckMsQ0FBQyxDQUFDO1lBRUYsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsZUFBZSxFQUFFLENBQUMsT0FBb0IsRUFBRSxTQUFpQixFQUFFLEVBQUU7WUFDM0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtnQkFDbkMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDO1lBRUYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsaUJBQWlCLEVBQUUsQ0FBQyxPQUFvQixFQUFFLEVBQUU7WUFDMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFRLEVBQUUsRUFBRTtnQkFDOUIsT0FBTyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDO1lBRUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsV0FBVyxFQUFFLENBQUMsT0FBeUIsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7Z0JBQy9CLE9BQU8sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQztZQUVGLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRTtnQkFDdEIsR0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBcUIsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQztZQUVGLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0MsT0FBTyxHQUFHLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDbEQsV0FBVyxFQUFFLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQ3pCLE9BQW9CLEVBQ3BCLE1BQWlCLEVBQ0gsRUFBRTtJQUNoQixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1FBQ2pDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztJQUVGLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQzNCLE9BQW9CLEVBQ3BCLFNBQWlCLEVBQ2pCLE1BQWlCLEVBQ0gsRUFBRTtJQUNoQixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1FBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQztJQUVGLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLE9BQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLE1BQWlCLEVBQ0gsRUFBRTtJQUNoQixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQVEsRUFBRSxFQUFFO1FBQ2pDLE9BQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUYsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FDdkIsT0FBb0IsRUFDcEIsS0FBYSxFQUNiLE1BQWlCLEVBQ2pCLFlBQWlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUFDLENBQUMsTUFBYyxDQUFDLEtBQUssRUFDakQsRUFBRTtJQUNoQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFO1FBQzFCLE1BQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV6QyxPQUFPLEdBQUcsRUFBRTtRQUNWLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUN0QixHQUFXLEVBQ1gsUUFBNkIsRUFBRSxFQUN4QixFQUFFO0lBQ1QsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkUsSUFBSSxPQUFPLEdBQXVCLElBQUksQ0FBQztJQUN2QyxJQUFJLFFBQVEsR0FBWSxFQUFFLENBQUM7SUFFM0IsT0FBTztRQUNMLEVBQUU7UUFDRixLQUFLLEVBQUUsUUFBUTtRQUVmLE1BQU0sRUFBRSxDQUFDLE1BQW1CLEVBQUUsRUFBRTtZQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUM7WUFFRCxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QyxtQkFBbUI7WUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDeEIsT0FBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7cUJBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUMvRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUM3QyxPQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILGtCQUFrQjtZQUNsQixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxDQUFDLENBQUM7WUFFcEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUMsV0FBb0IsRUFBRSxFQUFFO1lBQzdCLFFBQVEsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFFNUIsdUNBQXVDO1lBQ3ZDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osMEJBQTBCO2dCQUMxQixPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsc0JBQXNCO2dCQUN0QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNaLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLEdBQVcsRUFDWCxXQUE0QyxFQUM3QixFQUFFO0lBQ2pCLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsSUFBSSxPQUFPLEdBQXVCLElBQUksQ0FBQztJQUN2QyxJQUFJLFFBQVEsR0FBWSxFQUFFLENBQUM7SUFFM0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUE4QixFQUFFLEVBQUU7UUFDdkQsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXJCLGdEQUFnRDtRQUNoRCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsdUJBQXVCO1FBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDeEIsT0FBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDN0IsQ0FBQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDN0MsT0FBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQWtCO1FBQzlCLEVBQUU7UUFDRixLQUFLLEVBQUUsUUFBUTtRQUNmLE1BQU0sRUFBRSxXQUFXO1FBRW5CLE1BQU0sRUFBRSxDQUFDLE1BQW1CLEVBQUUsRUFBRTtZQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLENBQUM7WUFFRCxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRS9ELGlCQUFpQjtZQUNqQixhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFbkMsdUJBQXVCO1lBQ3ZCLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFckMsa0JBQWtCO1lBQ2xCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLENBQUMsQ0FBQztZQUVwRCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxXQUFvQixFQUFFLEVBQUU7WUFDN0IsUUFBUSxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztZQUU1Qix1Q0FBdUM7WUFDdkMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWiwwQkFBMEI7Z0JBQzFCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixzQkFBc0I7Z0JBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE1BQU0sRUFBRSxDQUFDLFFBQWlDLEVBQUUsRUFBRTtZQUMzQyxXQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNaLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsMkJBQTJCO0FBQzNCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUMzQixZQUFnQyxFQUNoQyxPQUFvQixFQUNwQixRQUFrRCxFQUNwQyxFQUFFO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBUSxFQUFFLEVBQUU7UUFDN0Isa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDNUIsRUFBRSxFQUFFLGFBQWEsT0FBTyxDQUFDLEVBQUUsSUFBSSxTQUFTLEVBQUU7WUFDMUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixpQkFBaUI7SUFDakIsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV2Qyx1QkFBdUI7SUFDdkIsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQUVGLGlCQUFpQjtBQUNqQixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixJQUFxQixFQUNyQixNQUFpQixFQUNILEVBQUU7SUFDaEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFxQixDQUFDO1lBQ3hFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUM5QixLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7UUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsRUFBTyxDQUFDO1FBRXJCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUUsUUFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FHbkQsQ0FBQztRQUNKLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQXFCLENBQUM7WUFDeEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzdCLElBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNyQyxDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDbEMsSUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsQ0FBQztxQkFBTSxDQUFDO29CQUNMLElBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVBLE1BQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBRUYsZUFBZTtJQUNmLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUUzQiwwQkFBMEI7SUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUVsRCw4QkFBOEI7SUFDOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDckQsV0FBVyxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsNkJBQTZCO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUN0QixTQUFzQixFQUN0QixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUFvRCxFQUN0QyxFQUFFO0lBQ2hCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtRQUN4QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBZ0IsQ0FBQztRQUV0RCxJQUFJLEtBQUssSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXhELE9BQU8sR0FBRyxFQUFFO1FBQ1YsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLHNCQUFzQjtBQUN0QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBb0IsRUFDcEIsU0FBcUIsRUFDckIsVUFBb0MsRUFBRSxFQUN2QixFQUFFO0lBQ2pCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQ3hDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQ3pDLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsT0FBb0IsRUFDcEIsUUFBNkUsRUFDN0UsVUFBb0MsRUFBRSxFQUN4QixFQUFFO0lBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksb0JBQW9CLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNwRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFWixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTFCLE9BQU8sR0FBRyxFQUFFO1FBQ1YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsOEJBQThCO0FBQzlCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUMzQixPQUFvQixFQUNwQixRQUE4QyxFQUNoQyxFQUFFO0lBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDOUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFMUIsT0FBTyxHQUFHLEVBQUU7UUFDVixRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMifQ==