UNPKG

@ribajs/bs5

Version:

Bootstrap 5 module for Riba.js

297 lines 22.6 kB
import { Component } from "@ribajs/core"; import { getUrl } from "@ribajs/utils/src/url"; import template from "./bs5-share.component.html?raw"; import labelTemplate from "./bs5-share.label.html?raw"; import { Dropdown } from "@ribajs/bs5"; import { hasChildNodesTrim, copyTextToClipboard, stripHtml, } from "@ribajs/utils"; export class Bs5ShareComponent extends Component { static tagName = "bs5-share"; _debug = false; static get observedAttributes() { return [ "type", "title", "text", "url", "media-url", "filename", "label", "dropdown-direction", "dropdown-alignment", "label-facebook", "label-twitter", "label-pinterest", "label-whatsapp", "label-telegram", "label-email", "label-download", "label-clipboard", ]; } dropdown; static count = 0; scope; constructor() { super(); this.scope = this.getScopeDefaults(); Bs5ShareComponent.count++; this.onExternalOpenEvent = this.onExternalOpenEvent.bind(this); this.onExternalCloseEvent = this.onExternalCloseEvent.bind(this); } getFilename(item) { if (item.filename) { return item.filename; } const url = this.getMediaUrlForShare(); const filename = url.split("/").pop(); return filename; } getDefaultShareServices() { const newLine = "%0A"; const shareItems = [ { id: "facebook", label: this.scope.labelFacebook, urlTemplate: "https://www.facebook.com/sharer/sharer.php?u={{url}}", mediaUrlTemplate: "https://www.facebook.com/sharer/sharer.php?u={{media_url}}", type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "twitter", label: this.scope.labelTwitter, urlTemplate: "https://twitter.com/intent/tweet?text={{text}}&url={{url}}", mediaUrlTemplate: `https://twitter.com/intent/tweet?text={{text}}&url={{media_url}}${newLine}({{url}})`, url: "", availableFor: ["page", "image", "video"], }, { id: "pinterest", label: this.scope.labelPinterest, urlTemplate: "http://www.pinterest.com/pin/create/button/" + "?url={{url}}&media={{media_url}}&description={{text}}", type: "popup", url: "", availableFor: ["image", "video"], }, { id: "whatsapp", label: this.scope.labelWhatsapp, urlTemplate: `https://api.whatsapp.com/send?text={{text}}${newLine}${newLine}{{url}}`, mediaUrlTemplate: `https://api.whatsapp.com/send?text={{text}}${newLine}${newLine}{{media_url}}${newLine}({{url}})`, type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "telegram", label: this.scope.labelTelegram, urlTemplate: `https://telegram.me/share/url?url={{url}}&text={{text}}`, mediaUrlTemplate: `https://telegram.me/share/url?url={{media_url}}&text={{text}}${newLine}({{url}})`, type: "popup", url: "", availableFor: ["page", "image", "video"], }, { id: "email", label: this.scope.labelEmail, urlTemplate: `mailto:?subject={{title}}&body={{text}}${newLine}${newLine}{{url}}`, mediaUrlTemplate: `mailto:?subject={{title}}&body={{text}}${newLine}${newLine}{{media_url}}${newLine}({{url}})`, type: "href", url: "", availableFor: ["page", "image", "video"], }, { id: "download", label: this.scope.labelDownload, urlTemplate: "{{raw_media_url}}", type: "download", url: "", availableFor: ["image", "video"], filename: this.scope.filename, }, { id: "clipboard", label: this.scope.labelClipboard, urlTemplate: "{{url}}", mediaUrlTemplate: `{{media_url}}`, type: "clipboard", url: "", availableFor: ["page", "image", "video"], }, ]; return shareItems; } isIos() { return navigator.userAgent.match(/iPhone|iPad|iPod/i) !== null; } isAndroid() { return navigator.userAgent.match(/Android/i) !== null; } browserSupportsNativeShare() { return typeof navigator.share === "function"; } getScopeDefaults() { const scope = { type: "page", title: document.title, text: "Look at this! 👀🤩", url: undefined, label: "Share", labelTemplate, isAndroid: this.isAndroid(), isIos: this.isIos(), isDesktop: false, isNative: this.browserSupportsNativeShare(), dropdownId: "dropdownShare" + Bs5ShareComponent.count, shareItems: [], dropdownDirection: "down", dropdownAlignment: "auto", labelFacebook: "Facebook", labelTwitter: "Twitter", labelPinterest: "Pinterest", labelWhatsapp: "Whatsapp", labelTelegram: "Telegram", labelEmail: "Email", labelDownload: "Download", labelClipboard: "Copy to clipboard", share: this.share, shareOnService: this.shareOnService, getFilename: this.getFilename, }; scope.isDesktop = !scope.isIos && !scope.isAndroid; return scope; } onExternalOpenEvent() { this.dropdown?.show(); } onExternalCloseEvent() { this.dropdown?.hide(); } connectedCallback() { super.connectedCallback(); this.init(Bs5ShareComponent.observedAttributes); this.addEventListeners(); } disconnectedCallback() { super.disconnectedCallback(); this.removeEventListeners(); } addEventListeners() { this.addEventListener("open", this.onExternalOpenEvent); this.addEventListener("btn-close", this.onExternalCloseEvent); } removeEventListeners() { this.removeEventListener("open", this.onExternalOpenEvent); this.removeEventListener("btn-close", this.onExternalOpenEvent); } getURLForShare() { if (this.scope.type === "page" && this.scope.url) { return getUrl(this.scope.url); } return window.location.href; } getMediaUrlForShare() { if (this.scope.type !== "page" && this.scope.url) { return getUrl(this.scope.url); } return ""; } getTextForShare() { return stripHtml(this.scope.text); } getTitleForShare() { return stripHtml(this.scope.title); } updateShareURLs() { for (const shareItem of this.scope.shareItems) { const url = this.getURLForShare(); const mediaUrl = this.getMediaUrlForShare(); const shareText = this.getTextForShare(); const shareTitle = this.getTitleForShare(); let urlTemplate = shareItem.urlTemplate; if (this.scope.type !== "page" && shareItem.mediaUrlTemplate) { urlTemplate = shareItem.mediaUrlTemplate; } const encode = shareItem.type === "clipboard" ? false : true; const shareURL = urlTemplate .replace("{{url}}", encode ? encodeURIComponent(url) : url) .replace("{{media_url}}", encode ? encodeURIComponent(mediaUrl) : mediaUrl) .replace("{{raw_media_url}}", mediaUrl) .replace("{{text}}", encode ? encodeURIComponent(shareText) : shareText) .replace("{{title}}", encode ? encodeURIComponent(shareTitle) : shareTitle); shareItem.available = shareItem.availableFor.includes(this.scope.type); shareItem.url = shareURL; } } initDropdown() { const dropDownButtonElement = this.querySelector(".dropdown-toggle-share"); if (!dropDownButtonElement) { console.warn('Element with selector ".dropdown-toggle-share" not found!', this); return; } this.dropdown = new Dropdown(dropDownButtonElement); } async shareOnService(item, event) { this.dropdown?.hide(); if (item.type === "clipboard") { event.preventDefault(); event.stopPropagation(); await copyTextToClipboard(item.url); return false; } if (item.type === "download") { return true; } event.preventDefault(); event.stopPropagation(); window.open(item.url, "Share", "scrollbars=yes,resizable=yes,toolbar=no," + "location=yes,width=550,height=420,top=100,left=" + (window.screen ? Math.round(screen.width / 2 - 275) : 100)); return false; } async share(event) { this.debug("share", this.scope); event.preventDefault(); event.stopPropagation(); if (this.scope.isNative && !this.scope.isDesktop) { try { await navigator.share({ title: this.scope.title, text: `${this.scope.text}\r\n\r\n`, url: this.scope.url || window.location.href, }); } catch (error) { if (error.name === "AbortError") { return; } console.error(`Error ${error.name}: ${error.message}`, error); } } else { this.updateShareURLs(); return this.dropdown?.toggle(); } } async beforeBind() { await super.beforeBind(); } async afterBind() { this.initDropdown(); this.debug("afterBind", this.scope); this.scope.shareItems = this.getDefaultShareServices(); await super.afterBind(); } requiredAttributes() { return []; } template() { if (this && hasChildNodesTrim(this)) { this.scope.labelTemplate = this.innerHTML; } return template; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNoYXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JzNS1zaGFyZS9iczUtc2hhcmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQStCLE1BQU0sY0FBYyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLFFBQVEsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQW1FdkIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFDdkMsTUFBTSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUM7SUFFN0IsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU87WUFDTCxNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixLQUFLO1lBQ0wsV0FBVztZQUNYLFVBQVU7WUFDVixPQUFPO1lBQ1Asb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixnQkFBZ0I7WUFDaEIsZUFBZTtZQUNmLGlCQUFpQjtZQUNqQixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsaUJBQWlCO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRVMsUUFBUSxDQUFZO0lBRzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRVYsS0FBSyxDQUFRO0lBRXBCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXJDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxXQUFXLENBQUMsSUFBZTtRQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVTLHVCQUF1QjtRQUMvQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdEIsTUFBTSxVQUFVLEdBQWdCO1lBQzlCO2dCQUNFLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBRS9CLFdBQVcsRUFBRSxzREFBc0Q7Z0JBQ25FLGdCQUFnQixFQUNkLDREQUE0RDtnQkFDOUQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDekM7WUFDRDtnQkFDRSxFQUFFLEVBQUUsU0FBUztnQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO2dCQUM5QixXQUFXLEVBQ1QsNERBQTREO2dCQUM5RCxnQkFBZ0IsRUFBRSxtRUFBbUUsT0FBTyxXQUFXO2dCQUN2RyxHQUFHLEVBQUUsRUFBRTtnQkFDUCxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUN6QztZQUNEO2dCQUNFLEVBQUUsRUFBRSxXQUFXO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQ2hDLFdBQVcsRUFDVCw2Q0FBNkM7b0JBQzdDLHVEQUF1RDtnQkFDekQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsR0FBRyxFQUFFLEVBQUU7Z0JBRVAsWUFBWSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUNqQztZQUNEO2dCQUNFLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBQy9CLFdBQVcsRUFBRSw4Q0FBOEMsT0FBTyxHQUFHLE9BQU8sU0FBUztnQkFDckYsZ0JBQWdCLEVBQUUsOENBQThDLE9BQU8sR0FBRyxPQUFPLGdCQUFnQixPQUFPLFdBQVc7Z0JBQ25ILElBQUksRUFBRSxPQUFPO2dCQUNiLEdBQUcsRUFBRSxFQUFFO2dCQUNQLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2FBQ3pDO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFVBQVU7Z0JBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDL0IsV0FBVyxFQUFFLHlEQUF5RDtnQkFDdEUsZ0JBQWdCLEVBQUUsZ0VBQWdFLE9BQU8sV0FBVztnQkFDcEcsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDekM7WUFDRDtnQkFDRSxFQUFFLEVBQUUsT0FBTztnQkFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixXQUFXLEVBQUUsMENBQTBDLE9BQU8sR0FBRyxPQUFPLFNBQVM7Z0JBQ2pGLGdCQUFnQixFQUFFLDBDQUEwQyxPQUFPLEdBQUcsT0FBTyxnQkFBZ0IsT0FBTyxXQUFXO2dCQUMvRyxJQUFJLEVBQUUsTUFBTTtnQkFDWixHQUFHLEVBQUUsRUFBRTtnQkFDUCxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUN6QztZQVVEO2dCQUNFLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7Z0JBQy9CLFdBQVcsRUFBRSxtQkFBbUI7Z0JBQ2hDLElBQUksRUFBRSxVQUFVO2dCQUNoQixHQUFHLEVBQUUsRUFBRTtnQkFDUCxZQUFZLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO2dCQUNoQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO2FBQzlCO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztnQkFDaEMsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLGdCQUFnQixFQUFFLGVBQWU7Z0JBQ2pDLElBQUksRUFBRSxXQUFXO2dCQUNqQixHQUFHLEVBQUUsRUFBRTtnQkFDUCxZQUFZLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQzthQUN6QztTQUNGLENBQUM7UUFDRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRVMsS0FBSztRQUNiLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDakUsQ0FBQztJQUVTLFNBQVM7UUFDakIsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDeEQsQ0FBQztJQUVTLDBCQUEwQjtRQUNsQyxPQUFPLE9BQU8sU0FBUyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUM7SUFDL0MsQ0FBQztJQUVTLGdCQUFnQjtRQUN4QixNQUFNLEtBQUssR0FBVTtZQUNuQixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLEdBQUcsRUFBRSxTQUFTO1lBQ2QsS0FBSyxFQUFFLE9BQU87WUFDZCxhQUFhO1lBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUMzQyxVQUFVLEVBQUUsZUFBZSxHQUFHLGlCQUFpQixDQUFDLEtBQUs7WUFDckQsVUFBVSxFQUFFLEVBQUU7WUFDZCxpQkFBaUIsRUFBRSxNQUFNO1lBQ3pCLGlCQUFpQixFQUFFLE1BQU07WUFFekIsYUFBYSxFQUFFLFVBQVU7WUFDekIsWUFBWSxFQUFFLFNBQVM7WUFDdkIsY0FBYyxFQUFFLFdBQVc7WUFDM0IsYUFBYSxFQUFFLFVBQVU7WUFDekIsYUFBYSxFQUFFLFVBQVU7WUFDekIsVUFBVSxFQUFFLE9BQU87WUFDbkIsYUFBYSxFQUFFLFVBQVU7WUFDekIsY0FBYyxFQUFFLG1CQUFtQjtZQUVuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM5QixDQUFDO1FBR0YsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBRW5ELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLG1CQUFtQjtRQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVMsb0JBQW9CO1FBQzVCLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFUyxjQUFjO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRVMsZUFBZTtRQUN2QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFNUyxnQkFBZ0I7UUFDeEIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRVMsZUFBZTtRQUN2QixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBRXhDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM3RCxXQUFXLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQzNDLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFN0QsTUFBTSxRQUFRLEdBQUcsV0FBVztpQkFDekIsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7aUJBQzFELE9BQU8sQ0FDTixlQUFlLEVBQ2YsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUNqRDtpQkFDQSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDO2lCQUN0QyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztpQkFDdkUsT0FBTyxDQUNOLFdBQVcsRUFDWCxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ3JELENBQUM7WUFFSixTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkUsU0FBUyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFUyxZQUFZO1FBQ3BCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDOUMsd0JBQXdCLENBQ2dCLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FDViwyREFBMkQsRUFDM0QsSUFBSSxDQUNMLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBU00sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFlLEVBQUUsS0FBWTtRQUN2RCxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUdELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsSUFBSSxDQUFDLEdBQUcsRUFDUixPQUFPLEVBQ1AsMENBQTBDO1lBQ3hDLGlEQUFpRDtZQUNqRCxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUM3RCxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFZO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUM7b0JBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7b0JBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVO29CQUNsQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2lCQUM1QyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO29CQUdoQyxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFUyxLQUFLLENBQUMsVUFBVTtRQUN4QixNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUUzQixDQUFDO0lBRVMsS0FBSyxDQUFDLFNBQVM7UUFDdkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN2RCxNQUFNLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVTLFFBQVE7UUFDaEIsSUFBSSxJQUFJLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDIn0=