@ribajs/router
Version:
Routing extension for Riba.js inspired by Barba.js
408 lines • 35.4 kB
JavaScript
export * from "./Dom.js";
export * from "./Prefetch.js";
import { EventDispatcher } from "@ribajs/events";
import { HttpService } from "@ribajs/core";
import { cleanLink, getPort, normalizeUrl, getUrl, isBoolean, getElementFromEvent, getDataset, scrollTo, } from "@ribajs/utils";
import { BaseCache } from "@ribajs/cache";
import { HideShowTransition } from "../Transition/index.js";
import { Dom } from "./Dom.js";
import { HistoryManager } from "@ribajs/history";
import { ROUTE_ERROR_CLASS, IGNORE_CLASS_LINK } from "../../constants.js";
import { RouterService } from "../../services/index.js";
class Pjax {
static cache = new BaseCache();
static getInstance(id = "main") {
const result = Pjax.instances[id];
if (!result) {
console.warn(`[Pjax.getInstance] No pjax instance for viewId "${id}" found!`);
}
return result;
}
static preventCheckUrl(href) {
const element = document.createElement("a");
element.setAttribute("href", href);
if (!element) {
return false;
}
if (!href) {
return false;
}
if (cleanLink(href) === cleanLink(location.href)) {
return false;
}
if (window.location.protocol !== element.protocol ||
window.location.hostname !== element.hostname) {
return false;
}
if (getPort() !== getPort(element.port)) {
return false;
}
return true;
}
static preventCheck(url, element, evt) {
if (!window.history.pushState) {
return false;
}
if (!this.preventCheckUrl(url)) {
return false;
}
if (evt) {
if ((evt && evt.which && evt.which > 1) ||
evt.metaKey ||
evt.ctrlKey ||
evt.shiftKey ||
evt.altKey) {
return false;
}
}
if (element) {
if (element.target &&
element.target === "_blank") {
return false;
}
if (element.getAttribute &&
typeof element.getAttribute("download") === "string") {
return false;
}
if (element.classList.contains(IGNORE_CLASS_LINK)) {
return false;
}
}
return true;
}
static getHref(el) {
if (!el) {
return undefined;
}
if (el.getAttribute && typeof el.getAttribute("xlink:href") === "string") {
return el.getAttribute("xlink:href") || undefined;
}
if (typeof el.href === "string" ||
(el.hasAttribute && el.hasAttribute("href"))) {
const href = el.href || el.getAttribute("href");
if (!href) {
console.error("href attribute not found for element: ", el);
throw new Error("href attribute not found!");
}
return href;
}
return undefined;
}
static instances = {};
history = new HistoryManager();
cacheEnabled = true;
transitionProgress = false;
listenAllLinks;
listenPopstate;
parseTitle;
changeBrowserUrl;
dispatcher;
transition;
wrapper;
viewId = "main";
containerSelector;
prefetchLinks;
scrollToAnchorOffset;
constructor({ id, action = "replace", wrapper, containerSelector = "[data-namespace]", listenAllLinks = false, listenPopstate = true, parseTitle = true, changeBrowserUrl = true, prefetchLinks = true, scrollToTop = true, scrollToAnchorOffset = RouterService.options.scrollToAnchorOffset, }) {
if (id) {
this.viewId = id;
}
let instance = this;
this.scrollToAnchorOffset = scrollToAnchorOffset || 0;
this.dispatcher = new EventDispatcher(this.viewId);
this.listenAllLinks = listenAllLinks;
this.listenPopstate = listenPopstate;
this.parseTitle = parseTitle;
this.changeBrowserUrl = changeBrowserUrl;
this.containerSelector = containerSelector;
this.prefetchLinks = prefetchLinks;
if (Pjax.instances[this.viewId]) {
instance = Pjax.instances[this.viewId];
}
instance.transition =
instance.transition || new HideShowTransition(action, scrollToTop);
instance.wrapper = instance.wrapper || wrapper;
instance.containerSelector =
instance.containerSelector || containerSelector;
instance.listenAllLinks = isBoolean(instance.listenAllLinks)
? instance.listenAllLinks
: listenAllLinks;
instance.listenPopstate = isBoolean(instance.listenPopstate)
? instance.listenPopstate
: listenPopstate;
instance.parseTitle = isBoolean(instance.parseTitle)
? instance.parseTitle
: parseTitle;
instance.changeBrowserUrl = isBoolean(instance.changeBrowserUrl)
? instance.changeBrowserUrl
: changeBrowserUrl;
instance.prefetchLinks = isBoolean(instance.prefetchLinks)
? instance.prefetchLinks
: prefetchLinks;
if (instance.wrapper) {
instance.wrapper.setAttribute("aria-live", "polite");
}
Pjax.instances[this.viewId] = instance;
return Pjax.instances[this.viewId];
}
setActiveWrapper(wrapper) {
this.wrapper = wrapper;
}
start() {
if (this.wrapper) {
try {
this.init(this.wrapper, this.listenAllLinks, this.listenPopstate);
}
catch (error) {
console.error(error);
}
}
else {
console.error(`Can't init pjax without wrapper`);
}
}
getCurrentUrl() {
return cleanLink(getUrl());
}
goTo(url, newTab = false) {
if (newTab) {
const win = window.open(url, "_blank");
if (win) {
return win.focus();
}
return false;
}
if (url.startsWith("http")) {
url = normalizeUrl(url).url;
}
if (!url.startsWith("http")) {
if (this.changeBrowserUrl) {
window.history.pushState(null, "", url);
}
return this.onStateChange(undefined, url);
}
else {
this.forceGoTo(url);
}
}
getTransition() {
return this.transition || new HideShowTransition();
}
prefetchLink(href) {
href = normalizeUrl(href).url;
const follow = Pjax.preventCheckUrl(href);
if (follow) {
return this.loadResponseCached(href, true, false);
}
}
prefetchLinkElement(linkElement, head) {
const rel = linkElement.getAttribute("rel");
const href = Pjax.getHref(linkElement);
if (rel === "router-preload" &&
href &&
this.cacheEnabled &&
!linkElement.classList.contains(ROUTE_ERROR_CLASS)) {
try {
this.prefetchLink(href);
}
catch (error) {
linkElement.classList.add(ROUTE_ERROR_CLASS);
console.error(error);
}
}
head.appendChild(linkElement);
}
removePrefetchLinks(head) {
const removePrefetchLinkElements = head.querySelectorAll('link[href][rel="dns-prefetch"], link[href][rel="preconnect"], link[href][rel="prefetch"], link[href][rel="subresource"], link[href][rel="preload"], link[href][rel="router-preload"]');
removePrefetchLinkElements.forEach((linkElement) => {
if (linkElement && linkElement.parentNode) {
linkElement.parentNode.removeChild(linkElement);
}
});
}
replacePrefetchLinkElements(prefetchLinks) {
const head = document.head || document.getElementsByTagName("head")[0];
this.removePrefetchLinks(head);
prefetchLinks.forEach((linkElement) => {
this.prefetchLinkElement(linkElement, head);
});
}
async loadCached(url) {
try {
const { responsePromise } = await this.loadResponseCached(url, false, true);
if (!this.wrapper) {
throw new Error("[Pjax] you need a wrapper!");
}
const response = await responsePromise;
Dom.putContainer(response.container, this.wrapper);
if (this.parseTitle === true && response.title) {
document.title = response.title;
}
if (this.prefetchLinks === true && response.prefetchLinks) {
this.replacePrefetchLinkElements(response.prefetchLinks);
}
return response.container;
}
catch (error) {
console.error(error);
this.forceGoTo(url);
throw error;
}
}
async loadResponseCached(url, forceCache = false, fallback = true) {
let responsePromise;
try {
if (this.cacheEnabled) {
responsePromise = Pjax.cache.get(url);
if (responsePromise) {
return {
fromCache: true,
responsePromise,
};
}
}
responsePromise = this.loadResponse(url, forceCache);
if (this.cacheEnabled && responsePromise) {
Pjax.cache.set(url, responsePromise);
}
else {
}
}
catch (error) {
console.error(error);
if (fallback) {
this.forceGoTo(url);
}
throw error;
}
return {
fromCache: false,
responsePromise,
};
}
async loadResponse(url, forceCache = false) {
const options = forceCache
? { cache: "force-cache" }
: {};
const data = await HttpService.get(url, undefined, "html", {}, options);
if (!data || !data.body) {
throw new Error("No body!");
}
const response = Dom.parseResponse(data.body, this.parseTitle, this.containerSelector, this.prefetchLinks);
return response;
}
bindEvents(listenAllLinks, listenPopstate) {
if (listenAllLinks) {
document.addEventListener("click", this.onLinkClickIntern.bind(this));
}
if (listenPopstate) {
window.addEventListener("popstate", this.onStateChange.bind(this));
}
}
forceGoTo(url) {
console.warn("forceGoTo", url);
if (typeof url === "string") {
window.location.href = url;
}
else if (url && url.href) {
window.location.href = url.href;
}
else {
throw new Error("Invalid url");
}
}
onLinkClickIntern(evt) {
let el = getElementFromEvent(evt);
while (el && !Pjax.getHref(el)) {
el = el.parentNode;
}
if (!el || el.nodeName !== "A") {
return;
}
const href = Pjax.getHref(el);
if (el.classList.contains("route") || el.hasAttribute("rv-route")) {
return;
}
if (!href) {
throw new Error(`Url is not defined, you can't cache the link without the url. Please make sure your element has the href attribute or pass the url directly to this function.`);
}
if (el.classList.contains("route") || el.hasAttribute("rv-route")) {
return false;
}
return this.onLinkClick(evt, el, href);
}
onLinkClick(evt, el, href, newTab = false) {
const { url, location } = normalizeUrl(href);
const { location: currLocation } = normalizeUrl();
if (location.hash && currLocation.pathname === location.pathname) {
let id = location.hash.slice(1);
id = decodeURI(id);
const scrollToElement = document.getElementById(id);
if (scrollToElement) {
evt.stopPropagation();
evt.preventDefault();
if (this.changeBrowserUrl) {
window.history.pushState(null, "", url);
}
return scrollTo(scrollToElement, this.scrollToAnchorOffset);
}
}
if (!url) {
throw new Error("url is falsy");
}
const follow = Pjax.preventCheck(url, el, evt);
if (follow) {
evt.stopPropagation();
evt.preventDefault();
this.dispatcher.trigger("linkClicked", el, evt);
this.goTo(url, newTab);
}
}
async onStateChange(event, newUrl = this.getCurrentUrl()) {
newUrl = normalizeUrl(newUrl).url;
const oldUrl = normalizeUrl(this.history.currentStatus().url).url;
if (this.changeBrowserUrl && oldUrl === newUrl) {
return false;
}
this.history.add(newUrl);
this.dispatcher.trigger("initStateChange", this.viewId, this.history.currentStatus(), this.history.prevStatus());
const oldContainer = Dom.getContainer(document, this.containerSelector);
const newContainerPromise = this.loadCached(newUrl);
const transition = this.getTransition();
this.transitionProgress = true;
const transitionResult = transition.init(oldContainer, newContainerPromise);
this.onNewContainerLoaded(await newContainerPromise);
await transitionResult;
this.onTransitionEnd();
}
onNewContainerLoaded(container) {
const currentStatus = this.history.currentStatus();
currentStatus.namespace = Dom.getNamespace(container);
const dataset = getDataset(container);
this.dispatcher.trigger("newPageReady", this.viewId, this.history.currentStatus(), this.history.prevStatus(), container, container.innerHTML, dataset, false);
}
onTransitionEnd() {
this.transitionProgress = false;
this.dispatcher.trigger("transitionCompleted", this.viewId, this.history.currentStatus(), this.history.prevStatus());
}
init(wrapper, listenAllLinks, listenPopstate) {
const initialResponse = Dom.parseInitial(this.parseTitle, this.containerSelector, this.prefetchLinks);
const url = window.location.pathname;
if (this.cacheEnabled) {
const currentUrl = normalizeUrl(window.location.href).url;
if (!Pjax.cache.get(url)) {
this.loadResponseCached(currentUrl, false, false);
}
}
this.replacePrefetchLinkElements(initialResponse.prefetchLinks);
this.wrapper = wrapper;
this.history.add(this.getCurrentUrl(), Dom.getNamespace(initialResponse.container));
this.dispatcher.trigger("initStateChange", this.viewId, this.history.currentStatus());
const dataset = getDataset(initialResponse.container);
this.dispatcher.trigger("newPageReady", this.viewId, this.history.currentStatus(), {}, initialResponse.container, initialResponse.container.innerHTML, dataset, true);
this.dispatcher.trigger("transitionCompleted", this.viewId, this.history.currentStatus());
this.bindEvents(listenAllLinks, listenPopstate);
}
}
export { Pjax };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvUGpheC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGVBQWUsQ0FBQztBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFXeEQsTUFBTSxJQUFJO0lBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsRUFBcUIsQ0FBQztJQUVsRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxNQUFNO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FDVixtREFBbUQsRUFBRSxVQUFVLENBQ2hFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUtTLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBWTtRQUkzQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUdELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFHRCxJQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFNLE9BQTZCLENBQUMsUUFBUTtZQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBTSxPQUE2QixDQUFDLFFBQVEsRUFDcEUsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUdELElBQUksT0FBTyxFQUFFLEtBQUssT0FBTyxDQUFFLE9BQTZCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLTSxNQUFNLENBQUMsWUFBWSxDQUN4QixHQUFXLEVBQ1gsT0FBa0UsRUFDbEUsR0FBVztRQUVYLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUVSLElBQ0UsQ0FBQyxHQUFHLElBQUssR0FBVyxDQUFDLEtBQUssSUFBSyxHQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsR0FBVyxDQUFDLE9BQU87Z0JBQ25CLEdBQVcsQ0FBQyxPQUFPO2dCQUNuQixHQUFXLENBQUMsUUFBUTtnQkFDcEIsR0FBVyxDQUFDLE1BQU0sRUFDbkIsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUVaLElBQ0csT0FBNkIsQ0FBQyxNQUFNO2dCQUNwQyxPQUE2QixDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQ2xELENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBR0QsSUFDRSxPQUFPLENBQUMsWUFBWTtnQkFDcEIsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFFBQVEsRUFDcEQsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDbEQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQU1NLE1BQU0sQ0FBQyxPQUFPLENBQ25CLEVBQTBFO1FBRTFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxZQUFZLElBQUksT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQ0UsT0FBUSxFQUF3QixDQUFDLElBQUksS0FBSyxRQUFRO1lBQ2xELENBQUMsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzVDLENBQUM7WUFDRCxNQUFNLElBQUksR0FBSSxFQUF3QixDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxNQUFNLENBQUMsU0FBUyxHQUFrQixFQUFFLENBQUM7SUFFdEMsT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFLL0IsWUFBWSxHQUFHLElBQUksQ0FBQztJQUtwQixrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFeEIsY0FBYyxDQUFVO0lBRXhCLGNBQWMsQ0FBVTtJQUV4QixVQUFVLENBQVU7SUFFcEIsZ0JBQWdCLENBQVU7SUFFMUIsVUFBVSxDQUFrQjtJQUU1QixVQUFVLENBQWM7SUFFeEIsT0FBTyxDQUFlO0lBRXRCLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFFaEIsaUJBQWlCLENBQVM7SUFLMUIsYUFBYSxDQUFVO0lBRXZCLG9CQUFvQixDQUFTO0lBS3ZDLFlBQVksRUFDVixFQUFFLEVBQ0YsTUFBTSxHQUFHLFNBQVMsRUFDbEIsT0FBTyxFQUNQLGlCQUFpQixHQUFHLGtCQUFrQixFQUN0QyxjQUFjLEdBQUcsS0FBSyxFQUN0QixjQUFjLEdBQUcsSUFBSSxFQUNyQixVQUFVLEdBQUcsSUFBSSxFQUNqQixnQkFBZ0IsR0FBRyxJQUFJLEVBQ3ZCLGFBQWEsR0FBRyxJQUFJLEVBQ3BCLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEdBQ3JEO1FBQ1osSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFZLENBQUM7UUFFNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELFFBQVEsQ0FBQyxVQUFVO1lBQ2pCLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUMvQyxRQUFRLENBQUMsaUJBQWlCO1lBQ3hCLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQztRQUVsRCxRQUFRLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQzFELENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYztZQUN6QixDQUFDLENBQUMsY0FBYyxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDMUQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjO1lBQ3pCLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDbkIsUUFBUSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVU7WUFDckIsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUNmLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1lBQzlELENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO1lBQzNCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQixRQUFRLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYTtZQUN4QixDQUFDLENBQUMsYUFBYSxDQUFDO1FBRWxCLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUtNLGdCQUFnQixDQUFDLE9BQW9CO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFLTSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUtNLGFBQWE7UUFDbEIsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBS00sSUFBSSxDQUFDLEdBQVcsRUFBRSxNQUFNLEdBQUcsS0FBSztRQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0IsR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUVOLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFLTSxhQUFhO1FBRWxCLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZO1FBQzlCLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFLUyxtQkFBbUIsQ0FDM0IsV0FBNEIsRUFDNUIsSUFBcUI7UUFFckIsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQ0UsR0FBRyxLQUFLLGdCQUFnQjtZQUN4QixJQUFJO1lBQ0osSUFBSSxDQUFDLFlBQVk7WUFDakIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLG1CQUFtQixDQUFDLElBQXFCO1FBQ2pELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN0RCxzTEFBc0wsQ0FDeEosQ0FBQztRQUVqQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUE0QixFQUFFLEVBQUU7WUFDbEUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBU1MsMkJBQTJCLENBQ25DLGFBQThEO1FBRTlELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBNEIsRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBTU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDdkQsR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUM7WUFDdkMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0MsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFRTSxLQUFLLENBQUMsa0JBQWtCLENBQzdCLEdBQVcsRUFDWCxVQUFVLEdBQUcsS0FBSyxFQUNsQixRQUFRLEdBQUcsSUFBSTtRQUVmLElBQUksZUFBOEMsQ0FBQztRQUNuRCxJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixPQUFPO3dCQUNMLFNBQVMsRUFBRSxJQUFJO3dCQUNmLGVBQWU7cUJBQ2hCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO1lBRVIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU87WUFDTCxTQUFTLEVBQUUsS0FBSztZQUNoQixlQUFlO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBT00sS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFXLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDdkQsTUFBTSxPQUFPLEdBQXVCLFVBQVU7WUFDNUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtZQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUNoQyxHQUFHLEVBQ0gsU0FBUyxFQUNULE1BQU0sRUFDTixFQUFFLEVBQ0YsT0FBTyxDQUNSLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQ2hDLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBS1MsVUFBVSxDQUFDLGNBQXVCLEVBQUUsY0FBdUI7UUFFbkUsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFLTSxTQUFTLENBQUMsR0FBc0I7UUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksR0FBRyxJQUFLLEdBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUksR0FBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsR0FBVTtRQUNwQyxJQUFJLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvQixFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQStCLENBQUM7UUFDMUMsQ0FBQztRQUVELElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFHOUIsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbEUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUNiLCtKQUErSixDQUNoSyxDQUFDO1FBQ0osQ0FBQztRQUdELElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBS00sV0FBVyxDQUNoQixHQUFVLEVBQ1YsRUFBcUIsRUFDckIsSUFBWSxFQUNaLE1BQU0sR0FBRyxLQUFLO1FBR2QsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUdsRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO2dCQUNELE9BQU8sUUFBUSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVyQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWhELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBS1MsS0FBSyxDQUFDLGFBQWEsQ0FDM0IsS0FBYSxFQUNiLFNBQWlCLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFHckMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRWxFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMvQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FDckIsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FDMUIsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUUvQixNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sbUJBQW1CLENBQUMsQ0FBQztRQUVyRCxNQUFNLGdCQUFnQixDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBS1Msb0JBQW9CLENBQUMsU0FBc0I7UUFDbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVuRCxhQUFhLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUNyQixjQUFjLEVBQ2QsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUN6QixTQUFTLEVBQ1QsU0FBUyxDQUFDLFNBQVMsRUFDbkIsT0FBTyxFQUNQLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUtTLGVBQWU7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUVoQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FDckIscUJBQXFCLEVBQ3JCLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFLUyxJQUFJLENBQ1osT0FBb0IsRUFDcEIsY0FBdUIsRUFDdkIsY0FBdUI7UUFFdkIsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FDdEMsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDZCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLEdBQUcsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUM1QyxDQUFDO1FBR0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3JCLGlCQUFpQixFQUNqQixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQzdCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUNyQixjQUFjLEVBQ2QsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUM1QixFQUFFLEVBQ0YsZUFBZSxDQUFDLFNBQVMsRUFDekIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQ25DLE9BQU8sRUFDUCxJQUFJLENBQ0wsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUNyQixxQkFBcUIsRUFDckIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUM3QixDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQzs7QUFHSCxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMifQ==