@ribajs/bs4
Version:
Bootstrap 4 module for Riba.js
231 lines • 21 kB
JavaScript
import { extend } from "@ribajs/utils";
import { Component } from "@ribajs/core";
import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js";
import template from "./bs4-tagged-image.component.html?raw";
import { debounce } from "@ribajs/utils/src/control.js";
export class Bs4TaggedImageComponent extends Component {
static tagName = "bs4-tagged-image";
autobind = true;
_debug = false;
static get observedAttributes() {
return ["tags", "options", "debug"];
}
image;
scope = {
debug: false,
tags: [],
options: {
popoverOptions: {},
multiPopover: false,
tagOptions: {},
},
fillPopoverOptions: (options) => {
return {
...this.scope.options.popoverOptions,
...this.scope.options.tagOptions.popoverOptions,
...options,
};
},
triggerOnFocus: (options) => {
return this.scope.fillPopoverOptions(options).trigger ? 0 : null;
},
onClick: this.onClick.bind(this),
onPopoverBound: this.onPopoverBound.bind(this),
onPopoverShown: this.onPopoverShown.bind(this),
onPopoverHidden: this.onPopoverHidden.bind(this),
updateTagPositions: debounce(this.updateTagPositions.bind(this)),
};
constructor() {
super();
this.scope.options.popoverOptions.container = this;
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue) {
if (attributeName === "options") {
if (this.bound) {
this.scope.options = newValue;
}
else {
this.scope.options = extend({ deep: true }, oldValue, newValue);
}
const po = this.scope.options.popoverOptions;
if (po && typeof po.container === "string") {
po.container = document.querySelector(po.container) || undefined;
}
}
}
template() {
if (hasChildNodesTrim(this)) {
this.parseChildTags();
}
return template;
}
async beforeBind() {
await super.beforeBind();
this.image = this.querySelector("img");
this.addEventListeners();
this.initTags();
}
addEventListeners() {
const img = this.image;
img.addEventListener("load", this.scope.updateTagPositions);
img.addEventListener("click", this.scope.onClick);
window.addEventListener("resize", this.scope.updateTagPositions, {
passive: true,
});
}
removeEventListeners() {
const img = this.image;
img.removeEventListener("load", this.scope.updateTagPositions);
img.removeEventListener("click", this.scope.onClick);
window.removeEventListener("resize", this.scope.updateTagPositions);
}
async afterBind() {
this.passImageAttributes();
await super.afterBind();
}
connectedCallback() {
super.connectedCallback();
this.init(Bs4TaggedImageComponent.observedAttributes);
}
disconnectedCallback() {
this.removeEventListener("click", this.scope.onClick);
window.removeEventListener("resize", this.scope.updateTagPositions);
}
parseChildTags() {
this.debug(`parseChildTags()`);
for (const tagEl of Array.from(this.querySelectorAll("tag"))) {
const title = tagEl.getAttribute("title") || "";
const content = tagEl.innerHTML;
const x = ((v) => (isNaN(v) ? Math.random() : v))(parseFloat(tagEl.getAttribute("x") || ""));
const y = ((v) => (isNaN(v) ? Math.random() : v))(parseFloat(tagEl.getAttribute("y") || ""));
const shape = tagEl.getAttribute("shape") || undefined;
const color = tagEl.getAttribute("color") || undefined;
const borderRadius = tagEl.getAttribute("border-radius") || undefined;
const fullSize = tagEl.getAttribute("full-size") || undefined;
const smallSize = tagEl.getAttribute("small-size") || undefined;
const tagData = {
...this.scope.options.tagOptions,
popoverOptions: this.scope.fillPopoverOptions({
title,
content,
html: true,
}),
x,
y,
shape,
color,
borderRadius,
fullSize,
smallSize,
};
this.scope.tags.push(tagData);
}
}
initTags() {
const scopeTagOptions = this.scope.options.tagOptions;
for (const [index, tag] of this.scope.tags.entries()) {
tag.index = index;
tag.shape = tag.shape || scopeTagOptions.shape;
tag.borderRadius = tag.borderRadius || scopeTagOptions.borderRadius;
tag.smallSize = tag.smallSize || scopeTagOptions.smallSize;
tag.fullSize = tag.fullSize || scopeTagOptions.fullSize;
tag.color = tag.color || scopeTagOptions.color;
}
}
passImageAttributes() {
const img = this.image;
const attrs = this.attributes;
for (let i = attrs.length - 1; i >= 0; i--) {
if (attrs[i].name.startsWith("img-")) {
img.setAttribute(attrs[i].name.substr(4), attrs[i].value);
}
}
}
onClick(e) {
if (this.scope.debug) {
const img = this.image;
const { clientTop, clientLeft, width, height, naturalWidth, naturalHeight, } = img;
const { clientX, clientY } = e;
let x = clientX - clientLeft;
let y = clientY - clientTop;
const wRatio = width / naturalWidth;
const hRatio = height / naturalHeight;
let actualWidth = width;
let actualHeight = height;
if (wRatio < hRatio) {
actualWidth = (width * hRatio) / wRatio;
x += (actualWidth - width) / 2;
}
else if (hRatio < wRatio) {
actualHeight = (height * wRatio) / hRatio;
y += (actualHeight - height) / 2;
}
x *= 100 / actualWidth;
y *= 100 / actualHeight;
console.log({ x, y });
}
}
onPopoverBound(event) {
const boundIndexAttr = event.target.getAttribute("index");
if (boundIndexAttr === null) {
throw new Error("popup bound on no index");
}
const boundIndex = parseInt(boundIndexAttr);
if (isNaN(boundIndex)) {
throw new Error(`boundIndex "${boundIndexAttr}" is not a number!`);
}
const foundTag = this.scope.tags.find((tag) => tag.index === boundIndex);
if (foundTag) {
foundTag.el = event.target;
}
else {
throw new Error(`Tag with index (${boundIndex}, "${boundIndexAttr}") not found`);
}
}
onPopoverShown(event) {
for (const tag of this.scope.tags) {
if (tag.el === event.target) {
tag.el.classList.add("active");
}
else {
if (!this.scope.options.multiPopover) {
tag.el?.classList.remove("active");
tag.el?.dispatchEvent(new CustomEvent("trigger-hide"));
}
}
}
}
onPopoverHidden(event) {
const found = this.scope.tags.find((tag) => tag.el === event.target);
if (found) {
found.el?.classList.remove("active");
}
}
updateTagPositions() {
const img = this.image;
const { width, height, naturalWidth, naturalHeight } = img;
const wRatio = naturalWidth / width;
const hRatio = naturalHeight / height;
const fit = window.getComputedStyle(img).getPropertyValue("object-fit");
if ((fit === "cover" && wRatio > hRatio) ||
(fit === "contain" && hRatio > wRatio)) {
for (const tag of this.scope.tags) {
tag.top = tag.y * 100 + "%";
tag.left = ((wRatio / hRatio) * (tag.x - 0.5) + 0.5) * 100 + "%";
}
}
else if (fit === "cover" || fit === "contain") {
for (const tag of this.scope.tags) {
tag.left = tag.x * 100 + "%";
tag.top = ((hRatio / wRatio) * (tag.y - 0.5) + 0.5) * 100 + "%";
}
}
else {
for (const tag of this.scope.tags) {
tag.left = tag.x * 100 + "%";
tag.top = tag.y * 100 + "%";
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LXRhZ2dlZC1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczQtdGFnZ2VkLWltYWdlL2JzNC10YWdnZWQtaW1hZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLFNBQVMsRUFBK0IsTUFBTSxjQUFjLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0QsT0FBTyxRQUFRLE1BQU0sdUNBQXVDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBdUJ4RCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsU0FBUztJQUk3QyxNQUFNLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDO0lBRWpDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDbkIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQW9CO0lBRWxCLEtBQUssR0FBVTtRQUNwQixLQUFLLEVBQUUsS0FBSztRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLEVBQUU7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLEVBQUU7U0FDZjtRQUNELGtCQUFrQixFQUFFLENBQUMsT0FBZ0MsRUFBRSxFQUFFO1lBQ3ZELE9BQU87Z0JBQ0wsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUNwQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjO2dCQUMvQyxHQUFHLE9BQU87YUFDWCxDQUFDO1FBQ0osQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLE9BQWdDLEVBQUUsRUFBRTtZQUNuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDOUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoRCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNqRSxDQUFDO0lBTUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3JELENBQUM7SUFFUyw4QkFBOEIsQ0FDdEMsYUFBcUIsRUFDckIsUUFBYSxFQUNiLFFBQWE7UUFFYixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUM3QyxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLFFBQVE7UUFDaEIsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVTLEtBQUssQ0FBQyxVQUFVO1FBQ3hCLE1BQU0sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQXFCLENBQUM7UUFDM0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQXlCLENBQUM7UUFDM0MsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDNUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRTtZQUMvRCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQXlCLENBQUM7UUFDM0MsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixNQUFNLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBTVMsY0FBYztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0IsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUE0QixDQUN4RCxFQUFFLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBRWhDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9DLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUMxQyxDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDL0MsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQzFDLENBQUM7WUFFRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUN2RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUN0RSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUM5RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLFNBQVMsQ0FBQztZQUNoRSxNQUFNLE9BQU8sR0FBRztnQkFDZCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVU7Z0JBQ2hDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO29CQUM1QyxLQUFLO29CQUNMLE9BQU87b0JBQ1AsSUFBSSxFQUFFLElBQUk7aUJBQ1gsQ0FBQztnQkFDRixDQUFDO2dCQUNELENBQUM7Z0JBQ0QsS0FBSztnQkFDTCxLQUFLO2dCQUNMLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixTQUFTO2FBQ1YsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLFFBQVE7UUFDaEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RELEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQy9DLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUMsWUFBWSxDQUFDO1lBQ3BFLEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDO1lBQzNELEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBS1MsbUJBQW1CO1FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUF5QixDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFLRCxPQUFPLENBQUMsQ0FBUTtRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUdyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBeUIsQ0FBQztZQUMzQyxNQUFNLEVBQ0osU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixhQUFhLEdBQ2QsR0FBRyxHQUFHLENBQUM7WUFDUixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQVEsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO1lBQzdCLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQ3RDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDMUIsSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBRXBCLFdBQVcsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3hDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsQ0FBQztpQkFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQztnQkFFM0IsWUFBWSxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFDMUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsQ0FBQyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUM7WUFDdkIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUM7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ0QsY0FBYyxDQUFDLEtBQVk7UUFLekIsTUFBTSxjQUFjLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLElBQUksY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLGNBQWMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsVUFBVSxNQUFNLGNBQWMsY0FBYyxDQUNoRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxjQUFjLENBQUMsS0FBWTtRQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFNUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sQ0FBQztnQkFFTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3JDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkMsR0FBRyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxLQUFZO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVTLGtCQUFrQjtRQUsxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBeUIsQ0FBQztRQUMzQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsSUFDRSxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNwQyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUN0QyxDQUFDO1lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO2dCQUM3QixHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDIn0=