From 330f4e96ce033ee22d1ab6293e5776c4db406ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=9B?= Date: Mon, 27 Jul 2026 12:22:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A0=E5=85=A5=20web-to-pixso=20?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chrome 扩展,用于从网页提取 DOM 树为 JSON 格式。 核心文件:capture.js(76KB,提取逻辑) --- web-to-pixso/README.md | 30 + web-to-pixso/background.js | 419 ++++ web-to-pixso/capture.js | 2018 +++++++++++++++++ web-to-pixso/element-picker.js | 455 ++++ web-to-pixso/logo/icon128.svg | 27 + web-to-pixso/logo/icon16.svg | 4 + web-to-pixso/logo/icon32.svg | 4 + web-to-pixso/logo/icon48.svg | 4 + web-to-pixso/logo/plugin-logo.png | Bin 0 -> 115230 bytes web-to-pixso/manifest.json | 32 + .../pixso-plugin/logo/plugin-logo.png | Bin 0 -> 115230 bytes web-to-pixso/pixso-plugin/main.js | 1127 +++++++++ web-to-pixso/pixso-plugin/manifest.json | 19 + web-to-pixso/pixso-plugin/plugin-logo.png | Bin 0 -> 115230 bytes web-to-pixso/pixso-plugin/plugin.json | 35 + web-to-pixso/pixso-plugin/ui.html | 524 +++++ web-to-pixso/popup-panel.js | 521 +++++ web-to-pixso/popup.css | 379 ++++ web-to-pixso/popup.html | 86 + web-to-pixso/popup.js | 221 ++ web-to-pixso/runner.js | 162 ++ web-to-pixso/发布使用说明-Web to Pixso.md | 118 + 22 files changed, 6185 insertions(+) create mode 100644 web-to-pixso/README.md create mode 100644 web-to-pixso/background.js create mode 100644 web-to-pixso/capture.js create mode 100644 web-to-pixso/element-picker.js create mode 100644 web-to-pixso/logo/icon128.svg create mode 100644 web-to-pixso/logo/icon16.svg create mode 100644 web-to-pixso/logo/icon32.svg create mode 100644 web-to-pixso/logo/icon48.svg create mode 100644 web-to-pixso/logo/plugin-logo.png create mode 100644 web-to-pixso/manifest.json create mode 100644 web-to-pixso/pixso-plugin/logo/plugin-logo.png create mode 100644 web-to-pixso/pixso-plugin/main.js create mode 100644 web-to-pixso/pixso-plugin/manifest.json create mode 100644 web-to-pixso/pixso-plugin/plugin-logo.png create mode 100644 web-to-pixso/pixso-plugin/plugin.json create mode 100644 web-to-pixso/pixso-plugin/ui.html create mode 100644 web-to-pixso/popup-panel.js create mode 100644 web-to-pixso/popup.css create mode 100644 web-to-pixso/popup.html create mode 100644 web-to-pixso/popup.js create mode 100644 web-to-pixso/runner.js create mode 100644 web-to-pixso/发布使用说明-Web to Pixso.md diff --git a/web-to-pixso/README.md b/web-to-pixso/README.md new file mode 100644 index 0000000..6d8e2b2 --- /dev/null +++ b/web-to-pixso/README.md @@ -0,0 +1,30 @@ +# Web to Pixso + +一套对标 `figma-capture-extension` 使用体验的网页采集工具,包含 Chrome 扩展和 Pixso 导入插件。 + +## 目录 + +- `manifest.json`、`popup.*`、`background.js`、`capture.js`、`runner.js`:Chrome 扩展 +- `pixso-plugin/`:Pixso 插件,用于导入扩展导出的 JSON 文件 +- `logo/`:扩展与插件图标 + +## 使用 + +1. 打开 `chrome://extensions/`,开启开发者模式。 +2. 点击“加载已解压的扩展程序”,选择本目录 `web-to-pixso`。 +3. 打开要采集的网页,点击扩展图标,按需开启“跨域图片代理模式”,点击“开始采集”。 +4. 扩展会下载一个 `web-to-pixso/*.json` 文件。 +5. 在 Pixso 中导入 `pixso-plugin/manifest.json`,运行插件并选择上一步下载的 JSON 文件。若旧版导入器要求 `plugin.json`,目录内也保留了同内容兼容文件。 + +## 数据格式 + +扩展导出的文件格式为 `pixso-design-capture`,包含页面来源、画布尺寸、DOM 节点树、图片资源、字体和诊断信息。Pixso 插件会尽量还原: + +- 文本图层 +- 图片和背景图片 +- 背景色、边框、圆角、透明度 +- DOM 层级和基础坐标 + +## 注意 + +网页到设计稿的转换无法做到 100% 语义等价,复杂 CSS、canvas、视频帧、伪元素和部分字体效果可能需要在 Pixso 中二次微调。 diff --git a/web-to-pixso/background.js b/web-to-pixso/background.js new file mode 100644 index 0000000..84c296d --- /dev/null +++ b/web-to-pixso/background.js @@ -0,0 +1,419 @@ +const CAPTURE_FILE = "capture.js"; +const RUNNER_FILE = "runner.js"; +const POPUP_PANEL_FILE = "popup-panel.js"; +const ELEMENT_PICKER_FILE = "element-picker.js"; +const SETTINGS_KEY = "webToPixsoSettings"; +const DEFAULT_SETTINGS = { + useProxy: false, + concurrency: "8", + captureMode: "mixed", + captureWidth: null +}; +const MIN_CAPTURE_WIDTH = 320; +const MAX_CAPTURE_WIDTH = 3840; + +const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + +function normalizeSettings(value = {}) { + const concurrency = String(value.concurrency || DEFAULT_SETTINGS.concurrency); + const captureWidth = normalizeCaptureWidth(value.captureWidth, null); + return { + useProxy: Boolean(value.useProxy), + concurrency: ["4", "6", "8", "10", "12", "16", "20", "infinite"].includes(concurrency) + ? concurrency + : DEFAULT_SETTINGS.concurrency, + captureMode: value.captureMode === "editable" ? "editable" : "mixed", + captureWidth + }; +} + +function normalizeCaptureWidth(value, fallback = null) { + const number = Number.parseInt(String(value || "").replace(/\D+/g, ""), 10); + if (!Number.isFinite(number)) return fallback; + return Math.max(MIN_CAPTURE_WIDTH, Math.min(MAX_CAPTURE_WIDTH, number)); +} + +function definedWindowBounds(bounds = {}) { + return Object.fromEntries( + Object.entries(bounds).filter(([, value]) => Number.isFinite(value)) + ); +} + +function assertCaptureableTab(tab) { + if (!tab?.id || !tab.url) { + throw new Error("没有可采集的当前标签页"); + } + + if (/^(chrome|edge|about|devtools|chrome-extension):/i.test(tab.url)) { + throw new Error("浏览器内置页面不支持采集,请切换到普通网页"); + } +} + +async function getActiveTab() { + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + assertCaptureableTab(tab); + return tab; +} + +async function runCapture(tabId, options) { + await chrome.scripting.executeScript({ + target: { tabId }, + files: [CAPTURE_FILE] + }); + + await chrome.scripting.executeScript({ + target: { tabId }, + files: [RUNNER_FILE] + }); + + const [{ result }] = await chrome.scripting.executeScript({ + target: { tabId }, + func: captureOptions => window.__webToPixsoRunCapture(captureOptions), + args: [options] + }); + + if (!result) { + throw new Error("页面没有返回采集结果"); + } + + return result; +} + +async function getTabViewportWidth(tabId) { + try { + const [{ result }] = await chrome.scripting.executeScript({ + target: { tabId }, + func: () => Math.round(window.innerWidth || document.documentElement.clientWidth || 0) + }); + return normalizeCaptureWidth(result, null); + } catch { + return null; + } +} + +async function prepareCaptureViewport(tab, requestedWidth) { + const targetWidth = normalizeCaptureWidth(requestedWidth, null); + const beforeViewportWidth = await getTabViewportWidth(tab.id); + const noop = async () => {}; + if (!targetWidth || !beforeViewportWidth || Math.abs(beforeViewportWidth - targetWidth) <= 2) { + return { + restore: noop, + requestedWidth: targetWidth || beforeViewportWidth, + beforeViewportWidth, + actualViewportWidth: beforeViewportWidth, + resizedWindow: false + }; + } + + if (!tab.windowId || !chrome.windows?.get || !chrome.windows?.update) { + throw new Error("当前浏览器不支持临时调整采集视口宽度"); + } + + const originalWindow = await chrome.windows.get(tab.windowId); + const originalState = originalWindow.state || "normal"; + const originalBounds = { + left: originalWindow.left, + top: originalWindow.top, + width: originalWindow.width, + height: originalWindow.height + }; + + const restore = async () => { + try { + if (originalState !== "normal") { + await chrome.windows.update(tab.windowId, { state: "normal" }); + await delay(120); + } + const restoreBounds = definedWindowBounds(originalBounds); + if (Object.keys(restoreBounds).length) { + await chrome.windows.update(tab.windowId, restoreBounds); + } + if (originalState !== "normal") { + await delay(120); + await chrome.windows.update(tab.windowId, { state: originalState }); + } + await delay(250); + } catch { + // Restoring the user's window is best effort only. + } + }; + + try { + if (originalState !== "normal") { + await chrome.windows.update(tab.windowId, { state: "normal" }); + await delay(250); + } + + let currentViewportWidth = beforeViewportWidth; + let currentWindow = await chrome.windows.get(tab.windowId); + for (let attempt = 0; attempt < 2; attempt += 1) { + const delta = targetWidth - currentViewportWidth; + const nextWidth = Math.max(360, Math.round((currentWindow.width || targetWidth) + delta)); + await chrome.windows.update(tab.windowId, { width: nextWidth }); + await delay(650); + currentViewportWidth = await getTabViewportWidth(tab.id) || currentViewportWidth; + if (Math.abs(currentViewportWidth - targetWidth) <= 2) break; + currentWindow = await chrome.windows.get(tab.windowId); + } + + if (Math.abs(currentViewportWidth - targetWidth) > 2) { + throw new Error(`采集视口未生效:目标 ${targetWidth}px,实际 ${currentViewportWidth}px。请退出全屏或手动放宽浏览器窗口后重试。`); + } + + return { + restore, + requestedWidth: targetWidth, + beforeViewportWidth, + actualViewportWidth: currentViewportWidth, + resizedWindow: true + }; + } catch (error) { + await restore(); + throw error; + } +} + +async function captureCurrentTab(tab, settings) { + const viewport = await prepareCaptureViewport(tab, settings.captureWidth); + try { + const data = await runCapture(tab.id, { + ...settings, + captureWidth: viewport.requestedWidth + }); + data.capture = { + ...(data.capture || {}), + resizedWindow: viewport.resizedWindow, + usedTemporaryWindow: viewport.resizedWindow, + requestedWidth: viewport.requestedWidth || data.source?.actualViewportWidth || data.canvas?.width, + beforeViewportWidth: viewport.beforeViewportWidth, + actualViewportWidth: data.source?.actualViewportWidth || viewport.actualViewportWidth + }; + return data; + } finally { + await viewport.restore(); + } +} + +async function downloadCapture(data) { + const json = JSON.stringify(data, null, 2); + const encodedJson = arrayBufferToBase64(new TextEncoder().encode(json)); + const url = `data:application/json;charset=utf-8;base64,${encodedJson}`; + const title = data.source?.title || "webpage"; + const safeTitle = title + .replace(/[\\/:*?"<>|]+/g, "-") + .replace(/\s+/g, "-") + .slice(0, 64) || "webpage"; + const filename = `web-to-pixso/${safeTitle}-${Date.now()}.json`; + + await chrome.downloads.download({ + url, + filename, + saveAs: true + }); + + return filename; +} + +async function startCapture(options) { + const settings = normalizeSettings(options); + await chrome.storage.local.set({ [SETTINGS_KEY]: settings }); + const tab = await getActiveTab(); + const data = await captureCurrentTab(tab, settings); + const filename = await downloadCapture(data); + return { + ok: true, + filename, + actualViewportWidth: data.source?.actualViewportWidth, + requestedViewportWidth: data.source?.requestedViewportWidth, + usedTemporaryWindow: Boolean(data.capture?.usedTemporaryWindow) + }; +} + +async function startCaptureFromSender(options, sender) { + const settings = normalizeSettings(options); + await chrome.storage.local.set({ [SETTINGS_KEY]: settings }); + const tab = sender?.tab || await getActiveTab(); + assertCaptureableTab(tab); + const data = await captureCurrentTab(tab, settings); + const filename = await downloadCapture(data); + return { + ok: true, + filename, + actualViewportWidth: data.source?.actualViewportWidth, + requestedViewportWidth: data.source?.requestedViewportWidth, + usedTemporaryWindow: Boolean(data.capture?.usedTemporaryWindow) + }; +} + +async function captureClipboardFromSender(options, sender) { + const settings = normalizeSettings(options); + await chrome.storage.local.set({ [SETTINGS_KEY]: settings }); + const tab = sender?.tab || await getActiveTab(); + assertCaptureableTab(tab); + const data = await captureCurrentTab(tab, settings); + return { + ok: true, + json: JSON.stringify(data, null, 2), + actualViewportWidth: data.source?.actualViewportWidth, + requestedViewportWidth: data.source?.requestedViewportWidth, + usedTemporaryWindow: Boolean(data.capture?.usedTemporaryWindow) + }; +} + +async function startElementCapture(options, sender) { + const settings = { + ...normalizeSettings(options), + captureWidth: null, + selectionId: options?.selectionId, + selectionWidth: Math.max(1, Math.round(Number(options?.selectionWidth || 0))), + captureMode: "mixed" + }; + const tab = sender?.tab || await getActiveTab(); + assertCaptureableTab(tab); + const data = await runCapture(tab.id, settings); + const filename = await downloadCapture(data); + return { + ok: true, + filename, + actualViewportWidth: data.source?.actualViewportWidth, + requestedViewportWidth: data.source?.requestedViewportWidth, + selectionWidth: data.import?.defaultWidth + }; +} + +async function fetchWithTimeout(url, timeout = 10000) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), timeout); + + try { + return await fetch(url, { + signal: controller.signal, + credentials: "include", + cache: "force-cache" + }); + } finally { + clearTimeout(timeoutId); + } +} + +function arrayBufferToBase64(buffer) { + const bytes = new Uint8Array(buffer); + const chunkSize = 0x8000; + let binary = ""; + + for (let index = 0; index < bytes.length; index += chunkSize) { + binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize)); + } + + return btoa(binary); +} + +async function proxyFetchAsset(url) { + if (!/^https?:\/\//i.test(url)) { + return { ok: false, error: "仅支持 http/https 图片代理" }; + } + + const response = await fetchWithTimeout(url, 12000); + if (!response.ok) { + return { ok: false, status: response.status, error: `HTTP ${response.status}` }; + } + + const contentType = response.headers.get("content-type") || "application/octet-stream"; + const buffer = await response.arrayBuffer(); + + return { + ok: true, + status: response.status, + contentType, + base64: arrayBufferToBase64(buffer) + }; +} + +async function captureVisibleTab(sender) { + if (!sender?.tab?.windowId || !chrome.tabs?.captureVisibleTab) { + return { ok: false, error: "当前标签页截图不可用" }; + } + + try { + const dataUrl = await chrome.tabs.captureVisibleTab(sender.tab.windowId, { + format: "png" + }); + return { ok: true, dataUrl }; + } catch (error) { + return { + ok: false, + error: error.message || String(error), + nonFatal: true + }; + } +} + +async function showInPagePanel(tab) { + assertCaptureableTab(tab); + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + files: [ELEMENT_PICKER_FILE, POPUP_PANEL_FILE] + }); + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + func: () => window.__webToPixsoShowPanel?.() + }); +} + +chrome.runtime.onInstalled.addListener(() => { + chrome.storage.local.get({ [SETTINGS_KEY]: DEFAULT_SETTINGS }).then(result => { + chrome.storage.local.set({ [SETTINGS_KEY]: normalizeSettings(result[SETTINGS_KEY]) }); + }); +}); + +chrome.action.onClicked.addListener(tab => { + showInPagePanel(tab).catch(error => { + console.warn("[Web to Pixso] Failed to open panel", error); + }); +}); + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message?.type === "PIXSO_CAPTURE_START") { + startCapture(message.options) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + if (message?.type === "PIXSO_CAPTURE_ELEMENT_START") { + startElementCapture(message.options, sender) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + if (message?.type === "PIXSO_CAPTURE_CURRENT_TAB") { + startCaptureFromSender(message.options, sender) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + if (message?.type === "PIXSO_CAPTURE_CLIPBOARD") { + captureClipboardFromSender(message.options, sender) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + if (message?.type === "PIXSO_CAPTURE_FETCH_ASSET") { + proxyFetchAsset(message.url) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + if (message?.type === "PIXSO_CAPTURE_VISIBLE_TAB") { + captureVisibleTab(sender) + .then(sendResponse) + .catch(error => sendResponse({ ok: false, error: error.message || String(error) })); + return true; + } + + return false; +}); diff --git a/web-to-pixso/capture.js b/web-to-pixso/capture.js new file mode 100644 index 0000000..ad68999 --- /dev/null +++ b/web-to-pixso/capture.js @@ -0,0 +1,2018 @@ +(function () { + "use strict"; + + const SKIP_TAGS = new Set(["SCRIPT", "STYLE", "NOSCRIPT", "META", "LINK", "TEMPLATE"]); + const STYLE_PROPS = [ + ["display", "display"], + ["visibility", "visibility"], + ["position", "position"], + ["zIndex", "z-index"], + ["opacity", "opacity"], + ["overflow", "overflow"], + ["overflowX", "overflow-x"], + ["overflowY", "overflow-y"], + ["backgroundColor", "background-color"], + ["backgroundImage", "background-image"], + ["backgroundPosition", "background-position"], + ["backgroundSize", "background-size"], + ["backgroundRepeat", "background-repeat"], + ["backgroundClip", "background-clip"], + ["backgroundOrigin", "background-origin"], + ["objectFit", "object-fit"], + ["objectPosition", "object-position"], + ["maskImage", "mask-image"], + ["webkitMaskImage", "-webkit-mask-image"], + ["maskPosition", "mask-position"], + ["webkitMaskPosition", "-webkit-mask-position"], + ["maskSize", "mask-size"], + ["webkitMaskSize", "-webkit-mask-size"], + ["borderTopWidth", "border-top-width"], + ["borderRightWidth", "border-right-width"], + ["borderBottomWidth", "border-bottom-width"], + ["borderLeftWidth", "border-left-width"], + ["borderTopColor", "border-top-color"], + ["borderRightColor", "border-right-color"], + ["borderBottomColor", "border-bottom-color"], + ["borderLeftColor", "border-left-color"], + ["borderTopStyle", "border-top-style"], + ["borderRightStyle", "border-right-style"], + ["borderBottomStyle", "border-bottom-style"], + ["borderLeftStyle", "border-left-style"], + ["borderTopLeftRadius", "border-top-left-radius"], + ["borderTopRightRadius", "border-top-right-radius"], + ["borderBottomRightRadius", "border-bottom-right-radius"], + ["borderBottomLeftRadius", "border-bottom-left-radius"], + ["boxShadow", "box-shadow"], + ["filter", "filter"], + ["backdropFilter", "backdrop-filter"], + ["color", "color"], + ["fontFamily", "font-family"], + ["fontSize", "font-size"], + ["fontWeight", "font-weight"], + ["fontStyle", "font-style"], + ["lineHeight", "line-height"], + ["letterSpacing", "letter-spacing"], + ["textAlign", "text-align"], + ["textTransform", "text-transform"], + ["textDecorationLine", "text-decoration-line"], + ["whiteSpace", "white-space"], + ["wordBreak", "word-break"], + ["transform", "transform"], + ["transformOrigin", "transform-origin"], + ["clipPath", "clip-path"] + ]; + const LAYOUT_PROPS = [ + ["flexDirection", "flex-direction"], + ["flexWrap", "flex-wrap"], + ["justifyContent", "justify-content"], + ["alignItems", "align-items"], + ["alignContent", "align-content"], + ["gap", "gap"], + ["rowGap", "row-gap"], + ["columnGap", "column-gap"], + ["gridTemplateColumns", "grid-template-columns"], + ["gridTemplateRows", "grid-template-rows"], + ["gridAutoFlow", "grid-auto-flow"], + ["paddingTop", "padding-top"], + ["paddingRight", "padding-right"], + ["paddingBottom", "padding-bottom"], + ["paddingLeft", "padding-left"], + ["marginTop", "margin-top"], + ["marginRight", "margin-right"], + ["marginBottom", "margin-bottom"], + ["marginLeft", "margin-left"], + ["width", "width"], + ["height", "height"], + ["minWidth", "min-width"], + ["maxWidth", "max-width"], + ["minHeight", "min-height"], + ["maxHeight", "max-height"] + ]; + + let nodeCounter = 0; + let rasterCounter = 0; + const CAPTURE_SCHEMA = "web-to-pixso-capture"; + const CAPTURE_SCHEMA_VERSION = "1.1.1"; + + function isWebToPixsoElement(element) { + if (!element?.closest) return false; + return Boolean(element.closest([ + "#__web_to_pixso_panel_root__", + "#__web_to_pixso_picker_root__", + "#__web_to_pixso_picker_box__", + "#__web_to_pixso_picker_label__" + ].join(","))); + } + + function absoluteRect(rect, style) { + const isViewportAnchored = style?.position === "fixed"; + return { + x: round(rect.left + (isViewportAnchored ? 0 : window.scrollX)), + y: round(rect.top + (isViewportAnchored ? 0 : window.scrollY)), + width: round(rect.width), + height: round(rect.height) + }; + } + + function round(value) { + return Math.round((Number(value) || 0) * 100) / 100; + } + + function isVisible(element, rect, style) { + if (!rect || rect.width <= 0 || rect.height <= 0) return false; + if (style.display === "none" || style.visibility === "hidden") return false; + if (Number(style.opacity) === 0) return false; + return true; + } + + function intersectsDocument(rect) { + const documentRect = getDocumentRect(); + return intersectRects(rect, documentRect); + } + + function intersectWithClip(rect, clipRect) { + return clipRect ? intersectRects(rect, clipRect) : intersectsDocument(rect); + } + + function intersectRects(a, b) { + if (!a) return b || null; + if (!b) return a || null; + const x1 = Math.max(a.x, b.x); + const y1 = Math.max(a.y, b.y); + const x2 = Math.min(a.x + a.width, b.x + b.width); + const y2 = Math.min(a.y + a.height, b.y + b.height); + if (x2 <= x1 || y2 <= y1) return null; + return { + x: round(x1), + y: round(y1), + width: round(x2 - x1), + height: round(y2 - y1) + }; + } + + function rectsDiffer(a, b, tolerance = 0.5) { + if (!a || !b) return false; + return Math.abs((a.x || 0) - (b.x || 0)) > tolerance || + Math.abs((a.y || 0) - (b.y || 0)) > tolerance || + Math.abs((a.width || 0) - (b.width || 0)) > tolerance || + Math.abs((a.height || 0) - (b.height || 0)) > tolerance; + } + + function clipsChildren(styles) { + const overflow = `${styles.overflow || ""} ${styles.overflowX || ""} ${styles.overflowY || ""}`; + return /(hidden|clip|scroll|auto)/i.test(overflow); + } + + function isCarouselClone(element) { + const className = String(element.className || ""); + if (/(^|\s)(slick-cloned|swiper-slide-duplicate|swiper-slide-duplicate-active|swiper-slide-duplicate-next|swiper-slide-duplicate-prev)(\s|$)/i.test(className)) { + return true; + } + if (element.getAttribute("data-swiper-slide-index") && /swiper-slide-duplicate/i.test(className)) { + return true; + } + if (element.getAttribute("aria-hidden") === "true" && /(^|\s)(slick-slide|swiper-slide)(\s|$)/i.test(className)) { + return true; + } + return false; + } + + function shouldClampToClip(element, rect, clipRect) { + if (!clipRect || !rect) return false; + const className = String(element.className || ""); + const isTrack = /(slick-track|swiper-wrapper|carousel|marquee|scroll|slider|slide-track)/i.test(className); + const isMedia = /^(IMG|PICTURE|VIDEO|CANVAS)$/i.test(element.tagName); + const isClippedMedia = isMedia && rectsDiffer(rect, clipRect); + const isVeryWide = rect.width > Math.max(window.innerWidth * 1.5, clipRect.width * 1.5); + const isVeryTall = rect.height > Math.max(window.innerHeight * 2, clipRect.height * 2); + return isTrack || isClippedMedia || isVeryWide || isVeryTall; + } + + function getChildNodes(element) { + const nodes = Array.from(element.childNodes || []); + if (element.shadowRoot) { + nodes.push(...Array.from(element.shadowRoot.childNodes || [])); + } + return nodes; + } + + function isHeaderLikeElement(element) { + if (!element) return false; + const name = `${element.tagName || ""} ${element.id || ""} ${element.className || ""} ${element.getAttribute?.("role") || ""}`; + return /^(HEADER|NAV)$/i.test(element.tagName || "") || + /header|nav|navigation|topbar|navbar|menu/i.test(String(name)); + } + + function isTopHeaderElement(element, rect, styles) { + if (!isHeaderLikeElement(element)) return false; + const tag = element?.tagName || ""; + const name = `${tag} ${element?.id || ""} ${element?.className || ""} ${element?.getAttribute?.("role") || ""}`; + const fixedOrSticky = styles?.position === "fixed" || styles?.position === "sticky"; + const nearTop = (rect?.y || 0) <= 140 || fixedOrSticky; + const headerSized = (rect?.height || 0) >= 20 && + (rect?.height || 0) <= Math.max(180, window.innerHeight * 0.18) && + (rect?.width || 0) >= window.innerWidth * 0.35; + const strongSemantic = /^(HEADER)$/i.test(tag) || /cloud-header|site-header|page-header|topbar|navbar|navigation/i.test(String(name)); + const navSemantic = /^(NAV)$/i.test(tag) || /nav|menu/i.test(String(name)); + return nearTop && headerSized && (strongSemantic || navSemantic); + } + + function inferSection(element, rect, styles, inheritedSection) { + if (inheritedSection && inheritedSection !== "document") return inheritedSection; + const tag = element?.tagName || ""; + const name = `${tag} ${element?.id || ""} ${element?.className || ""} ${element?.getAttribute?.("role") || ""}`; + if (isTopHeaderElement(element, rect, styles)) return "header"; + if (/^(FOOTER)$/i.test(tag) || /footer/i.test(String(name))) return "footer"; + if (rect?.y < Math.max(window.innerHeight * 1.4, 900) && /hero|banner|kv|carousel|swiper|slick|slider|slide|campaign|masthead/i.test(String(name))) { + return "hero"; + } + if (styles && isLikelyHeroOrCarousel(element, rect, styles)) return "hero"; + return inheritedSection || "content"; + } + + function layerMetaFor(type, options = {}) { + if (options.rasterMode === "comparison") { + return { layerGroup: "comparison", layerPriority: 0, rasterRole: "comparison" }; + } + if (options.rasterMode) { + return { layerGroup: "comparison", layerPriority: 0, rasterRole: options.rasterMode }; + } + if (type === "TEXT") { + return { layerGroup: "text", layerPriority: 200 }; + } + return { layerGroup: "editable", layerPriority: 100 }; + } + + function inferRasterSection(target = {}) { + const name = String(target.name || ""); + const mode = String(target.mode || ""); + if (/header/i.test(name)) return "header"; + if (/footer/i.test(name)) return "footer"; + if (/hero|carousel/i.test(name) || mode === "hero-background") return "hero"; + if (mode === "comparison") return "document"; + return "content"; + } + + function getDocumentRect() { + const doc = document.documentElement; + const body = document.body; + return { + x: 0, + y: 0, + width: Math.max(window.innerWidth, doc.clientWidth), + height: Math.max(doc.scrollHeight, body.scrollHeight, doc.clientHeight) + }; + } + + function getViewportRect() { + return { + x: window.scrollX, + y: window.scrollY, + width: window.innerWidth, + height: window.innerHeight + }; + } + + function extractStyles(computed) { + const styles = {}; + for (const [key, cssProp] of STYLE_PROPS) { + styles[key] = computed.getPropertyValue(cssProp); + } + return styles; + } + + function parsePixels(value, fallback = 0) { + const parsed = parseFloat(value); + return Number.isFinite(parsed) ? parsed : fallback; + } + + function countDistinctPositions(rects, key, tolerance = 6) { + const positions = []; + for (const rect of rects || []) { + const value = rect?.[key]; + if (!Number.isFinite(value)) continue; + if (!positions.some(position => Math.abs(position - value) <= tolerance)) { + positions.push(value); + } + } + return positions.length; + } + + function inferGridMetrics(childRects, gap = 0) { + const tolerance = Math.max(6, Math.min(18, Number(gap || 0) * 0.5)); + const columns = countDistinctPositions(childRects, "x", tolerance); + const rows = countDistinctPositions(childRects, "y", tolerance); + return { + columnCount: Math.max(1, columns || 1), + rowCount: Math.max(1, rows || 1) + }; + } + + function isGridLikeLayout({ isGrid, isFlex, isTable, semanticLayout, styles, childRects, inferredGrid }) { + if (isGrid) return true; + if (!childRects?.length || childRects.length < 4) return false; + const hasRowsAndColumns = inferredGrid.columnCount >= 2 && inferredGrid.rowCount >= 2; + if (!hasRowsAndColumns) return false; + const wraps = isFlex && /wrap/i.test(styles.flexWrap || ""); + const semanticGrid = semanticLayout && /grid|cards|card|product|goods|coupon|list|items|row|cols|columns|footer/i.test(String(styles.className || "")); + const visuallyGrid = inferredGrid.columnCount * inferredGrid.rowCount >= Math.max(4, childRects.length * 0.7); + return !isTable && visuallyGrid && (wraps || semanticLayout || semanticGrid); + } + + function extractLayout(computed, element, rect) { + const display = computed.getPropertyValue("display"); + const isFlex = /\b(inline-)?flex\b/i.test(display); + const isGrid = /\b(inline-)?grid\b/i.test(display); + const isTable = /\btable\b/i.test(display); + const children = Array.from(element.children || []).filter(child => { + const childRect = child.getBoundingClientRect(); + const childStyle = window.getComputedStyle(child); + return isVisible(child, childRect, childStyle); + }); + const hasLayoutChildren = children.length >= 2; + const className = String(element.className || ""); + const semanticLayout = /nav|menu|list|grid|row|column|cols|cards|items|tabs|footer|header|toolbar|form|actions|buttons/i.test(className); + + if (!isFlex && !isGrid && !isTable && !semanticLayout) return null; + if (!hasLayoutChildren && !isFlex && !isGrid) return null; + + const styles = {}; + for (const [key, cssProp] of LAYOUT_PROPS) { + styles[key] = computed.getPropertyValue(cssProp); + } + styles.className = className; + + let inferredDirection = styles.flexDirection || "row"; + if (!isFlex && hasLayoutChildren) { + const rects = children.map(child => child.getBoundingClientRect()); + const sameRowCount = rects.filter(childRect => Math.abs(childRect.top - rects[0].top) < 6).length; + inferredDirection = sameRowCount >= Math.max(2, children.length * 0.65) ? "row" : "column"; + } + + const childRects = children.map(child => { + const childStyle = window.getComputedStyle(child); + return absoluteRect(child.getBoundingClientRect(), childStyle); + }); + const inferredGrid = inferGridMetrics(childRects, parsePixels(styles.columnGap || styles.gap)); + const gridLike = isGridLikeLayout({ isGrid, isFlex, isTable, semanticLayout, styles, childRects, inferredGrid }); + const layoutType = gridLike ? "grid" : isFlex ? "flex" : isTable ? "table" : "inferred"; + + return { + type: layoutType, + display, + direction: inferredDirection, + wrap: styles.flexWrap, + justifyContent: styles.justifyContent, + alignItems: styles.alignItems, + alignContent: styles.alignContent, + gap: parsePixels(styles.gap), + rowGap: parsePixels(styles.rowGap), + columnGap: parsePixels(styles.columnGap), + padding: { + top: parsePixels(styles.paddingTop), + right: parsePixels(styles.paddingRight), + bottom: parsePixels(styles.paddingBottom), + left: parsePixels(styles.paddingLeft) + }, + margin: { + top: parsePixels(styles.marginTop), + right: parsePixels(styles.marginRight), + bottom: parsePixels(styles.marginBottom), + left: parsePixels(styles.marginLeft) + }, + grid: gridLike ? { + columns: styles.gridTemplateColumns, + rows: styles.gridTemplateRows, + autoFlow: styles.gridAutoFlow, + columnCount: inferredGrid.columnCount, + rowCount: inferredGrid.rowCount + } : null, + inferredGrid, + sizing: { + width: styles.width, + height: styles.height, + minWidth: styles.minWidth, + maxWidth: styles.maxWidth, + minHeight: styles.minHeight, + maxHeight: styles.maxHeight + }, + childCount: children.length, + childRects, + confidence: isFlex || isGrid ? 1 : gridLike ? 0.86 : semanticLayout ? 0.72 : 0.55, + rect: { + width: round(rect.width), + height: round(rect.height) + } + }; + } + + function collectAttributes(element) { + const attrs = {}; + for (const attr of Array.from(element.attributes || [])) { + if ( + attr.name === "id" || + attr.name === "class" || + attr.name === "alt" || + attr.name === "title" || + attr.name === "href" || + attr.name === "src" || + attr.name === "role" || + attr.name.startsWith("aria-") + ) { + attrs[attr.name] = attr.value; + } + } + return attrs; + } + + function extractBackgroundUrls(value) { + if (!value || value === "none") return []; + const urls = []; + const re = /url\((["']?)(.*?)\1\)/g; + let match; + while ((match = re.exec(value))) { + if (!match[2] || match[2] === "undefined" || match[2] === "null") continue; + try { + const url = new URL(match[2], document.baseURI).href; + if (!/\/undefined(?:$|[?#])/.test(url)) urls.push(url); + } catch { + urls.push(match[2]); + } + } + return urls; + } + + function extractStyleImageUrls(styles) { + return [ + ...extractBackgroundUrls(styles.backgroundImage), + ...extractBackgroundUrls(styles.maskImage), + ...extractBackgroundUrls(styles.webkitMaskImage) + ]; + } + + function parseSrcset(value) { + if (!value) return []; + return String(value) + .split(",") + .map(item => item.trim().split(/\s+/)[0]) + .filter(Boolean); + } + + function splitConcatenatedUrls(value) { + if (!value) return []; + const text = String(value).trim(); + if (!text) return []; + const matches = text.match(/https?:\/\/(?:(?!https?:\/\/).)+/gi); + if (matches && matches.length > 1) return matches; + return [text]; + } + + function canUseDescendantSources(element) { + return /^(PICTURE|VIDEO|AUDIO)$/i.test(element.tagName); + } + + function getElementImageCandidates(element) { + const candidates = []; + const add = value => { + for (const item of splitConcatenatedUrls(value)) { + const normalized = normalizeAssetUrl(item); + if (normalized) candidates.push(normalized); + } + }; + + add(element.currentSrc); + add(element.src); + add(element.poster); + add(element.getAttribute?.("src")); + add(element.getAttribute?.("data-src")); + add(element.getAttribute?.("data-original")); + add(element.getAttribute?.("data-lazy")); + add(element.getAttribute?.("data-lazy-src")); + add(element.getAttribute?.("data-bg")); + add(element.getAttribute?.("data-background")); + + for (const value of parseSrcset(element.srcset || element.getAttribute?.("srcset"))) { + add(value); + } + if (canUseDescendantSources(element)) { + for (const source of Array.from(element.querySelectorAll?.("source") || [])) { + for (const value of parseSrcset(source.srcset || source.getAttribute("srcset"))) { + add(value); + } + add(source.src); + } + } + + return Array.from(new Set(candidates)); + } + + function normalizeText(value) { + return String(value || "").replace(/\s+/g, "").trim(); + } + + function overlapRatio(a, b) { + const intersection = intersectRects(a, b); + if (!intersection) return 0; + const area = Math.max(1, Math.min( + (a.width || 1) * (a.height || 1), + (b.width || 1) * (b.height || 1) + )); + return (intersection.width * intersection.height) / area; + } + + function hasMaskImage(styles) { + return Boolean( + (styles.maskImage && styles.maskImage !== "none") || + (styles.webkitMaskImage && styles.webkitMaskImage !== "none") + ); + } + + function hasUsableBackgroundImage(styles) { + return Boolean(styles.backgroundImage && styles.backgroundImage !== "none"); + } + + function hasVisiblePaintColor(value) { + return Boolean(value && value !== "transparent" && !/rgba\([^)]*,\s*0(?:\.0+)?\)/i.test(value)); + } + + function isLightOpaquePaint(value) { + if (!value || value === "transparent") return false; + const rgba = String(value).match(/rgba?\(([^)]+)\)/i); + if (rgba) { + const parts = rgba[1].split(",").map(part => parseFloat(part.trim())); + const alpha = parts[3] == null ? 1 : parts[3]; + return alpha > 0.92 && parts[0] >= 235 && parts[1] >= 235 && parts[2] >= 235; + } + const hex = String(value).trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i); + if (!hex) return false; + const body = hex[1].length === 3 ? hex[1].split("").map(char => char + char).join("") : hex[1]; + return parseInt(body.slice(0, 2), 16) >= 235 && + parseInt(body.slice(2, 4), 16) >= 235 && + parseInt(body.slice(4, 6), 16) >= 235; + } + + function getMaxBorderWidth(styles) { + return Math.max( + parsePixels(styles.borderTopWidth), + parsePixels(styles.borderRightWidth), + parsePixels(styles.borderBottomWidth), + parsePixels(styles.borderLeftWidth) + ); + } + + function hasCornerRadius(styles) { + return Boolean( + parsePixels(styles.borderTopLeftRadius) || + parsePixels(styles.borderTopRightRadius) || + parsePixels(styles.borderBottomRightRadius) || + parsePixels(styles.borderBottomLeftRadius) + ); + } + + function classifyVisualRole(element, styles, children, currentSrc, backgroundUrls, layout) { + const tag = element?.tagName || ""; + if (/^(IMG|PICTURE|VIDEO|CANVAS|SOURCE)$/i.test(tag) || currentSrc || backgroundUrls?.length) { + return "image-node"; + } + const hasDecor = getMaxBorderWidth(styles) > 0 || + hasCornerRadius(styles) || + (styles.boxShadow && styles.boxShadow !== "none") || + (styles.filter && /drop-shadow/i.test(styles.filter)); + const isContainer = /^(HTML|BODY|DIV|SECTION|MAIN|ARTICLE|HEADER|NAV|FOOTER|ASIDE|UL|OL|LI|FORM)$/i.test(tag); + if ( + (layout || children?.length) && + isContainer && + !hasUsableBackgroundImage(styles) && + !hasDecor && + (!hasVisiblePaintColor(styles.backgroundColor) || isLightOpaquePaint(styles.backgroundColor)) + ) { + return "layout-wrapper"; + } + if ( + hasVisiblePaintColor(styles.backgroundColor) || + hasUsableBackgroundImage(styles) || + hasDecor + ) { + return "paint-node"; + } + if (layout || children?.length) return "layout-wrapper"; + return "paint-node"; + } + + function shouldSkipPseudoBackground(styles, parentRect) { + if (!styles.backgroundImage || styles.backgroundImage === "none") return false; + if (styles.backgroundRepeat && styles.backgroundRepeat !== "no-repeat") return true; + if (/auto\s+\d+px/i.test(styles.backgroundSize || "")) return true; + if (/-\d+(?:\.\d+)?px/.test(styles.backgroundPosition || "")) return true; + const parentArea = Math.max(1, (parentRect?.width || 1) * (parentRect?.height || 1)); + if (parentArea > 12000 && /(?:^|\s)(?:\d+px\s+auto|auto\s+\d+px|auto)(?:\s|$)/i.test(styles.backgroundSize || "")) return true; + return false; + } + + function hasMeaningfulElementChildren(element) { + return Array.from(element.children || []).some(child => { + const rect = child.getBoundingClientRect(); + const style = window.getComputedStyle(child); + return rect.width > 0 && + rect.height > 0 && + style.display !== "none" && + style.visibility !== "hidden" && + Number(style.opacity || 1) > 0; + }); + } + + function hasWhiteTextDescendant(element) { + const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT); + let textNode = walker.nextNode(); + while (textNode) { + if (textNode.textContent.trim()) { + const parent = textNode.parentElement; + if (parent) { + const color = window.getComputedStyle(parent).color; + if (/rgb\(255,\s*255,\s*255\)|rgba\(255,\s*255,\s*255,\s*(?:0\.\d+|1)\)/i.test(color)) { + return true; + } + } + } + textNode = walker.nextNode(); + } + return false; + } + + function visibleTextLength(element) { + return normalizeText(element.innerText).length; + } + + function shouldSkipTextNode(textNode, parentStyle) { + const parent = textNode.parentElement; + if (!parent) return true; + if (parent.closest("[hidden], [aria-hidden='true']")) return true; + if (parentStyle.display === "none" || parentStyle.visibility === "hidden") return true; + if (Number(parentStyle.opacity || 1) < 0.04) return true; + if (parseFloat(parentStyle.fontSize || "0") <= 0) return true; + const color = parentStyle.color || ""; + if (/rgba\([^)]*,\s*0(?:\.0+)?\)/i.test(color)) return true; + return false; + } + + function pushCaptureChild(children, childNode) { + if (!childNode) return; + if (childNode.type === "TEXT") { + const text = normalizeText(childNode.text); + if (!text) return; + const duplicate = children.some(existing => { + if (existing.type !== "TEXT") return false; + if (normalizeText(existing.text) !== text) return false; + return overlapRatio(existing.visibleRect || existing.rect, childNode.visibleRect || childNode.rect) > 0.72; + }); + if (duplicate) return; + } + children.push(childNode); + } + + function isUsefulHeaderElement(element, headerRect) { + if (!element || isWebToPixsoElement(element)) return false; + if (/^(HTML|BODY|SCRIPT|STYLE|META|LINK)$/i.test(element.tagName || "")) return false; + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) return false; + const absRect = absoluteRect(rect, style); + const intersection = intersectRects(absRect, headerRect); + if (!intersection) return false; + const overlap = (intersection.width * intersection.height) / Math.max(1, absRect.width * absRect.height); + if (overlap < 0.55) return false; + if (absRect.width > headerRect.width * 0.92 && absRect.height > headerRect.height * 0.8) return false; + + const text = normalizeText(element.innerText || element.textContent || element.getAttribute?.("aria-label") || element.getAttribute?.("alt") || element.getAttribute?.("placeholder") || ""); + const name = `${element.tagName || ""} ${element.id || ""} ${element.className || ""} ${element.getAttribute?.("role") || ""}`; + const hasMedia = /^(IMG|SVG|PICTURE|CANVAS)$/i.test(element.tagName || "") || Boolean(element.querySelector?.("img, svg, picture, canvas")); + const isControl = /^(A|BUTTON|INPUT|SELECT|TEXTAREA|LABEL)$/i.test(element.tagName || "") || + /button|btn|link|logo|icon|search|input|nav|menu|item|login|register/i.test(String(name)); + return Boolean(text || hasMedia || isControl); + } + + function collectHeaderPointElements(headerRect) { + const found = new Set(); + const xSteps = Math.max(8, Math.min(28, Math.ceil(headerRect.width / 88))); + const ySteps = Math.max(2, Math.min(6, Math.ceil(headerRect.height / 24))); + for (let yIndex = 0; yIndex <= ySteps; yIndex += 1) { + const y = Math.min(window.innerHeight - 1, Math.max(0, headerRect.y + (headerRect.height * yIndex / Math.max(1, ySteps)))); + for (let xIndex = 0; xIndex <= xSteps; xIndex += 1) { + const x = Math.min(window.innerWidth - 1, Math.max(0, headerRect.x + (headerRect.width * xIndex / Math.max(1, xSteps)))); + for (const element of document.elementsFromPoint(x, y) || []) { + if (isUsefulHeaderElement(element, headerRect)) { + found.add(element); + } + } + } + } + + return Array.from(found) + .filter(element => { + return !Array.from(found).some(other => other !== element && other.contains(element) && isUsefulHeaderElement(other, headerRect)); + }) + .sort((a, b) => { + const ar = a.getBoundingClientRect(); + const br = b.getBoundingClientRect(); + if (Math.abs(ar.top - br.top) > 4) return ar.top - br.top; + return ar.left - br.left; + }); + } + + function isProbablyComplexCard(element, absRect, styles) { + if (element.tagName === "HTML" || element.tagName === "BODY") return false; + if (absRect.y < window.innerHeight * 2.2) return false; + if (absRect.width < 240 || absRect.width > Math.min(window.innerWidth * 0.75, 980)) return false; + if (absRect.height < 150 || absRect.height > 640) return false; + + const imageUrls = extractStyleImageUrls(styles); + const hasImgChild = Boolean(element.querySelector("img, picture, video")); + const hasWhiteText = hasWhiteTextDescendant(element); + const hasRoundedCard = parseFloat(styles.borderTopLeftRadius || "0") > 0 || + parseFloat(styles.borderTopRightRadius || "0") > 0 || + parseFloat(styles.borderBottomLeftRadius || "0") > 0 || + parseFloat(styles.borderBottomRightRadius || "0") > 0; + const hasCardClass = /card|case|customer|client|solution|scene|cert|safe|security|item|slide|swiper/i.test(String(element.className || "")); + const hasVisualFill = imageUrls.length > 0 || + (styles.backgroundColor && !/rgba\(0,\s*0,\s*0,\s*0\)|transparent/i.test(styles.backgroundColor)); + if (visibleTextLength(element) < 8 && !hasImgChild && !imageUrls.length && !hasCardClass) return false; + + return hasWhiteText || hasImgChild || (hasVisualFill && (hasRoundedCard || hasCardClass)); + } + + function addTargetIfNonOverlapping(targets, target, maxOverlapRatio = 0.65) { + const area = Math.max(1, target.rect.width * target.rect.height); + const overlaps = targets.some(item => { + const intersection = intersectRects(item.rect, target.rect); + if (!intersection) return false; + const intersectionArea = intersection.width * intersection.height; + return intersectionArea / area > maxOverlapRatio; + }); + if (!overlaps) targets.push(target); + } + + function clippedViewportRect(absRect, minHeight = 1) { + if (!absRect) return null; + const rect = intersectRects(absRect, { + x: 0, + y: absRect.y, + width: window.innerWidth, + height: Math.min(absRect.height, window.innerHeight) + }); + if (!rect || rect.height < minHeight || rect.width < 1) return null; + return rect; + } + + function getSelectionElement(options = {}) { + if (!options.selectionId) return null; + try { + const raw = String(options.selectionId); + const escaped = window.CSS?.escape + ? CSS.escape(raw) + : raw.replace(/["\\]/g, "\\$&"); + return document.querySelector(`[data-web-to-pixso-selection-id="${escaped}"]`); + } catch { + return null; + } + } + + function getSelectionRect(element) { + if (!element) return null; + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) return null; + return absoluteRect(rect, style); + } + + function textNodeToCaptureNode(textNode, clipRect, context = {}) { + const text = textNode.textContent.replace(/\s+/g, " ").trim(); + if (!text) return null; + + const range = document.createRange(); + range.selectNodeContents(textNode); + const rect = range.getBoundingClientRect(); + range.detach(); + + const parentStyle = window.getComputedStyle(textNode.parentElement); + if (shouldSkipTextNode(textNode, parentStyle)) return null; + const absRect = absoluteRect(rect, parentStyle); + const visibleRect = intersectWithClip(absRect, clipRect); + if (!visibleRect || visibleRect.width <= 0 || visibleRect.height <= 0) return null; + + return { + id: `text-${++nodeCounter}`, + type: "TEXT", + tag: "#text", + name: text.slice(0, 40), + text, + rect: absRect, + visibleRect, + clipped: visibleRect.width !== absRect.width || visibleRect.height !== absRect.height, + visualRole: "text-node", + section: context.section || "content", + ...layerMetaFor("TEXT"), + styles: extractStyles(parentStyle), + attributes: {}, + children: [] + }; + } + + function elementLabelToTextNode(element, clipRect, context = {}) { + const text = normalizeText( + element.getAttribute?.("aria-label") || + element.getAttribute?.("alt") || + element.getAttribute?.("title") || + element.getAttribute?.("placeholder") || + element.value || + "" + ); + if (!text) return null; + const style = window.getComputedStyle(element); + const rect = element.getBoundingClientRect(); + if (!isVisible(element, rect, style)) return null; + const absRect = absoluteRect(rect, style); + const visibleRect = intersectWithClip(absRect, clipRect); + if (!visibleRect) return null; + return { + id: `text-${++nodeCounter}`, + type: "TEXT", + tag: "#text", + name: text.slice(0, 40), + text, + rect: absRect, + visibleRect, + clipped: visibleRect.width !== absRect.width || visibleRect.height !== absRect.height, + visualRole: "text-node", + section: context.section || "content", + ...layerMetaFor("TEXT"), + styles: extractStyles(style), + attributes: { "data-generated-from": "element-label" }, + children: [] + }; + } + + function pseudoElementToCaptureNode(element, pseudo, parentRect, assetUrls, clipRect, context = {}) { + const computed = window.getComputedStyle(element, pseudo); + if (!computed || computed.display === "none" || computed.visibility === "hidden") return null; + + const styles = extractStyles(computed); + const rawContent = computed.getPropertyValue("content"); + const text = rawContent && rawContent !== "none" && rawContent !== "normal" + ? rawContent.replace(/^["']|["']$/g, "") + : ""; + const backgroundUrls = extractStyleImageUrls(styles); + if (text && normalizeText(element.innerText).includes(normalizeText(text))) { + return null; + } + if (!text && !backgroundUrls.length) { + return null; + } + if (!text && hasMaskImage(styles) && !hasUsableBackgroundImage(styles) && parentRect.width * parentRect.height > 4096) { + return null; + } + if (!text && backgroundUrls.length && shouldSkipPseudoBackground(styles, parentRect)) { + return null; + } + for (const url of backgroundUrls) { + assetUrls.add(url); + } + + const hasVisibleBackground = ( + styles.backgroundColor && + styles.backgroundColor !== "rgba(0, 0, 0, 0)" && + styles.backgroundColor !== "transparent" + ) || backgroundUrls.length; + + if (!text && !hasVisibleBackground) return null; + + const absRect = absoluteRect(parentRect, styles); + const visibleRect = intersectWithClip(absRect, clipRect); + if (!visibleRect) return null; + + return { + id: `pseudo-${++nodeCounter}`, + type: text ? "TEXT" : "RECTANGLE", + tag: pseudo, + name: pseudo, + text, + rect: absRect, + visibleRect, + clipped: visibleRect.width !== absRect.width || visibleRect.height !== absRect.height, + visualRole: text ? "text-node" : "paint-node", + section: context.section || "content", + ...layerMetaFor(text ? "TEXT" : "RECTANGLE"), + styles, + attributes: {}, + backgroundImages: backgroundUrls, + children: [] + }; + } + + function elementToCaptureNode(element, assetUrls, clipRect, diagnostics, context = {}) { + if (!element || SKIP_TAGS.has(element.tagName)) return null; + if (isWebToPixsoElement(element)) return null; + if (isCarouselClone(element)) { + if (diagnostics) diagnostics.skippedCarouselClones += 1; + return null; + } + + const computed = window.getComputedStyle(element); + const clientRect = element.getBoundingClientRect(); + if (!isVisible(element, clientRect, computed)) return null; + + const styles = extractStyles(computed); + const absRect = element.tagName === "BODY" || element.tagName === "HTML" + ? getDocumentRect() + : absoluteRect(clientRect, styles); + const section = element.tagName === "HTML" || element.tagName === "BODY" + ? "document" + : inferSection(element, absRect, styles, context.section); + const childContext = { section }; + const layout = extractLayout(computed, element, absRect); + const documentClip = clipRect || getDocumentRect(); + const visibleRect = intersectRects(absRect, documentClip); + if (!visibleRect) { + if (diagnostics) diagnostics.skippedOutsideClip += 1; + return null; + } + + const ownClip = clipsChildren(styles) || element.tagName === "BODY" || element.tagName === "HTML" + ? intersectRects(documentClip, absRect) || visibleRect + : documentClip; + const renderRect = shouldClampToClip(element, absRect, visibleRect) ? visibleRect : absRect; + const attrs = collectAttributes(element); + const children = []; + const imageCandidates = getElementImageCandidates(element); + const currentSrc = imageCandidates[0] || null; + const backgroundUrls = extractStyleImageUrls(styles); + + if (/^(IMG|VIDEO|SOURCE|PICTURE)$/i.test(element.tagName)) { + for (const url of imageCandidates) { + assetUrls.add(url); + } + } + + for (const url of backgroundUrls) { + assetUrls.add(url); + } + + const beforeNode = pseudoElementToCaptureNode(element, "::before", clientRect, assetUrls, ownClip, childContext); + pushCaptureChild(children, beforeNode); + + for (const child of getChildNodes(element)) { + if (child.nodeType === Node.TEXT_NODE) { + const textNode = textNodeToCaptureNode(child, ownClip, childContext); + pushCaptureChild(children, textNode); + } else if (child.nodeType === Node.ELEMENT_NODE) { + const childNode = elementToCaptureNode(child, assetUrls, ownClip, diagnostics, childContext); + pushCaptureChild(children, childNode); + } + } + + if (!children.some(child => child.type === "TEXT")) { + pushCaptureChild(children, elementLabelToTextNode(element, ownClip, childContext)); + } + + if (isHeaderLikeElement(element) && children.length === 0) { + for (const headerElement of collectHeaderPointElements(absRect)) { + if (headerElement === element || element.contains(headerElement)) continue; + const childNode = elementToCaptureNode(headerElement, assetUrls, ownClip, diagnostics, { section: "header" }); + pushCaptureChild(children, childNode); + } + } + + const afterNode = pseudoElementToCaptureNode(element, "::after", clientRect, assetUrls, ownClip, childContext); + pushCaptureChild(children, afterNode); + + const type = element.tagName === "IMG" || backgroundUrls.length ? "RECTANGLE" : "FRAME"; + return { + id: `node-${++nodeCounter}`, + type, + tag: element.tagName, + name: attrs.id || attrs.class || element.tagName.toLowerCase(), + rect: renderRect, + sourceRect: absRect, + visibleRect, + clipRect: ownClip, + clipped: renderRect.width !== absRect.width || renderRect.height !== absRect.height, + visualRole: classifyVisualRole(element, styles, children, currentSrc, backgroundUrls, layout), + section, + ...layerMetaFor(type), + styles, + layout, + attributes: attrs, + src: currentSrc, + backgroundImages: backgroundUrls, + children + }; + } + + function normalizeAssetUrl(url) { + if (!url || url === "undefined" || url === "null") return null; + try { + const absolute = new URL(url, document.baseURI).href; + if (/\/undefined(?:$|[?#])/.test(absolute)) return null; + return absolute; + } catch { + return null; + } + } + + function toDataUrl(contentType, base64) { + return `data:${contentType || "application/octet-stream"};base64,${base64}`; + } + + function blobToDataUrl(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.onerror = reject; + reader.readAsDataURL(blob); + }); + } + + async function directFetchAsset(url) { + const response = await fetch(url, { credentials: "include", cache: "force-cache" }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + const blob = await response.blob(); + return { + ok: true, + mimeType: blob.type || response.headers.get("content-type") || "application/octet-stream", + data: await blobToDataUrl(blob) + }; + } + + function captureVideoPoster(url) { + const video = Array.from(document.querySelectorAll("video")).find(item => { + const source = normalizeAssetUrl(item.currentSrc || item.src || item.querySelector("source")?.src); + return source === url; + }); + if (!video || !video.videoWidth || !video.videoHeight) return null; + + const canvas = document.createElement("canvas"); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + const ctx = canvas.getContext("2d"); + ctx.drawImage(video, 0, 0, canvas.width, canvas.height); + return canvasToPng(canvas); + } + + async function proxyFetchAsset(url) { + if (!chrome?.runtime?.sendMessage) { + throw new Error("扩展代理不可用"); + } + const response = await chrome.runtime.sendMessage({ + type: "PIXSO_CAPTURE_FETCH_ASSET", + url + }); + if (!response?.ok) { + throw new Error(response?.error || "代理拉取失败"); + } + return { + ok: true, + mimeType: response.contentType || "application/octet-stream", + data: toDataUrl(response.contentType, response.base64) + }; + } + + async function captureVisibleTabImage() { + if (!chrome?.runtime?.sendMessage) { + return null; + } + let response = null; + try { + response = await chrome.runtime.sendMessage({ + type: "PIXSO_CAPTURE_VISIBLE_TAB" + }); + } catch (error) { + console.warn("[Web to Pixso] Raster fallback message failed", error); + return null; + } + if (!response?.ok || !response.dataUrl) { + console.warn("[Web to Pixso] Raster fallback skipped", response?.error || "标签页截图失败"); + return null; + } + const image = new Image(); + image.decoding = "async"; + image.src = response.dataUrl; + try { + await new Promise((resolve, reject) => { + image.onload = resolve; + image.onerror = reject; + }); + return image; + } catch (error) { + console.warn("[Web to Pixso] Raster fallback image decode failed", error); + return null; + } + } + + async function cropViewportRegion(rect, scrollY) { + const image = await captureVisibleTabImage(); + if (!image) return null; + const ratioX = image.naturalWidth / Math.max(1, window.innerWidth); + const ratioY = image.naturalHeight / Math.max(1, window.innerHeight); + const sourceX = Math.max(0, Math.round(rect.x * ratioX)); + const sourceY = Math.max(0, Math.round((rect.y - scrollY) * ratioY)); + const sourceWidth = Math.min(image.naturalWidth - sourceX, Math.round(rect.width * ratioX)); + const sourceHeight = Math.min(image.naturalHeight - sourceY, Math.round(rect.height * ratioY)); + if (sourceWidth <= 0 || sourceHeight <= 0) return null; + + const canvas = document.createElement("canvas"); + canvas.width = Math.max(1, Math.round(rect.width)); + canvas.height = Math.max(1, Math.round(rect.height)); + const ctx = canvas.getContext("2d"); + ctx.drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, canvas.width, canvas.height); + return canvasToPng(canvas); + } + + function hideFixedTopOverlays() { + const hidden = []; + for (const element of Array.from(document.body?.querySelectorAll("*") || [])) { + if (isWebToPixsoElement(element)) continue; + const style = window.getComputedStyle(element); + if (style.position !== "fixed" && style.position !== "sticky") continue; + const rect = element.getBoundingClientRect(); + if (rect.width < 8 || rect.height < 8) continue; + const topBar = rect.width >= window.innerWidth * 0.25 && + rect.height >= 20 && + rect.height <= 180 && + rect.top <= 140 && + rect.bottom >= 0; + const sideFloat = rect.right >= window.innerWidth - 160 && + rect.width <= 180 && + rect.height >= 40; + const bottomFloat = rect.bottom >= window.innerHeight - 120 && + rect.width <= Math.max(720, window.innerWidth * 0.55) && + rect.height <= 180; + if (!topBar && !sideFloat && !bottomFloat) continue; + const previous = { + element, + value: element.style.getPropertyValue("visibility"), + priority: element.style.getPropertyPriority("visibility") + }; + element.style.setProperty("visibility", "hidden", "important"); + hidden.push(previous); + } + + return () => { + for (const item of hidden) { + if (item.value) { + item.element.style.setProperty("visibility", item.value, item.priority || ""); + } else { + item.element.style.removeProperty("visibility"); + } + } + }; + } + + function hideWebToPixsoOverlays() { + const hidden = []; + for (const selector of [ + "#__web_to_pixso_panel_root__", + "#__web_to_pixso_picker_root__", + "#__web_to_pixso_picker_box__", + "#__web_to_pixso_picker_label__" + ]) { + const element = document.querySelector(selector); + if (!element) continue; + hidden.push({ + element, + visibility: element.style.getPropertyValue("visibility"), + visibilityPriority: element.style.getPropertyPriority("visibility"), + display: element.style.getPropertyValue("display"), + displayPriority: element.style.getPropertyPriority("display"), + opacity: element.style.getPropertyValue("opacity"), + opacityPriority: element.style.getPropertyPriority("opacity") + }); + element.style.setProperty("visibility", "hidden", "important"); + element.style.setProperty("opacity", "0", "important"); + element.style.setProperty("display", "none", "important"); + } + return () => { + for (const item of hidden) { + if (item.visibility) { + item.element.style.setProperty("visibility", item.visibility, item.visibilityPriority || ""); + } else { + item.element.style.removeProperty("visibility"); + } + if (item.display) { + item.element.style.setProperty("display", item.display, item.displayPriority || ""); + } else { + item.element.style.removeProperty("display"); + } + if (item.opacity) { + item.element.style.setProperty("opacity", item.opacity, item.opacityPriority || ""); + } else { + item.element.style.removeProperty("opacity"); + } + } + }; + } + + function hideTextForBackgroundRaster(targetRect) { + const style = document.createElement("style"); + style.setAttribute("data-web-to-pixso-background-raster", "true"); + style.textContent = ` + html body *:not(#__web_to_pixso_panel_root__):not(#__web_to_pixso_picker_root__) { + color: transparent !important; + -webkit-text-fill-color: transparent !important; + text-shadow: none !important; + caret-color: transparent !important; + } + html body *::before, + html body *::after, + html body input::placeholder, + html body textarea::placeholder { + color: transparent !important; + -webkit-text-fill-color: transparent !important; + text-shadow: none !important; + } + `; + document.documentElement.appendChild(style); + return () => style.remove(); + } + + function hideHeroForegroundForRaster(targetRect) { + const hidden = []; + const targetArea = Math.max(1, targetRect.width * targetRect.height); + const isTransparent = value => !value || /transparent|rgba\([^)]*,\s*0(?:\.0+)?\)/i.test(value); + + for (const element of Array.from(document.body?.querySelectorAll("*") || [])) { + if (isWebToPixsoElement(element)) continue; + const style = window.getComputedStyle(element); + const rect = element.getBoundingClientRect(); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + const intersection = intersectRects(absRect, targetRect); + if (!intersection) continue; + + const tag = element.tagName || ""; + const areaRatio = (absRect.width * absRect.height) / targetArea; + const text = normalizeText(element.innerText || element.textContent || ""); + const name = `${tag} ${element.id || ""} ${element.className || ""} ${element.getAttribute?.("role") || ""}`; + const hasFill = !isTransparent(style.backgroundColor) || + (style.backgroundImage && style.backgroundImage !== "none") || + parseFloat(style.borderTopWidth || "0") > 0 || + parseFloat(style.borderRightWidth || "0") > 0 || + parseFloat(style.borderBottomWidth || "0") > 0 || + parseFloat(style.borderLeftWidth || "0") > 0 || + (style.boxShadow && style.boxShadow !== "none"); + const isMedia = /^(IMG|PICTURE|VIDEO|CANVAS)$/i.test(tag); + const isLargeMedia = isMedia && areaRatio > 0.08 && absRect.width > 260 && absRect.height > 140; + const isControl = /^(A|BUTTON|INPUT|SELECT|TEXTAREA|LABEL|SVG|I|EM)$/i.test(tag) || + /button|btn|link|nav|menu|tab|card|coupon|activity|hot|item|tag|badge|icon|service|float|customer|consult|sidebar/i.test(String(name)); + const isForegroundBlock = areaRatio < 0.34 && ( + isControl || + (text.length > 0 && areaRatio < 0.24) || + (hasFill && areaRatio < 0.24) + ); + + if (!isForegroundBlock || isLargeMedia) continue; + + hidden.push({ + element, + visibility: element.style.getPropertyValue("visibility"), + visibilityPriority: element.style.getPropertyPriority("visibility") + }); + element.style.setProperty("visibility", "hidden", "important"); + } + + return () => { + for (const item of hidden) { + if (item.visibility) { + item.element.style.setProperty("visibility", item.visibility, item.visibilityPriority || ""); + } else { + item.element.style.removeProperty("visibility"); + } + } + }; + } + + function waitForPaint(ms = 80) { + return new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + window.setTimeout(resolve, ms); + }); + }); + }); + } + + function hidePageScrollbars() { + const style = document.createElement("style"); + style.textContent = ` + html, body { + scrollbar-width: none !important; + -ms-overflow-style: none !important; + } + html::-webkit-scrollbar, + body::-webkit-scrollbar, + *::-webkit-scrollbar { + width: 0 !important; + height: 0 !important; + display: none !important; + } + `; + document.documentElement.appendChild(style); + return () => style.remove(); + } + + function isLikelyHeroOrCarousel(element, absRect, styles) { + const name = `${element.id || ""} ${element.className || ""} ${element.getAttribute?.("role") || ""}`; + const isNamed = /hero|banner|kv|carousel|swiper|slick|slider|slide|campaign|masthead/i.test(String(name)); + const isMedia = /^(PICTURE|VIDEO|CANVAS)$/i.test(element.tagName) || Boolean(element.querySelector?.("picture, video, canvas")); + const nearTop = absRect.y < Math.max(window.innerHeight * 1.4, 900); + const wide = absRect.width >= window.innerWidth * 0.65; + const tall = absRect.height >= 180; + const visual = isMedia || extractStyleImageUrls(styles).length > 0 || /gradient|url\(/i.test(styles.backgroundImage || ""); + return nearTop && wide && tall && (isNamed || visual); + } + + function isLikelyFullWidthVisualSection(element, absRect, styles) { + if (element.tagName === "HTML" || element.tagName === "BODY") return false; + const name = `${element.id || ""} ${element.className || ""}`; + const named = /banner|hero|section|panel|visual|picture|media|video|campaign|activity|recommend|promo|feature/i.test(String(name)); + const media = /^(PICTURE|VIDEO|CANVAS)$/i.test(element.tagName) || Boolean(element.querySelector?.("picture, video, canvas")); + const hasImage = extractStyleImageUrls(styles).length > 0 || Boolean(element.querySelector?.("img, picture, video, canvas")); + const wide = absRect.width >= window.innerWidth * 0.78; + const tall = absRect.height >= 220; + const saneHeight = absRect.height <= window.innerHeight * 1.05; + return wide && tall && saneHeight && (media || hasImage || named); + } + + function addRasterTarget(targets, target, overlap = 0.7) { + if (!target?.rect) return; + if (target.rect.width < 2 || target.rect.height < 2) return; + const viewportRect = { + x: 0, + y: target.rect.y, + width: window.innerWidth, + height: Math.min(target.rect.height, window.innerHeight) + }; + if (!intersectRects(target.rect, viewportRect)) return; + addTargetIfNonOverlapping(targets, target, overlap); + } + + function addRasterTargetSlices(targets, target, overlap = 0.7) { + if (!target?.rect) return; + const maxHeight = Math.max(320, Math.floor(window.innerHeight * 0.86)); + const totalHeight = Math.max(1, target.rect.height); + if (totalHeight <= maxHeight) { + addRasterTarget(targets, target, overlap); + return; + } + + let offset = 0; + let index = 1; + while (offset < totalHeight - 1) { + const remaining = totalHeight - offset; + const height = Math.min(maxHeight, remaining); + addRasterTarget(targets, { + ...target, + name: `${target.name} ${index}`, + rect: { + x: target.rect.x, + y: round(target.rect.y + offset), + width: target.rect.width, + height: round(height) + } + }, overlap); + offset += height; + index += 1; + } + } + + function countKeyword(text, pattern) { + return (String(text || "").match(pattern) || []).length; + } + + function isLikelyCommerceSection(element, absRect) { + if (!element || element.tagName === "HTML" || element.tagName === "BODY") return false; + if (absRect.y < 240) return false; + if (absRect.width < window.innerWidth * 0.62) return false; + if (absRect.height < 64 || absRect.height > getDocumentRect().height * 0.85) return false; + + const name = `${element.id || ""} ${element.className || ""}`.trim(); + if (/^app$/i.test(name)) return false; + + const text = normalizeText(element.innerText || ""); + const actionCount = countKeyword(text, /立即购买|立即开通|立即领取|免费体验|了解详情/g); + const cardCount = countKeyword(text, /云服务器|云数据库|对象存储|CDN|LSS|OCR|API|价格|配置/g); + const named = /module|product|coupon|goods|package|card|recommend|activity|campaign|promo|experience|权益|优惠|more|hot/i.test(name); + const contentNamed = /新用户|上云|产品|特惠|优惠|活动|推荐|更多产品|企业实名|价格|立即/g.test(text); + + return named && contentNamed || actionCount >= 3 || cardCount >= 4; + } + + function getRasterFallbackTargets(options = {}) { + const targets = []; + const mixedMode = options.captureMode !== "editable"; + const selectionElement = getSelectionElement(options); + const selectionRect = getSelectionRect(selectionElement); + if (selectionRect) { + addRasterTarget(targets, { + name: "Selected element raster fallback", + rect: clippedViewportRect(selectionRect, 1) || selectionRect, + mode: "visual" + }, 1); + return targets; + } + + for (const element of Array.from(document.querySelectorAll("header, nav, [role='navigation'], [class*='header' i], [class*='nav' i]"))) { + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + const nearTop = absRect.y <= 120 || style.position === "fixed" || style.position === "sticky"; + const likelyHeader = rect.height >= 24 && rect.height <= 160 && rect.width >= window.innerWidth * 0.45; + if (!nearTop || !likelyHeader) continue; + addRasterTarget(targets, { + name: "Header raster fallback", + rect: absRect, + mode: "visual" + }, 0.8); + break; + } + + if (mixedMode) { + const heroCandidates = Array.from(document.querySelectorAll([ + "section", + "main > div", + "[role='banner']", + "[class*='hero' i]", + "[class*='banner' i]", + "[class*='kv' i]", + "[class*='carousel' i]", + "[class*='swiper' i]", + "[class*='slick' i]", + "[class*='slider' i]", + "[class*='slide' i]", + "[class*='campaign' i]", + "picture", + "video", + "canvas" + ].join(","))); + const heroElements = new Set(); + for (const element of heroCandidates) { + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + const styles = extractStyles(style); + if (!isLikelyHeroOrCarousel(element, absRect, styles)) continue; + if (heroElements.has(element)) continue; + heroElements.add(element); + const targetRect = clippedViewportRect(absRect, 160); + if (!targetRect) continue; + addRasterTarget(targets, { + name: "Hero carousel raster fallback", + rect: targetRect, + mode: "hero-background" + }, 0.45); + if (heroElements.size >= 3) break; + } + + const commerceCandidates = Array.from(document.querySelectorAll([ + "section", + "main > div", + "[class*='module' i]", + "[class*='product' i]", + "[class*='coupon' i]", + "[class*='goods' i]", + "[class*='package' i]", + "[class*='recommend' i]", + "[class*='activity' i]", + "[class*='campaign' i]", + "[class*='promo' i]", + "[class*='more' i]", + "[class*='experience' i]" + ].join(","))); + const commerceTargets = []; + for (const element of commerceCandidates) { + if (commerceTargets.length >= 12) break; + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + if (!isLikelyCommerceSection(element, absRect)) continue; + addRasterTargetSlices(commerceTargets, { + name: "Commerce section raster fallback", + mode: "background", + rect: { + x: Math.max(0, absRect.x), + y: absRect.y, + width: Math.min(window.innerWidth, absRect.width), + height: absRect.height + } + }, 0.68); + } + targets.push(...commerceTargets); + + const sectionCandidates = Array.from(document.querySelectorAll([ + "section", + "article", + "[class*='banner' i]", + "[class*='panel' i]", + "[class*='visual' i]", + "[class*='media' i]", + "[class*='feature' i]", + "[class*='activity' i]", + "[class*='promo' i]", + "[class*='recommend' i]", + "picture", + "video", + "canvas" + ].join(","))); + for (const element of sectionCandidates) { + if (targets.filter(target => target.name === "Visual section raster fallback").length >= 10) break; + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + const styles = extractStyles(style); + if (!isLikelyFullWidthVisualSection(element, absRect, styles)) continue; + const targetRect = clippedViewportRect(absRect, 180); + if (!targetRect) continue; + addRasterTarget(targets, { + name: "Visual section raster fallback", + rect: targetRect, + mode: "background" + }, 0.55); + } + } + + const footer = Array.from(document.querySelectorAll("footer, [class*='footer' i]")) + .map(element => { + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) return null; + const absRect = absoluteRect(rect, style); + if (absRect.y < window.innerHeight * 3) return null; + if (absRect.width < window.innerWidth * 0.45 || absRect.height < 180) return null; + return { + name: "Footer raster fallback", + mode: "background", + rect: { + x: Math.max(0, absRect.x), + y: absRect.y, + width: Math.min(window.innerWidth, absRect.width), + height: Math.min(absRect.height, window.innerHeight * 0.95) + } + }; + }) + .filter(Boolean) + .sort((a, b) => b.rect.height - a.rect.height)[0]; + if (footer) addRasterTarget(targets, footer, 0.75); + + const complexCards = []; + const candidates = Array.from(document.querySelectorAll([ + "a", + "li", + "article", + "section", + "section div", + "[class*='card' i]", + "[class*='case' i]", + "[class*='customer' i]", + "[class*='client' i]", + "[class*='solution' i]", + "[class*='scene' i]", + "[class*='safe' i]", + "[class*='security' i]", + "[class*='cert' i]", + "[class*='swiper-slide' i]" + ].join(","))); + for (const element of candidates) { + if (complexCards.length >= 18) break; + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + if (!isVisible(element, rect, style)) continue; + const absRect = absoluteRect(rect, style); + const styles = extractStyles(style); + if (!isProbablyComplexCard(element, absRect, styles)) continue; + addRasterTarget(complexCards, { + name: "Complex card raster fallback", + rect: absRect, + mode: "background" + }, 0.65); + } + targets.push(...complexCards); + return targets; + } + + async function collectRasterFallbacks(options = {}) { + const nodes = []; + const assets = {}; + const targets = getRasterFallbackTargets(options); + const originalX = window.scrollX; + const originalY = window.scrollY; + const restoreScrollbars = hidePageScrollbars(); + + try { + for (const target of targets) { + try { + const scrollY = Math.max(0, Math.min(target.rect.y, document.documentElement.scrollHeight - window.innerHeight)); + window.scrollTo(0, scrollY); + await new Promise(resolve => setTimeout(resolve, 620)); + const restorePluginOverlays = hideWebToPixsoOverlays(); + const restoreText = target.mode === "visual" + ? () => {} + : hideTextForBackgroundRaster(target.rect); + const restoreHeroForeground = target.mode === "hero-background" + ? hideHeroForegroundForRaster(target.rect) + : () => {}; + const restoreOverlays = target.name.includes("Header") + ? () => {} + : hideFixedTopOverlays(); + let asset = null; + try { + await waitForPaint(target.mode === "visual" ? 20 : 90); + asset = await cropViewportRegion(target.rect, window.scrollY); + } finally { + restoreOverlays(); + restoreHeroForeground(); + restoreText(); + restorePluginOverlays(); + } + if (!asset?.data) continue; + const key = `web-to-pixso-raster://${++rasterCounter}`; + assets[key] = { + type: "image", + mimeType: asset.mimeType || "image/png", + data: asset.data + }; + nodes.push({ + id: `raster-${rasterCounter}`, + type: "RECTANGLE", + tag: "RASTER_FALLBACK", + name: target.name, + rect: target.rect, + visibleRect: target.rect, + clipped: false, + visualRole: "raster-fallback", + section: inferRasterSection(target), + ...layerMetaFor("RECTANGLE", { rasterMode: target.mode || "background" }), + styles: { + display: "block", + visibility: "visible", + position: target.name.includes("Header") ? "fixed" : "absolute", + zIndex: target.name.includes("Header") ? "20" : "1", + opacity: "1", + overflow: "hidden", + backgroundColor: "rgba(0, 0, 0, 0)", + backgroundImage: `url("${key}")`, + backgroundSize: "100% 100%", + backgroundRepeat: "no-repeat", + borderTopWidth: "0px", + borderRightWidth: "0px", + borderBottomWidth: "0px", + borderLeftWidth: "0px", + boxShadow: "none", + filter: "none", + color: "rgba(0, 0, 0, 0.85)", + transform: "none" + }, + attributes: { + "data-raster-fallback": "true", + "data-raster-mode": target.mode || "background", + "data-layer-group": "comparison", + "data-section": inferRasterSection(target) + }, + rasterMode: target.mode || "background", + backgroundImages: [key], + children: [] + }); + } catch (error) { + console.warn("[Web to Pixso] Raster fallback failed", error); + } + } + } finally { + restoreScrollbars(); + window.scrollTo(originalX, originalY); + } + + await new Promise(resolve => setTimeout(resolve, 120)); + return { nodes, assets }; + } + + async function collectComparisonFallbacks(options = {}) { + const nodes = []; + const assets = {}; + const documentRect = getDocumentRect(); + const width = Math.max(1, Math.round(window.innerWidth || documentRect.width || Number(options.captureWidth || 0) || 1440)); + const totalHeight = Math.max(1, Math.round(documentRect.height || document.documentElement.scrollHeight || window.innerHeight)); + const sliceHeight = Math.max(320, Math.floor(window.innerHeight * 0.86)); + const originalX = window.scrollX; + const originalY = window.scrollY; + const restoreScrollbars = hidePageScrollbars(); + + try { + let y = 0; + let index = 1; + while (y < totalHeight - 1) { + const height = Math.min(sliceHeight, totalHeight - y); + const rect = { + x: 0, + y, + width, + height + }; + try { + const scrollY = Math.max(0, Math.min(y, document.documentElement.scrollHeight - window.innerHeight)); + window.scrollTo(0, scrollY); + await new Promise(resolve => setTimeout(resolve, 420)); + const restorePluginOverlays = hideWebToPixsoOverlays(); + const restoreFixedOverlays = options.keepFixedOverlays === true + ? () => {} + : hideFixedTopOverlays(); + let asset = null; + try { + await waitForPaint(40); + asset = await cropViewportRegion(rect, window.scrollY); + } finally { + restoreFixedOverlays(); + restorePluginOverlays(); + } + if (asset?.data) { + const key = `web-to-pixso-raster://${++rasterCounter}`; + assets[key] = { + type: "image", + mimeType: asset.mimeType || "image/png", + data: asset.data + }; + nodes.push({ + id: `raster-${rasterCounter}`, + type: "RECTANGLE", + tag: "RASTER_FALLBACK", + name: `对比底图-${width}px${totalHeight > sliceHeight ? ` ${index}` : ""}`, + rect, + visibleRect: rect, + clipped: false, + visualRole: "raster-fallback", + section: "document", + ...layerMetaFor("RECTANGLE", { rasterMode: "comparison" }), + styles: { + display: "block", + visibility: "visible", + position: "absolute", + zIndex: "0", + opacity: "1", + overflow: "hidden", + backgroundColor: "rgba(0, 0, 0, 0)", + backgroundImage: `url("${key}")`, + backgroundSize: "100% 100%", + backgroundRepeat: "no-repeat", + borderTopWidth: "0px", + borderRightWidth: "0px", + borderBottomWidth: "0px", + borderLeftWidth: "0px", + boxShadow: "none", + filter: "none", + color: "rgba(0, 0, 0, 0.85)", + transform: "none" + }, + attributes: { + "data-raster-fallback": "true", + "data-raster-mode": "comparison", + "data-layer-group": "comparison", + "data-section": "document" + }, + rasterMode: "comparison", + backgroundImages: [key], + children: [] + }); + } + } catch (error) { + console.warn("[Web to Pixso] Comparison fallback failed", error); + } + y += height; + index += 1; + } + } finally { + restoreScrollbars(); + window.scrollTo(originalX, originalY); + } + + await new Promise(resolve => setTimeout(resolve, 120)); + return { nodes, assets }; + } + + function canvasToPng(canvas) { + return new Promise(resolve => { + canvas.toBlob(blob => { + if (!blob) { + resolve(null); + return; + } + blobToDataUrl(blob).then(data => resolve({ + mimeType: "image/png", + data + })); + }, "image/png"); + }); + } + + async function normalizeAssetForPixso(asset) { + if (!asset?.data) return asset; + if (/^image\/(png|jpe?g|webp)$/i.test(asset.mimeType || "")) { + return asset; + } + + try { + const image = new Image(); + image.decoding = "async"; + image.src = asset.data; + await new Promise((resolve, reject) => { + image.onload = resolve; + image.onerror = reject; + }); + + const canvas = document.createElement("canvas"); + canvas.width = Math.max(1, image.naturalWidth || image.width || 1); + canvas.height = Math.max(1, image.naturalHeight || image.height || 1); + const ctx = canvas.getContext("2d"); + ctx.drawImage(image, 0, 0, canvas.width, canvas.height); + + return await canvasToPng(canvas) || asset; + } catch (error) { + console.warn("[Web to Pixso] Image normalization failed", error); + return asset; + } + } + + async function fetchAsset(url, useProxy) { + const videoPoster = await captureVideoPoster(url); + if (videoPoster) return videoPoster; + + if (useProxy) { + try { + return await proxyFetchAsset(url); + } catch (proxyError) { + console.warn("[Web to Pixso] Proxy image fetch failed, trying direct fetch", proxyError); + return directFetchAsset(url); + } + } + + try { + return await directFetchAsset(url); + } catch (directError) { + console.warn("[Web to Pixso] Direct image fetch failed, trying extension proxy", directError); + return proxyFetchAsset(url); + } + } + + async function collectAssets(urls, options) { + const assets = {}; + const queue = Array.from(new Set(Array.from(urls).map(url => normalizeAssetUrl(url)).filter(Boolean))); + const rawConcurrency = options.concurrency === "infinite" + ? queue.length || 1 + : Number(options.concurrency || 8); + const concurrency = Math.max(1, Math.min(queue.length || 1, rawConcurrency || 8)); + let cursor = 0; + + async function worker() { + while (cursor < queue.length) { + const url = queue[cursor++]; + try { + const result = await normalizeAssetForPixso(await fetchAsset(url, options.useProxy)); + assets[url] = { + type: "image", + mimeType: result.mimeType, + data: result.data + }; + } catch (error) { + assets[url] = { + type: "image", + error: error.message || String(error) + }; + } + } + } + + await Promise.all(Array.from({ length: concurrency }, worker)); + return assets; + } + + function collectFonts(root) { + const fonts = {}; + const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); + let node = walker.currentNode; + + while (node) { + const style = window.getComputedStyle(node); + const family = style.fontFamily; + if (family) { + fonts[family] = { + family, + weight: style.fontWeight, + style: style.fontStyle + }; + } + node = walker.nextNode(); + } + + return fonts; + } + + function countLayoutNodes(captureNode) { + if (!captureNode) return 0; + let count = captureNode.layout ? 1 : 0; + for (const child of captureNode.children || []) { + count += countLayoutNodes(child); + } + return count; + } + + window.__webToPixsoCapture = async function capture(options = {}) { + nodeCounter = 0; + rasterCounter = 0; + const assetUrls = new Set(); + const selectionElement = getSelectionElement(options); + const selectionRect = getSelectionRect(selectionElement); + const diagnostics = { + skippedCarouselClones: 0, + skippedOutsideClip: 0, + selectedElement: Boolean(selectionElement) + }; + let comparisonFallbacks = { nodes: [], assets: {} }; + if (!selectionRect && options.comparisonFallback !== false) { + try { + comparisonFallbacks = await collectComparisonFallbacks(options); + } catch (error) { + console.warn("[Web to Pixso] Comparison fallback collection skipped", error); + } + } + const documentRect = selectionRect || getDocumentRect(); + const root = elementToCaptureNode(selectionElement || document.documentElement, assetUrls, documentRect, diagnostics); + const viewportRect = selectionRect || getViewportRect(); + let rasterFallbacks = { nodes: [], assets: {} }; + if (options.rasterFallbacks !== false && options.captureMode !== "editable") { + try { + rasterFallbacks = await collectRasterFallbacks(options); + } catch (error) { + console.warn("[Web to Pixso] Raster fallback collection skipped", error); + } + } + if (root?.children) { + if (comparisonFallbacks.nodes.length) root.children.push(...comparisonFallbacks.nodes); + if (rasterFallbacks.nodes.length) root.children.push(...rasterFallbacks.nodes); + } + const assets = { + ...(await collectAssets(assetUrls, { + useProxy: Boolean(options.useProxy), + concurrency: options.concurrency || "8" + })), + ...comparisonFallbacks.assets, + ...rasterFallbacks.assets + }; + + return { + schema: CAPTURE_SCHEMA, + schemaVersion: CAPTURE_SCHEMA_VERSION, + format: "pixso-design-capture", + version: CAPTURE_SCHEMA_VERSION, + generatedAt: new Date().toISOString(), + source: { + title: document.title || location.hostname || "Web Capture", + url: location.href, + viewport: viewportRect, + document: documentRect, + devicePixelRatio: window.devicePixelRatio || 1, + requestedViewportWidth: Math.max(1, Math.round(Number(options.captureWidth || 0))) || window.innerWidth || viewportRect.width, + actualViewportWidth: window.innerWidth, + selection: selectionRect ? { + x: selectionRect.x, + y: selectionRect.y, + width: selectionRect.width, + height: selectionRect.height, + elementName: selectionElement?.tagName?.toLowerCase() || "element" + } : null + }, + canvas: { + x: selectionRect?.x || 0, + y: selectionRect?.y || 0, + width: viewportRect.width, + height: documentRect.height, + backgroundColor: window.getComputedStyle(document.body).backgroundColor || "#ffffff" + }, + import: { + defaultWidth: selectionRect?.width || Math.max(1, Math.round(Number(options.captureWidth || 0))) || window.innerWidth || viewportRect.width || 1440, + captureMode: options.captureMode === "editable" ? "editable" : "mixed" + }, + nodes: root, + assets, + fonts: collectFonts(document.documentElement), + diagnostics: { + nodeCount: nodeCounter, + assetCount: Object.keys(assets).length, + failedAssetCount: Object.values(assets).filter(asset => asset.error).length, + layoutNodeCount: countLayoutNodes(root), + comparisonFallbackCount: comparisonFallbacks.nodes.length, + rasterFallbackCount: rasterFallbacks.nodes.length, + captureMode: options.captureMode === "editable" ? "editable" : "mixed", + ...diagnostics + } + }; + }; +})(); diff --git a/web-to-pixso/element-picker.js b/web-to-pixso/element-picker.js new file mode 100644 index 0000000..3a47c41 --- /dev/null +++ b/web-to-pixso/element-picker.js @@ -0,0 +1,455 @@ +(function () { + "use strict"; + + const ROOT_ID = "__web_to_pixso_picker_root__"; + const BOX_ID = "__web_to_pixso_picker_box__"; + const LABEL_ID = "__web_to_pixso_picker_label__"; + const ATTR = "data-web-to-pixso-selection-id"; + const STORAGE_KEY = "__web_to_pixso_island_position__"; + + let currentElement = null; + let currentSettings = null; + let mode = "toolbar"; + let dragging = null; + + function removePicker() { + document.getElementById(ROOT_ID)?.remove(); + document.getElementById(BOX_ID)?.remove(); + document.getElementById(LABEL_ID)?.remove(); + document.removeEventListener("mousemove", onMouseMove, true); + document.removeEventListener("click", onClick, true); + document.removeEventListener("keydown", onKeyDown, true); + document.removeEventListener("pointermove", onDragMove, true); + document.removeEventListener("pointerup", onDragEnd, true); + currentElement = null; + mode = "toolbar"; + dragging = null; + } + + function elementName(element) { + if (!element) return ""; + const tag = element.tagName ? element.tagName.toLowerCase() : "element"; + const id = element.id ? `#${element.id}` : ""; + const className = String(element.className || "") + .trim() + .split(/\s+/) + .filter(Boolean) + .slice(0, 2) + .map(item => `.${item}`) + .join(""); + return `${tag}${id}${className}`; + } + + function icon(type) { + if (type === "screen") { + return ''; + } + if (type === "select") { + return ''; + } + if (type === "copy") { + return ''; + } + return ''; + } + + function rootCss() { + return ` + #${ROOT_ID} { + color-scheme: light; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; + left: 50%; + position: fixed; + top: 24px; + transform: translateX(-50%); + user-select: none; + z-index: 2147483647; + } + #${ROOT_ID} .w2p-island { + align-items: stretch; + background: rgba(36, 36, 38, 0.97); + border-radius: 22px; + box-shadow: 0 8px 24px rgba(0,0,0,.22); + color: white; + display: flex; + min-height: 56px; + overflow: hidden; + } + #${ROOT_ID} .w2p-action, + #${ROOT_ID} .w2p-close, + #${ROOT_ID} .w2p-cancel { + align-items: center; + background: transparent; + border: 0; + color: white; + cursor: pointer; + display: flex; + font: inherit; + gap: 10px; + justify-content: center; + min-height: 56px; + padding: 0 18px; + white-space: nowrap; + } + #${ROOT_ID} .w2p-action { + border-right: 1px solid rgba(255,255,255,.14); + font-size: 16px; + font-weight: 650; + } + #${ROOT_ID} .w2p-action:hover, + #${ROOT_ID} .w2p-close:hover, + #${ROOT_ID} .w2p-cancel:hover { + background: rgba(255,255,255,.1); + } + #${ROOT_ID} .w2p-action.active { + background: rgba(255,255,255,.12); + } + #${ROOT_ID} svg { + fill: none; + height: 20px; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; + width: 20px; + } + #${ROOT_ID} .w2p-close { + min-width: 56px; + padding: 0 16px; + } + #${ROOT_ID} .w2p-status { + align-items: center; + display: flex; + gap: 12px; + min-height: 56px; + padding: 0 20px; + } + #${ROOT_ID} .w2p-text { + font-size: 16px; + font-weight: 650; + white-space: nowrap; + } + #${ROOT_ID} .w2p-spinner { + animation: w2p-spin .9s linear infinite; + border: 2px solid rgba(255,255,255,.32); + border-radius: 50%; + border-top-color: #fff; + height: 20px; + width: 20px; + } + #${ROOT_ID} .w2p-cancel { + border-left: 1px solid rgba(255,255,255,.14); + font-size: 15px; + padding: 0 18px; + } + #${BOX_ID} { + background: rgba(46, 156, 255, .16); + border: 2px dashed #1593ff; + border-radius: 6px; + box-sizing: border-box; + display: none; + left: 0; + pointer-events: none; + position: fixed; + top: 0; + z-index: 2147483646; + } + #${LABEL_ID} { + background: #fff; + border-radius: 6px; + box-shadow: 0 8px 22px rgba(0,0,0,.2); + color: #333; + display: none; + font: 14px/1.2 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + max-width: 280px; + overflow: hidden; + padding: 8px 10px; + pointer-events: none; + position: fixed; + text-overflow: ellipsis; + white-space: nowrap; + z-index: 2147483647; + } + @keyframes w2p-spin { to { transform: rotate(360deg); } } + `; + } + + function ensureBase() { + document.getElementById(ROOT_ID)?.remove(); + const root = document.createElement("div"); + root.id = ROOT_ID; + const style = document.createElement("style"); + style.textContent = rootCss(); + root.appendChild(style); + document.documentElement.appendChild(root); + + let box = document.getElementById(BOX_ID); + if (!box) { + box = document.createElement("div"); + box.id = BOX_ID; + document.documentElement.appendChild(box); + } + + let label = document.getElementById(LABEL_ID); + if (!label) { + label = document.createElement("div"); + label.id = LABEL_ID; + document.documentElement.appendChild(label); + } + + restorePosition(root); + root.addEventListener("pointerdown", onDragStart, true); + return root; + } + + function restorePosition(root) { + try { + const saved = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || "null"); + if (saved && Number.isFinite(saved.left) && Number.isFinite(saved.top)) { + root.style.left = `${saved.left}px`; + root.style.top = `${saved.top}px`; + root.style.transform = "none"; + } + } catch { + // Keep the default centered position when storage is unavailable. + } + } + + function savePosition(root) { + const rect = root.getBoundingClientRect(); + try { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ + left: Math.round(rect.left), + top: Math.round(rect.top) + })); + } catch { + // Position persistence is only a convenience. + } + } + + function clampIsland(root, snap) { + const rect = root.getBoundingClientRect(); + let left = rect.left; + let top = rect.top; + const gap = 10; + left = Math.max(gap, Math.min(window.innerWidth - rect.width - gap, left)); + top = Math.max(gap, Math.min(window.innerHeight - rect.height - gap, top)); + if (snap) { + const distances = [ + { side: "left", value: left }, + { side: "right", value: window.innerWidth - left - rect.width }, + { side: "top", value: top }, + { side: "bottom", value: window.innerHeight - top - rect.height } + ].sort((a, b) => a.value - b.value); + if (distances[0].value < 96) { + if (distances[0].side === "left") left = gap; + if (distances[0].side === "right") left = window.innerWidth - rect.width - gap; + if (distances[0].side === "top") top = gap; + if (distances[0].side === "bottom") top = window.innerHeight - rect.height - gap; + } + } + root.style.left = `${Math.round(left)}px`; + root.style.top = `${Math.round(top)}px`; + root.style.transform = "none"; + savePosition(root); + } + + function onDragStart(event) { + const target = event.target; + if (target?.closest?.("button")) return; + const root = document.getElementById(ROOT_ID); + if (!root) return; + const rect = root.getBoundingClientRect(); + dragging = { + offsetX: event.clientX - rect.left, + offsetY: event.clientY - rect.top + }; + root.style.transform = "none"; + document.addEventListener("pointermove", onDragMove, true); + document.addEventListener("pointerup", onDragEnd, true); + } + + function onDragMove(event) { + if (!dragging) return; + event.preventDefault(); + const root = document.getElementById(ROOT_ID); + if (!root) return; + root.style.left = `${event.clientX - dragging.offsetX}px`; + root.style.top = `${event.clientY - dragging.offsetY}px`; + } + + function onDragEnd() { + const root = document.getElementById(ROOT_ID); + dragging = null; + document.removeEventListener("pointermove", onDragMove, true); + document.removeEventListener("pointerup", onDragEnd, true); + if (root) clampIsland(root, true); + } + + function setToolbarStatus(text, busy = true) { + const root = document.getElementById(ROOT_ID) || ensureBase(); + root.innerHTML = ` +
+
+ ${busy ? '' : ""} + +
+ +
`; + root.querySelector(".w2p-text").textContent = text; + root.querySelector(".w2p-cancel").addEventListener("click", removePicker); + root.addEventListener("pointerdown", onDragStart, true); + clampIsland(root, false); + } + + function showToolbar(settings) { + removePicker(); + currentSettings = settings || {}; + mode = "toolbar"; + const root = ensureBase(); + root.innerHTML = ` +
+ + + + +
`; + root.addEventListener("pointerdown", onDragStart, true); + root.querySelector('[data-action="close"]').addEventListener("click", removePicker); + root.querySelector('[data-action="select"]').addEventListener("click", () => startElementPicker(currentSettings)); + root.querySelector('[data-action="screen"]').addEventListener("click", () => startFullPageCapture(false)); + root.querySelector('[data-action="clipboard"]').addEventListener("click", () => startFullPageCapture(true)); + clampIsland(root, false); + } + + async function copyText(text) { + try { + await navigator.clipboard.writeText(text); + return true; + } catch { + const textarea = document.createElement("textarea"); + textarea.value = text; + textarea.style.cssText = "position:fixed;left:-9999px;top:0;opacity:0"; + document.documentElement.appendChild(textarea); + textarea.focus(); + textarea.select(); + const ok = document.execCommand("copy"); + textarea.remove(); + if (!ok) throw new Error("浏览器拒绝写入剪贴板"); + return true; + } + } + + async function startFullPageCapture(copyToClipboard) { + setToolbarStatus(copyToClipboard ? "正在将页面捕获到剪贴板" : "正在捕获整个页面"); + try { + const response = await chrome.runtime.sendMessage({ + type: copyToClipboard ? "PIXSO_CAPTURE_CLIPBOARD" : "PIXSO_CAPTURE_CURRENT_TAB", + options: currentSettings || {} + }); + if (!response?.ok) throw new Error(response?.error || "采集失败"); + if (copyToClipboard) { + await copyText(response.json); + setToolbarStatus("已复制 JSON 到剪贴板", false); + } else { + setToolbarStatus("整页采集完成", false); + } + setTimeout(removePicker, 1100); + } catch (error) { + setToolbarStatus(error.message || String(error), false); + setTimeout(showToolbar, 2200, currentSettings); + } + } + + function hideHighlight() { + const box = document.getElementById(BOX_ID); + const label = document.getElementById(LABEL_ID); + if (box) box.style.display = "none"; + if (label) label.style.display = "none"; + } + + function updateHighlight(element) { + const box = document.getElementById(BOX_ID); + const label = document.getElementById(LABEL_ID); + if (!box || !label || !element) return; + const rect = element.getBoundingClientRect(); + if (rect.width <= 0 || rect.height <= 0) return; + + box.style.display = "block"; + box.style.left = `${Math.max(0, rect.left)}px`; + box.style.top = `${Math.max(0, rect.top)}px`; + box.style.width = `${rect.width}px`; + box.style.height = `${rect.height}px`; + + label.style.display = "block"; + label.textContent = elementName(element); + label.style.left = `${Math.max(8, rect.left)}px`; + label.style.top = `${Math.max(8, Math.min(window.innerHeight - 36, rect.bottom + 8))}px`; + } + + function isPickerNode(element) { + return Boolean(element?.closest?.(`#${ROOT_ID}, #${BOX_ID}, #${LABEL_ID}`)); + } + + function onMouseMove(event) { + if (mode !== "select") return; + const element = event.target; + if (!element || isPickerNode(element)) return; + currentElement = element; + updateHighlight(element); + } + + function onKeyDown(event) { + if (event.key === "Escape") { + event.preventDefault(); + event.stopPropagation(); + removePicker(); + } + } + + async function onClick(event) { + if (mode !== "select" || !currentElement || isPickerNode(event.target)) return; + event.preventDefault(); + event.stopPropagation(); + + const selected = currentElement; + const rect = selected.getBoundingClientRect(); + const selectionId = `w2p-${Date.now()}-${Math.random().toString(16).slice(2)}`; + selected.setAttribute(ATTR, selectionId); + setToolbarStatus("正在捕获所选元素"); + + try { + const response = await chrome.runtime.sendMessage({ + type: "PIXSO_CAPTURE_ELEMENT_START", + options: { + ...(currentSettings || {}), + captureMode: "mixed", + selectionId, + selectionWidth: Math.max(1, Math.round(rect.width)) + } + }); + if (!response?.ok) throw new Error(response?.error || "元素采集失败"); + setToolbarStatus(`元素采集完成,宽度 ${response.selectionWidth || Math.round(rect.width)}px`, false); + setTimeout(removePicker, 1100); + } catch (error) { + setToolbarStatus(error.message || String(error), false); + setTimeout(() => startElementPicker(currentSettings), 2200); + } finally { + selected.removeAttribute(ATTR); + hideHighlight(); + } + } + + function startElementPicker(settings) { + removePicker(); + currentSettings = settings || {}; + mode = "select"; + setToolbarStatus("选择要捕获的元素"); + document.addEventListener("mousemove", onMouseMove, true); + document.addEventListener("click", onClick, true); + document.addEventListener("keydown", onKeyDown, true); + } + + window.__webToPixsoStartElementPicker = startElementPicker; + window.__webToPixsoShowCaptureToolbar = showToolbar; +})(); diff --git a/web-to-pixso/logo/icon128.svg b/web-to-pixso/logo/icon128.svg new file mode 100644 index 0000000..3283807 --- /dev/null +++ b/web-to-pixso/logo/icon128.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + P + diff --git a/web-to-pixso/logo/icon16.svg b/web-to-pixso/logo/icon16.svg new file mode 100644 index 0000000..bef83a3 --- /dev/null +++ b/web-to-pixso/logo/icon16.svg @@ -0,0 +1,4 @@ + + + P + diff --git a/web-to-pixso/logo/icon32.svg b/web-to-pixso/logo/icon32.svg new file mode 100644 index 0000000..c96e9c7 --- /dev/null +++ b/web-to-pixso/logo/icon32.svg @@ -0,0 +1,4 @@ + + + P + diff --git a/web-to-pixso/logo/icon48.svg b/web-to-pixso/logo/icon48.svg new file mode 100644 index 0000000..dd73ac2 --- /dev/null +++ b/web-to-pixso/logo/icon48.svg @@ -0,0 +1,4 @@ + + + P + diff --git a/web-to-pixso/logo/plugin-logo.png b/web-to-pixso/logo/plugin-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..73f9beacc95795bef52ca5a16c1ee5cb32fcb1fd GIT binary patch literal 115230 zcmYhi1yoes`vyAnP}1EY9YZ71-5?FpB`w|E9nuZb(%m7cbV|2?ba&mO-~V^--D_C0 zU=8Q&^XBtB`<)17MJZGyLL?9fgeoH~t^xuS3I$lC+*E+-M0s>)k|?Se+p^CPl!y5oxiO@ zcB(Ywj=43HMEOn+dcPo~D8|JzujlmF7b$Du@r5xP4Q|GFZgyk41=@xlwf)3<jajk|l+*@3ilsj~z|jF!Hv+hko&7+E@Ce8R&EIAfKLOJ4WrXaSSI;F*OFBznLn zL%IG+;D6J1Ru(5(M`Afon4E+AFfAL=Uz0t9vh%+A@7LLNbMjC;fTm$yw;5huJnigp-6yN#*38Y?q zZ-<0bT)h3G#rn>@oL^zV_`g#7M`$188a!tX;`BZ#zk2dKyLI>tusocs>TmnbJD}HQ zuAK{09S=z7NJZLrr5+y9_@H@&dyz?JEy8|M4Ss}(2+{d1NkwCj3HcWlz2zfvWr~V= zrZpi^u@{s-#e0E46w?WNCk;Wtt=Z4!dAu@X6?LGK)cZW?0>5g~HW`VmPKNybT(she zeY!T@k%g(bBkI!E+em6nKWB$-XxwwFSLm4(epQM8RTOC-|N01FXYtsJyJED)4gGds zK+al8C&yjIKt~!ErmS@H{%3>HUc#Rl$>c-CvUVEu ze3Tx+9|1=53zwk8^t1Sc$gmVhVf66h^l7n;PL9#_8{=9pclv@op|9UXPB2D&m0R6& zL<)_SNrcz`P#23Bf*P=`uv}AQl;q|}qcP!qlBs)5TRXugA3R*C{2$_;G58-OCw)Ds zCSjRwtPzc2DX<66@oQFS^ZK^kyI$BG64qJo5F#waU5vx+*JXH9Om-gkM;$A&pVg?> z#`SexJBO?d-sG4iEeT(FdszygO6c}YzY-nquF9rFg#B#zaJp#6g<*N#V2$FrZnF2~ zH~(E!gEv%)H?w#*JY|0#lw^i58K)sZ@CTUO-`Bl;%_L3WhrkxWENx z%9x>#&n88dZ+o4*T2Jism-41J$y76}?9+5U^XP<#zW|Oj;7aGmo2TqwORaZ^5%GJu zvMw%DcPpA!aP6=p*(-hHom7LbcAD3O(lzKc7fOx^ci|u}XDJW@)@ntFCx3qwV zopN>%=bNAdnHfx!_d>E*UtF{GJ>x({25#>X{D3F#H$L;iqji05`54G{peN5*pUEfb z!x~lFw{V+Ijr=_0-}hMG&}ACGOCH;4fdOx+inX^L=sBDB8J~Wk{7Jg}&<_0bF~Bqp ztqsa+K%ex%juX*R+6sKKQ$)nAfayctX9FLK5k_Ivkw1fl$i&PH2M?BeHphy1H(4JQ zrFD=U^&Db3CG@_Q$^#!!Iy6XHv~FuPmeNfMUes2EbNUoZFiJpV#sc=95b;AQdL*jy zYd9YZ_N^>9#bh5j!rPMC5bD}I#-GNY50s~&zw60C4e5NaHhUF39HY6OPFZ9{n;pJh zK+d$e%_~DgLBDv0HTe|#@@bL^E2x3ynGlB)7ySM6tkTMsE7r*O&xoW?f`i*Z4cY|_ z&_TVc9f$4ISY;)i{hKzW4u7&QyU&HA@GZ$igP$cjsv~Zxf{FzZFrq&!g&X-0PS#80 z)gZ4vr@3kQ38Gluhb07vTubermxYJf=xpWBKu|bHR}|8XEN_=`5!T%R*2c!d2Y=c({o8 z+My%}zsN}L(CtN`&{w1C^u^q1%HY!xPbJMKuoU9s2f_fOdsn&WnQ3@$mJrn#OH~{SSCgZ(VtRaTpW5XY<`81#>YRk2HlG?EBAqvng;Tsg-2ZT*IIN6V zg>@PWNlV=kTw`L6dZn2;dKO^f;pa2Re>_GH&CeD!F6&u@`ZgwA4~b_&IV5)z1H-#C z_3=%M3_bh3{Bb1cF@`LmaKYx&7$r<;<>j;-%o7}CWh;qg;2OS5*zF_RDVg7iyRZgx z!2n*j+VRXIkVd-ly`mEn7*3}-68oZz>^NuKy44s`c3qlt*J}C#3eYg2MU+|lbceEK zdniy&dXCS@{Du1M`Cey@7;^25IhDv3A@XcJmF1P}jU|O-XJ-4HIC%o=@iU1U%Z{hz zx=GSonH#VDfL{U7?Fj1{^tIoNEpi*>s0P&(B%W66P-xvK?f3;TgC0)Wlj-}0S1T(A zMEb=_j22Mg7s*#*LXJ9_s-vTR3oxrLdDMQNL8dy0(cn2Ue>by5$$W35Yqp4t;KB{V zM%P!9Fi##JRJwLmH-f6ns}fBXc7DdY`U4WX3NBl-Xw_i3%$tL{-erg4x`OpZYYaZC z4x_pv@1)H+ObADlqf9WNo#uqIybrq4Vdm}hQs^DGpLLlmSzIXV#9v#pUn&e+tHxC< zDzvopE?oRfUE;8%6Om0A`}?s$l`)~e)Qu2kI&4QNg+TJ#%o0YhWz(Avu0qF5@m(qm zu_BBVTYGLM%B^7mSQr%KNDDD36zQ(jgm5b%=fC@+Z%K?=a;-|*OM`kRsOdP}$I-+z z=%eeT7Dk36KnYMLEh`Mk=!MR_QSU=8Pb5Xdv*iZETpar(ZDh74N61{a1RT-p#lTMl zC*dvtv_tGwenI;MvTQHz zts-^Jqlmo0gFd_r;tDgt0_x2Ho1>cE=6N4y(RtTflv^ySdC*WJGXB>Tu|RPYAF4EhKGX^YqP(vi!DE@6ed5n2yqb)GSFV)&kVgx(mz%pK z9oT!SR^8R0SPFevt{OelGuP;%V+k^FfAQ!FmecaG%zXm#^JGh<|0X_zlixL_2*_3RZ{*g zZzgV$>z0eb);;z2hu(0s&zB&7>(XrA0P9-MxX#4A zC|BiATb>|$rrf>5Fxxg)W@%(a&gS-p)zJ$?(3o9n6$~%@hNtq$_97EZPXw0l$7(o< zK6F}t&F=Xk({#;ty$qz`&{VI+M?M9g-wuKfW8GoayaBa#sl$s*%lG`Ce<8Oe+B;zG}GIu>YS_jz^_Yi?%4KDlsG_zd$9-jHoH`?&&UaUv05$#}=k)_{b z!=SFTG~#q5esrdmCJM#@NokhcUG0<7iwH~iom#!UyJ0wY{E(s45i2M(U~PSP6*5N; z?_ch8$mw_GF<2xAV%a=c@xH1WC(DlXtq0r(c*&M?vh)GP+IRTXPAt&d#V7k$wf+vP z&w13-)`699|K44)CrPqndf$tgkr9-Z_F_JwHsV8JxH8H|iU5jWN?*ZPalQ6hrG>b% zu+=xRw~jGEvA3u|?-UxZ>JThuPVbL*84}xl64k8o`PK>0xEYJd`^!CmL}G|&S#p=D zusBJ>vmlUN&8`rKP_@AOmzB}``ugZGtCdF&NTBC^A&j3S6Dyd?GlwkErH)YYuiJ1- zG%pv~$V(^5zMVRDMd*@Rv`P6`nPRW!CY3_~YL?`G?EJ0tUPw?-(Q>})qkE2&Nsbh# zrgnrKi|QiwC))+m+KXQlGpH!Zp2wq)vwxZ`&--Gf^bqCSCy?W6m8_RLoAKlKYPWRhV2GZq2>lc~Oo^d~$wW?dugXrAaXGhK7a}s8n7o)_;2ENQyU9Qx?T(at@mgR)cECz397Gjf!5p zcDYXKUo~0?@la`jSx3MqOOTTxgZt;l0JrYz;(M(Bz z9P8HowMR$@Tm|fCmwt7WV=GgYLAM=X$J)+LX3_kgqci|>9dm8BHDf1W{QR54-$d3D zJfIg<2tl!5<4Q4ijpl`)m3|2|Dej};092V&9&i_k$s@<4EKFz_7I^dM+|=$?K! zXftUHF;E3Ils`Hwe7)L>6Q?N5RQ%UcL;7!LUW{1&c&^$qbi&|QPot~|Sd2jsw{`$l zHwxThuk^;4>kp?fB|_(Y`=Cx&of zX#uziblWNP!X`q0@>$Y=1{%?PN677!ZHO^^?)Une0Bkm78kK(e75EJ#ioB$Q&UR=+ z2^%ox7qe8HMpSSQD9L!BVyRe!g$+6G2Sw3RDEhS8U=xBnth?a|*6-E|EgiVN{5Kw} z&>mHXd^vkRby-R(G@_2Z^^@DpTDe+_?AAKUcK7z??sqP&EFB^U1N0=NAy4$VGZvMV z=ZqkR82Hmax8KxHI9m9K9GS7(rloT4*!SZh6_)WF1^gMXWik@Rf#JxJ9`f|jUQAIc4gok9fof~yR7%R) z#<;LXU&w1z`VEl;<)Ni+2`#Bb^~nkcUB%5u2*-ejx^KDPLY{+XJ_`_&U)|o$emN{ zBp6HmtzSt4k!<4d*wa^YRn|^?>@iTA7tSknG*4jF2%$rcz5q1PsHI`khEaKvO-FlGEi8!9(-ej zAALnVxo1cILkLW)j+MNHc#?(w;~C+LQOVHFxGg zxxw={-CoSfmqc}{Ea-P!JVPLKMGx|t+|t1k?k^c&a-YeRwBm*HAE&(vSH6pE{L#E; z!BCI=gEz~~?kz8P(zRmJAL2p|nhM86T6Ky>fHK0(BjqCObA6=UDlRvxWs#O$PExOK zWd=$M-HVaq-uscKZS1mOk^{3{TGG)M>7ht3kKv_lt~ClFuz}r1|2|5cj2)R?xQD1A zABn@p!G?W(y%Nw18|g)*8Jm6VhyE;Z1riycuMiT=h?o1t20dlLsZGQEv@2K_|7#=X z>Lv~g)Am#L^U%~pZqgPEA#p96xB%~fei5D0B+9OZO?0UnT26O$!iLrh`P&B{x@jGB z5Y8-l@8Mt)zW8^K8ywVg3ZWrVjO#`?avF$3VO@9<5gQjgg4u)bxBhyRQz2^9{?5Ii zKLl{rrwNWMypi~lcOMJQNbjkPevB->$Mbs+e_j`$9wfRt0`3+sh;VA?vB$SQc+|pl zlbo{P*TDNwdSV0(i-;Sj1rDMJ#uT@~4`r8zfFxjlcE!qI{(wq=HOiFkpprkY`tF=< z*kOy_$*jc{lCG^<)n?n*6oOu5rft`%>zbOHx6H8p%u!b;fmj!w7gnc1_<)!Q{s}^8rR%~NOQOhk@)Y($Xv#w)SXU@y3K3qP2`c0Z*4V(B+CmmOUJH~^jtYOi(@ZRJNdOr}Pl8!UQX!O; z>ANhX5SUOCqz9$tCtbWXJyV)xt3SY6>sr&oz>=t)&3tPB>VN-RJa$#it;?QZGV*J#g8kXSG5p?cuOm%PiB<|Pl_TOXtB zH+FzHh|yq&l;{nTvW;vIIrNtvLvZ-Q@n8rq%=e8iRB(g#5v?Y_nB0YBNO2K&eV^sz z!$S)Td2q1S5|MOfl&(Ba<7I6LZ>vUsdMQ7)InYp~XVk~X}AAh6Fkr5}) zWmdWCCa1)Nh7B|VgZq*~DUyuvb1c(HF=WhlFsDc;qL)R(n-$orMK-)5XK&flM>CA@ z-I|)6n#^q5b{rQ`IZ?L$958e?bSci6tEvy1>6dD}o1F~}VkfWZ1c@4;wx6t@N_w67 zQo{9}b&;bK!1^w|`Lx;Eo)amZ&WhZK0IJa~Lr+Pqowk{tQY`_4e(kbw;2wUftuf@z z9E(n3k25YtLBLr&_MKfk;s3som|`{tm33XnS(HSeG3=}xrmKXc@g-U1<*M$YF@ku3 z1o^7r1zUz1=UPvklGq31106ATxcIC#^dAD4aB}8%dl|$=PIaH6DAtsQhGsV*T<;d6 z^mR+c1!^yeKO>{I`KtJQ52)GEVycvn{|L8g{7r9oe45Gq!y=F}|NT+7~Z0#h&@bt7g^vg8MT8^1DGKf!)p5L8!|kr{qL(tWBqVJrVIi zI^S%HfPFt)iuC*jmI&jEgoKMDEL>V2^}^?2HjN>+${}>3!j{m;MINNZdy0O9H*Cj} zM*^|0Oh0!a18av3#iuPe38kicn|2$>u5%nP5nWsu1PIr9^rO;jbJG16*tO&}7c!D@ z_KrPzaKYp>l=0}jobucXK?*Y$C=~n@!E(L!5f-cHTal2MZVu@V#mFv`@14WIT6*Es{gfqWaK101a4~Ix$f9)$-{EEAW}_2)HhndchJP;i*`)? zR>jP*j$Vni><;4FX9^C+UFpWruE2N^Vxnw}o@XEQfyWfDr-(31Q#V!a0Y`|a4fa4U z8H$txHT>pJPu|X4_;`kffzl$K_e(kGZSN&Z+AC-XwW;dhkLIzX8GO10r#3S}r{>qI zn~EB#p6_pd8=kR=zlOHOl4u0dA5;W$fBNkc-KEr+N}G>K&8MH{Z3_bz+!B|FLWyy^ zk_UTJ%5+2_1J&p0J&o~rOqom@#)cHmk7)3o0ye$)XS)1gz5ED{sJr+qcZi2r+7?l$ z(Nm?rmP3-$01?@`XNA@gQ?7w4UaHmL6mrQQ3Eke$6BCU6Dd}MuYj+IMUJ0zX2WOVb z0tnf>#9F;)1x`4qeFRZ5BwLn~u?wcxk(nQSw|g){KlJ)^r!+=8pAzfRYVDx&5#|rxUvAxh z%H3(iGf2ADVK!-qVf%gFuSxN0{PKiw>Frupj;t2cwl0$4|+ z4!KC;UGS7?y~2XIZcH-=X`vo+TEDt+M4!scBDxpX#uT`*XO;pwsa23(U_8tQ^{?Y{mDdyj5rXn)K^33BQQ{ZHnWoS>EqV1Z2Rc z+DQ|8?dkHx3Zfm!KTY+=@qcwY6kam-L3CJ?Moy3niG5x?UWPThdh<0$;yL@9MoD?K zR-;%$!(@UWNC;mb!EFzZs<(zQqWq+oA?Ecm`Ch-x>&u{7BPFQb-*C3y2s!JW(k5?F zDK@MAapp_e=0%}{SbxdO&(A;Cr<@gr1Sn9@Wsc>?lO1Y>)=CuL&-X%Jc{90QXF12* z{O-d17VJ0)%^P*p&q~rg%*;Zh6x5FpZoE=QZvWo=2={S+(vrTZz{Dcg{$!;!p6N$r zCG(8$e9lGPQ`VOgrS_`F3Kgrbt82q9?TQ&;M;A{CWu*)+<<8<0^ zFLR@8M;d9p!izrVj(T6OKQF}DvT_pAcm|2W`vXC9%N#-2nmZ{_(c+H(1DX`R*Io!! zsh2+N?%uPLMKPOiM@gWf@;vu>F<1NT2wwy9x%R}RuMGVumSXcqo91PLiOVG8x871< zw1LygzmFauI-&ZOegr*fY`0YzzaF(uiwpHI?&62ZH_b2IsvuJ@w4?-YMQscV!5fGYmY1f*FSuABC?SPx;#|M$+-@_flZjPaWPKik;WL zUd{uSpL`AWrW;xzxiS%8!^j*rK# zKTjHDWYG+NH6aoL3ylpr01YhqYuMPvrouMk*SF-KOu&}>Z1D$g#fZWHsUZg$Wi^oy z!J=R&C}g!N8lTGrW1c~c0Y^t)U(#ao?x4JSdPwNS;j^u+?TY^gC*oU80s7p1=jEcx zV`edWL<=g(f1bw!lY?oX>lTS42UM2pM%8B^ujtUPUS(>Y?-#yhew+Jd#Yx!F(Gfi` zAknp4l;*&1W4e`3i_&*7BqQ$qu=%%CfzEz?{2U>4pD1*0)u^LSf8F5xJ5_h$S+rz1 zePL~hyYQ-Kk`V6S-8cfrT(r;~xHAiCYtL;NO}HH29r|&iZ1-MWU1b|)Kz$3*p$MMO?a;f_6-c}#J)E)9UEgv68AGVBE z1k)h>H5?f^Ivbl9K0K0%1St{GGI`(KE4%rP0mF{B$qCQylGMvF#^qoPk#41i`pS-T zhSBdwRG|4rJJxVAF`JbYmZ~ujFEL<8NmK*U4DrzYhnwG@d2^obZZxbb4qdhBaVu_G zRx?9^HTVesLh5HYQdbJmaIQ~3LLK?>WTa^NvKMnQc<}VZ57_+!L@yr~7Z=?#2G$?2 zUo4UA$*+9!H@us?HNi&st|le^h7S}C>K2VUrpw$ULcUo|O-+JFZ5KkxIn9&%3#uQN zmkSH2|Li0Di%(%W1&|ha+`JB-HMvQF<5FP;)4+9g+JOH?%Yn$>;rc+GC0P~)#0q;- zd@8wo23g?X=Ny4vG{_bX;zT)jFH*^$)Yv?jEB~s?5_Ny?q0W%(SgCPXl3jJ%{Vw~2 zbzQq#pnh?QnqI(IBZKL0U9bklViHL}1ZMciJ zd57eUUJ~s}9&;O(kHu`;$5do51UxOi{;h)fwOCzQMsx!UD+}T!GwIARN>8dIS2^eW zm$x}t?iZ}xuY4sw-BAKTzZY-bW)f6Mse5DIKZKz$W9Fe0wx?mr<@V=W z65lk+EjS6&($XMlF-kJ~IWBs8>Bq;FY(oy%AY(rhy1#ZsjY%Ni{9Ml*{BywggBizt zvjXGgqY1-h*u|k^L5DJK{(5Mhv?)4Xvo(Hb5I>j01}BOoky4DO|0V+%sBehOGJMDKJ>c*KU{c6{|{On!cnBb;&JgxorswRFE!Jr^*a8Q(q#Q5Ij=X8ymTcnVq`|Im#*OndO zGPNx{efI!7T->jg5f+RmdNwL9%4d`4p?6T}U<56Q1m>7>0!Abw zb1yj=htKb&BP}}{=h{;*N6_a%dGNrPtrGjT(c1K!E~bq%pED zQ&UNozxm9}?#rk-`s^Z2D4IIG;Jq!)~`&D$d2-5TCBX0KGJ01Q~cO7 za%<;vCaq%DolgBCHc&i>t?&Vp^pdbX>PkE&2R=oT@%|CvAxGVW`KYgt%gD$$B^$0> zf0jPsy<58X?X`IM_~~kJH#;zieVU0ldS2o`JKc$(g%}Cf8dGi=cm22*-Mo%Ye>{%( zI3U!i+C>HAaYkC2^5x|v(#xJ{|z@^WXOumB%|aC38; zmZ@dHMXevYz87-(w5_OL=395RVSw>Btp57sd6mTnL20zV-(-MtXXrwcdFDxd-o@aj zDZ4o!wCBD)?ae(rv_&c@fP#a>aX~%qlc?cA>18*vG5X&bOXm-_mKv?yj~nOvcXx{u z47ATHhDhIwo4!=dG`{w|CnADVk_itsr+7+m{x6dGyyGcgKpeqF=s{C1ZL;xcn5Mo= zCR*#GyY-*V>b2{qEP9%3D=I6e78dZIr^uc$^gW6s0ncNFa*B81TID&7IbDs9oQB85 zpt7;C8G#rbw`ym?ehfd`HJiNl4h{~cA^n8rz<$-~W!@P#%O zPk1f{o|YGFes%afa)*Q0Uv8QKfj$NRL97F%8%9UY|^;dgI4ufE>hJX9K6)Pv0FG$NJ_N#-5?z0P59Xeq&fQf+Mh zeS6!4A$R1J>&L^y(s7I=@A1n~{lvu%a4PX6nm)mrb$U7Dj}Q$bhX1sa=mIr6$-9nj zu>6z(1&ZUp2$zuW{&k(@*VS6fw%KMUj0+mL070bw=Q^n{SSS%_q{tA87B!}y-h!{{ z^gGB+w%v1f%@X;_%0R+)-wm)j7O89|Cnv+y|NcVydm!;qOs!m9r?W=Z&-ZWwb>h;( zvyBodq|)HPmG9NX+WInnyG`C-2o=M_{&&CapO)Cee=o98-UNSi=o~d0a6Sz!ZI(RE zZ8g-j0cYme`<%V05}{{H51_aImEe9RW4Zgg=W(M%MMYt+yRawzoXqvRorpF zQ5rcucJu9Z>U`~LoMUin=Y~ZzrhzaDw|oDZ1eQBk1QtxG68Y0bZ-%`xQJcergn{f~ z>3F&MEk*=D6MRov_dx!D9{*xt28Xr;z6h|u|B?}6A7!=NRIrm6(mTo_Yxjy~yIj?@ zyd2Iwj1)s$Figs8H2a@l97xt(vV_Tv{KNCH>n(NC@W~7&OfS2)Jy!i1o0>x9X$pX1 zObtrvx|67aIuKD(;D_|aOX6O*ouoBua9BMcl*B=88929Rldam=;s-|XYE^z+6}0}_ z3;2)7DTJvvs;^YDMs`cpm@1LPo|b^h_)?)vmv-#B{P?sdRLx@0wX!GrAc7Hk>+N-T zr!fcgf$x8*w~nb1Z=`-CJ|b&s^!17wt@gF#|-6X6&T*4 zM(Bnd^7MMlJN|jC&E=3A#GmXXEAVhHMWxVpfBE7#a;r0QmSc(k#TB_x2X)8s9VK$k zUhBR03rE%A)9%g9P4MCM4`{}spMn3uQRGqO;oG<3T~wl0&CMLK+b`lYiI2(KLvfii zCk-t#tyC=f9n!#+kdcwW2#*di&t3tyN5%pM$ikiacmTQpPYWSvmI}#8WCuRJN_*44-UbAD8XQ1kSskn zN|4-u%KY%}mwCJSC%wLf6P=U+put=$)SA@kvT%SpQg2XhKlV+QXbT(u{!694s6?{p zwG{%K`Z9QL*w5VU$Wj6KUvn3XHw+CFdR7#tE-D0W-LcmylsV@5`W?utWZUJhz*A@P ze2y&FtVV(jI?oGztOB)E2M46rHZ+L;J)i>c5Wtru=B#jlpp&LA)2YNo>AU+vyQ=Cs zWFBArWy3o?SK?a%h(X02PjN|!P)A)IrQSRa0CjqsY>`T6Qc_a>bf$H6 ze~zYphl9cQ=`Y?H92$y=h(M$#*;_wtTRUxT(h1X@H=}?JL6almv-%s8-jnD@m0${3 zUVB@9Ho>Vet#rRe+t07#4-cM05EK?{BzETmwd#2sgy>CQMTM2rPUqG zY{l@bp*PuPe(pFA&B);MChqV46KjWEJ_MRr{BxnVFe{3_ZOr7Y1&7 zt}5oEEdEv#a4IwM!Lwurqe$gv4U?Q%eaI&PrDv_7Cgxn)c-QH|zmzH;LyQjXSptND z2|Ki3x91+0(fhPhlHja6*~D}c#2VpN)y6f-(=JryN)NXDG`L8 zM;Jz~pYg}pEElu--H%XqjXHLh(A*?K&_P)OUbqtiw^;yZyaI#+#36^^!?wYx0;xqv zbZ($pu9cfD45)URC6DW0f~jEqkbtLrMXB1WJ8Ux(+0q0eUoJ5*(R8_KllRSAAC4n8 zr<)i^e-`J5KTeyC^ZEtK?c~8}i7L-euI+j%If0PUPe023E0Upuiv7hj;b}eow#x+b zmpK#o=|D5EtyW_o0Qv~Xe<3zyQ#Q(n>dj+g1-q4U{US9m*%Ai06|gQa!l42_hig6* z+;n~q>z{PMOfQ|HzRVXu_mMeCy=CkaE(PhCiEBNR)-dT*z(ljr`o=kJDF{Y z5;2M`>ui^Sq;J(_QJqMg>1>bg`h+TG5#j+*Za$X-?8PR9_4{$R;3O5@PS50IvoQ~q z9EY}5;~GlJ@9vyNfAPlTBtBSj{Y5q(E^oD#dC0-{2j>_WL_w7=)`TyXDwa%$l(}A4 zN9St~{g!|=(Md7{9Xd5B|5&so+R@uvH)+Hynd+h8%K_D@VyZOywI$vayy{bMSlJn$TGE@7Y%V%}` zuNH+4<_L?+OoJw_wHV&nB3<5}pF3=N_;hkfVoNDOqj!mj|3{xf@*)Fq`BZGmXfRb3#n!QE^@OyP4CM z{3bx#{i{L%odm~r(Y{)|)v8oP5Wv=PcuhNG~$cFm+VfDIwv-Q1>x!T;%jZLlbalh+r zRUwLHRqA%QC-6@cG&XWw@GJ4Z+-=hVCXjg>=Ux?drxr{(H*fs^U6~Ih!M?v=mcdn^ z85F>(6;@e$eeL3?HxI-x@lZa{8zt*r^ijx9BO$?;y z;ZLChce@;l^dEZ?vSk*``$6Vb|FK>%5A0zBU2$O?G#NW z+!(uNYha8D;B%W>!PK`4SSLDt%4KSQ0Am1>n+qSw`EKUtNaI=yFojya@`H%xaNPUV zSo&}>Ej&k;Imw=DaId_qIJ zyI~Vgq3W8ixr9x%Qj*_(ecih`UM9JN&V=fLp!fo<@qC!E+J1xEb7FqAK9nNswRFx3 z|09MShw?_v{Ci^(bL@@5r@;Q!u(Y;^LJ1Oyey z*JV%pkpc{hku5d*8Il$xG@xAJ>0l07sMdXSpV~wq7uT(V_YMgE;m{_@o%ud_WJeKL zYjn6#fJPq;bfvOIo5;C2^+rJIY>Coia#O&EE|=BU*DsDw|64+Axa9zy&)C>l6elV@ zv0`?+>JVQX)_#3DZdG3vQ0piVFvz6=U*m@&&Oi(aY2;^u&2(x|khM92qAe+`P2;&Z zeh@5fECicrK|-LQrid))00qEZw)X=I@&5OOH+(rkRnC*BqC-v_GH6v-8*qLqvhF#- zYM8QRUOG`#`3}nHUu*}E;0ef~lZ;bTc0(Y(Em}-3@6C(EYv`T^odhp(MWtqiYiL?MP-XWEMi z4~v3N?YTS$mv0OwgMtW$hRNb(pA;19Y*^01SBL!3b;=0Ob}?k^O_Ms_$GR9)H{`=? zg^FdjnkhS@@_N)|yFLdJcNHtl{Bz~Nce52xrYC?N{~?WqcrLRBJ>LPVjUC){IG5y3G2 zf>erskH?@;DB^#bD$_;htI-*M;|NE?&Sw^1gmmqJu8X-#~;*INy4c@-Lc*E-UhC3s+xC%U#e%DLtt%*{6K=U_%7sK)fs&IH6O5^B2&Talx7QmQ z)k;?#Fh2hcK*_ET49TUdc8MyH0O88a|3d`;NQb8{0!}zS z93H1+33B=9%3fp4yC_inxE(8;Za^mHSe^vP{CN;5ExPw2$P-Rd62TBN=Wlt3xNKjGN_4nJlW{`QK{a1XbGo7M2*1|mL~>fO z-tTD*lO2m%HXCp!;H*28Xn5x;zyu3>U;Y*!n6z*Q(7_XtEdBRU=c_*-Y;0^M0pXkt z5E`u-GnS%A`f@l?0Ok*%fWKg%Fo{!8kcBTh7Co`|E#oDIxtoqG&jAK@88%MPU-gA- z*4@IzHiHJK6`Dp4i#vjSiclyS!lY;!AzWbBIq`)GPLd3A#vFqcD5qJtF z-{Ms|5H+LOZrCToRt%=X?!xM)8K07je&f$CUjXUKp0MP*e zFP#l#n;vvOHl{Gdso)8qhJl5Jv|&?rw<5mf%Or7d5q4#DwW?rln3?uF3e!0kGfDbT z^sk@Q#f5s&bN~TzGYHM6xlR)y%Zl|XoW@M+%& zM8-vv4Q=nT@iV+J8B7z;sfQFneecCvqj(1{KOiz5ik*3AI7@r?i+G8Cp|7C^ePCiB z_MO9dS&xC?2Hq+ zTl=8$oN(4!HcvXVDKo*qjeNiBbh-0IeH5tx;gVB+nWmzjtJP(3BkpOJrFS^|#SDxT z{JA^db_NcFzo{`aG&KD7GF%&I=(hvIFf%iM=+rN=ekJcO*^! zAycGgs}lgQ?=2!QOosnMivau5gqP0&Uy0O%n2c2uF#iW)^~AIdOs3=@3e^fk?zdbOD=mRUnF=;;%fRr7`D0#wZTDHS z!*d0{J%NG>JL9e>w+a6{Hnww~s>2LG&VT|~7N?Mq(%yJ>flg)9VX70g5jah%!7X^t zgOh_p3@FQ-+}x5NHSSEm-b>RDvWS7*G@O?0=)VepnSiyxAGAmV-cVAsaT~Koh~8I| z^xn=#eZ2X@X`6_qSt!An0u+cKVl3x`vsfj9yjO47HTnt>wz2OZqxDQOFwq(nbrM}) zzKK_4_MUjF2uv;T&2`UBA7#JR8rzln5OQ>RqkJ%y1Zf`zvFIFs=-wMY>}oO(g!PrK z$WzYOH|yQkG#Qm2E!>vkWs6zvCMR1yqT|cb!p=^EOYl4Yrb-LsNM>53L^$9}!4(-o0F z%tixFoi%Se`QI$SEgq~$aCGwb{srDx1=4{Tshl3P%DDtn<*Q@cym9r$7fu5s}ys-3_b(5%}O4;O%tzojRh@W_^pxsHV+6Kp;p;o%Bh(DPWF690#!l$2f0M(Ly~up`EjB%2%eo@5;hd1ZHs*g2s1C0 zq#!yf9gTa*i9XoEjk25ST zRWLA)!~-*Kd^BGfKL{JCD*AmCpVnzytdRKm#GN?F4v3vSxk(<0DYGm2Cq zbm!H9c-BrCXw{9K|Mlw*?PUY)F2@!h`W3lUqulxB$>V~*`t!S;7$Tm#v&}w^NRPE^ zek^k6vaV{@lS94({H^2Zzn#@5f~dDgD?ePSIBsKKjP|@tOlf<+R@Gg6JTK2N&tjP3 zM2Vc@xObc6f<1**ohV)-^r7$f+r-qEy(m0{Ya%I{Ooa$%S+$=X^>(m_6O;<#vh~|T z#Pt!<$C@U`$d?SEGPvgMm@~%2O0fcwOZ}GKw?7W=9@^KxH{1E3eO~b;syxQ!-@jg0 zdb$UWAJC%0beswztl$gT7g>@(u-;+|E8HK(1n_AwE03jYsHXBiYn*KJ|kT?e;8 zg1ZEF4elhkySux)Cb+x1ySoGk5Ih8j;C}o4s_yTZnyS;&z0cWeJ$v<-+t;y6E}*3C zk2v{S-n01{w*nTI=C$d)INj7I)9z{m30MYVx`yNebhZH^^F7G1NCNO^^7F}A6$3>* zA9X+@niTt@0k^=`gA5j~^BH+Hi(Cu`%EcUu@!|f1h|Gl2TXAt6qQ8)8sKCERjH4?V zbGSKyXBcKOFXVuh_iwLXZo1lEXEki??ZoH_`m&&}{f{3Z6Uw4J4WI|68Pl3W^8vC) zjAS5O?XvfUIY+>YeX<82T-I7wp&J-b#oMzNZ@L}bU~rLOt=l#R!Njms*!DgxMe9!Z zb^KCLpKJF&`?mo*7ONm%94#qdltpRfQ0Vx}3)k*kwU~%GDWA$&} zaZ*!DjSfiX%$uajmQx3i~nD zVv6SXxjUhwFW0mG`J=nvBE%3;$ZZ0shHum4_uv-fTq=zYyw5sAW(L}@Bn9k*P?>Atqg9KC{#bpCiJJ_r-P zC3eQATu2g`K^A!6B`0OPRFAobRs(@egLVy58jF>i%@<@rD-<3R(Ho`p^Bpfk%V5mi zhp4iRQ9R%eN8-VhBgA^A0Jts%Q z;O#^UH?UwdL0n4~BS~9F2U85e>FwDKV25J?C8&ABZpeu^Y3eZg$@T*O>#E?cY(gjo zXC#q?U(EYbz_SB-0E`ic&h#cz_#Y@YV6W*>I^hlMFYtjPG@Ou6?$Y}a`Z(U9G^rxD z$_}=Qa4FF?Nk&3YKJ#S^*sKj|@B5NnP4xDJS(UJ7Y#(Nn_fSZAd}f*KaIQ(ck43HvukG|s)T@c7?=zdJoY(8eS&vr+$(S4M zV^@+xou7C?JvKuS6pzSPa5Uv7>k_aHY)kBl(0(qTg<>8@nQ-v1()`DL_PX~klRND* z_q#(52zj6<5y)y#e0B^G}wACD38Qv5FjN&22F0wZ?j^E4tTk zY2kuz2b}VrZ_^`VMT<1Yrq?)sH=VlsI!^VpGw=l>l1jFyLGpb-{}SYAOd9u=SmY`v zaP`ED&o?hW6VAiK*LoCD3C1wh_`~xk6S{(;pDOMzKdwP^5sR$4h{7_Wych~G9?9yj ziq}tTy;JV4=NP3M;z}@bsUW6yOr4ppvT4u(4c~S)+(RXOopbXMS*9o)A}^n@aP0m( zX8-U>?kAMoID}0WYI&M^)slp1R)=v7*H7JF9WJy0(6+{B-c9&zB^(l>_i4t#*vTo0 zhK2?JPWg2Im=O{aAIO!koB8ypwDttkrVj3^9V!&SMCH!HF=`X82703s6}MslPUe;t16HsVP$SoL*ft_oDe!vY1q^AV4+3O zKtWE|6}rhs@MVq{R^R6jEIh4@c^5sl7graxeCp=Tn?c2bt8muEu*`u9FIU>bEaM?22+_ac-lxzEQOtqlJc}Ss8n1(;9M9;d!dM92ZfKkQN$nPI%@t#qJ5Rs*sT)g)J;vryK z@scJfOz$#2uTY9xt`VXwDxQIIhI6RkuXC7`_Fh;%uodU>Mt(i(8vL546+K=+p;4RS z6WD6nDpsvf@aWq5&Q=N^7#CzSJhKkHjHXX+6&X#A|jWbm2@6W66EdgKPrCW4IrXM*kHe681 za{bBTuZ0w969U_H4@z?3KaYNjMdhM$VfZ>jEQ=)M{z0AN+nQ1^GKScQjRX=ASENEYPu!0(>2d^X)+}g>%84A zFG+vx1QYM)da`Yy8}ZjO+se|vcivw9brJ8IeedtJ4a_tzRc6{Y48zTWvdPbrlatYG z;r}_&E7l9s(L9%3LwsySC^VOSAZld9C)T zbd35f2w+y*-ZS!e3p@3$~Xu!2-9hKunN!wOm;H7AgnPTN7zv{^K5 zSy^6n;lJ&#CX*!yjI{omySxrZ)$gcS3L9(!zuM8^AI^t8r1FNhd+)*e{x=%Us~Z)~ zyPuC&-%c-&E625|TCgNwZoRohw``S?&F$Ro_9ky{Iaf~IzP39C;o;-62?%r_mpiG$ zfe;`Ra|NORC7TsxMtg09G^6)!G z+JbbL&4pofHNwza?t>Kib+Js$w!N$Q)ekRGnX(l>>xRMmxG8Aw`t!d)vy_eqW&6#) zOAFg-AWe4D4?PYC34eJX*ay{09n+t(C0d%6k3>CBV(oum`C*B@K7S0h6S#vjv6 zOx2d{`v811ie5zR=P$50n3}EtsJ$s*%0WXLjJC_%kuncI7 z@3n9UGF)v<$La{LDa^s;;xuV}{Yr;2P{D zPsfk9$G?xzyy?WFWqn_sBI5be4D*^+|P1`4dTy+AM~H3v-@0yI3mxMW)!AT%xhJt3Fb%_ z`uibjYHA?Y`BYZ1=1Qd!d>$@JV(?iOPwVEqj)Nn1gO%2a%g)TnE=C2@iGfb;>?wEck&G?byELK#^SDGnHRF9gal zvb!uX0j|oLM7sVYKI&-&NpRZNDQy+pr#u3 zqt0aih%>dkXo+yvdE)*CKabr2fm>={qa738`Sm!>GQ<<=z>+g`>pQ}w2YGYk0w1kT zKf50E2?%+06vgu0y9+Z#92nMxcQ_dr(Wi*<)D-GUx3^p)8}o`4Fl;f#Xq6j@Xf72B z-(yXRvLRY~_~*2zl`;dlD@ieDiAq7Ly~6yQe-FcatdYB$xuR+ligdBlF3t}07%Kh>-c}hlTBUEAEgQfGec18 zPtEG9bqNW-`S~&-ME0nGzdLjnTRuEO95-y6;%!FN{0KudYZL@#rnzz#)Kn(39s)8A ze(Ond3u!&KdkCq%Aft3B>3Yvyt-;`3SP_vl(O+1J(en6Ym>W=J%Fw~u>k_80Zg59Z zq(U{B)|7=RiEfCYC-{G@@pt5cG5#2T?_@q?#($WFL^03I9e|O#Qr-vA+{YVsa|fre zyz$6V zF62D0RrWmY#rO|f=rLr`5kNap`Z%4`AA4xS`<*PIO30Q3GZm?M9_)xe-Y$7 z=MctfCns3HX42&aAC5R?&uL2KwRL8Ts3Vn9>@&Iyvb?B@V_V??wN4uM8b#`$06 zyV~dEQuipv)oihS{_o(~83U2FjVPQ-rAr!mZ)*$Vy#mD&HF0>7hqJwrm}N`O`i2Hk zi@DsAr>Cby#QgkZL-X%Heo)bV2TnJPU}TIQ_whi5&!k&LnFvivew`DM2mmbCrf@lW zWFZ_U zcYl5xrVlfHj6ejhRkm{7o}-k6RgL~4ao+0bv&LcK?@uNp%Q|3+1*fb}wiB_C`Qz8y zqB-UN@WEu5^pMZ8XrDrY&r<8*6&8*KGVecIGTWNm5?jCJkW zlIq$DKjRt&!3C1NUqx75G9DAD5QSsYD((Py0z@Fbfp1cE3nx1})ba5G2n7klX$Gp6 zJNjY^IK!8BzmNAVC#BFJb7YV64(z=3 zn@@dph3E=qFbUJIZt819Tfv6or4RLVT}6v7`i}0akCQ{>~=`_1&Fk1jBAzxz7)) zt_Iw}oOsPYzvqtRSFGBc$KWqmxA;ctvuv&Uy*@hqC%uZfBjCE;{;;odHLWQDa!~*x zlAQ9w^|PBJxzRYgK|JVycnLV$?zBor?RzOVqL%W*TNk zQshZ%`qLZtoA9Qo%b0%!xnXd_vDZY3Q{zKQUvQ-$Ws6ICl4ZOyo3iNEJ0tBC3b>e3 z+BZtR-`yVF^vZsJ=TB=Z-!+vbt`#gm>w=2#`edry63|TgwfmQ&+S5A3;cU5gKM3x6 z;Q1S9ohMSWCW@^0R;j(Q9RsH$pvS595d6Y8aL<@U4_CEfO|q_tI5C7y%o_->X-ELF z0q~xZjL%og4`=)T-Ozw>61JR`_3NA)XkZ9A(9IQpr~;Q2>aOnXwCnNn8sYE@+GaxC z*)#japMB6T5R4mSq&UpdH%Ay`F?t(T;~!u|u8_#B3h*n1`bk1k1&;#gch7^j3-+JP z!~pb}ZplsOulUoM%V%LT=B&rPI)6l^z&`SGPGM4gnrE|UIe3JcyXiq#FKEo~NdCxAZX+WZ24UFQ)1M<#R&8HQKN8gd^UQ9;4@X2Xc`R$6x&EL{*L4i2M#^q?usQDRG*p!UGeI zw7TDnnC^25{Xr9>aCS)G-&Um#W3A-yzewMfJJ8Ga%p%2);Bv z{w~vKCBf;C2$SeeeY#2PQZyB6+>eJ8!{*x5?0^kuep4$4bNL>1^bNfZzOL-Z=GAf( zRws+2hUR)y_YQ(}usje0jKxe^Efao-c^F9;q=HJa;A1?V%Yb z#7NOrcD`q!zQ=+)U>ntZylCUGTrv((|%IIq>3MnF5rv|RK zMa_mxT8Jj6CKa&y={z**Gb*3bw5NIOCbarP<+a~oD#R-GNAeLF+1+2(4ZXY`mnyTI zYN%Iee%T9!9_NGyz@Q&~r=I{iQ$;3i81Rbf+uLO-kP4%`d-P$IFjj09Y-jC_rrVdB?@EZyJ@y%ERHLk)vx(8!zhnRfewQ-s>vwGeo*UZsy8R@o7J zqDqc0SJJdP@zfbsc@=pJPmYb8_@TkaJFgVQI+;7TT0?K4ph`46=JZxyO@@_BI92Y3 zO#9kF;QQ*#B>~L#Xk7Wov2sf4b#{5Lp&3d8^}g8=l|iorBA|! z|75?T6a>jiWNt6}B0jclVQwC5Qfrd>7hb{?VDByc-*57M0OXrm-RjKXpxEH_#OSEh z;<>w(tE+3JYK4F4(t4)hl*FP)P@+=gz*nvB5khyz;S`f#CY3&W{@)3Y->?TLdRM@l)3%Q*ykOsQySBn^X;}ECTN)2UU^^Omiez z_~81~ku0BbbP0N~8Rlcr-^ai7MQ6KS>9| z#dO0w&|Nqp(Cg+A6>4x0WFc5CP7jt5d1&Q0c7_;_jidaELz}J5mi95JxxDy*qx2F8 z$+*IP+Fr4C3(5Mhx3W4e0UB_LWscD`uN#XMSvju9)iUVwDMj1OFFe#sS>9KZ8z?7Zx{en}2+IP7y zYN6)0!8Xo+t?GA(Cpau;MWH$C4gxLk)G1W3zOn@iA{|nX_`X@^t{5-|7$t>V9#AF> zMz=eSWI66GI3x`Q`q@fMb=$LHW9OEWzaEj zTpl)HM}AKIb(jA#h}-hDK&}No>naDGY+0;bETQ%c7aJ`w1c~rz`AD8!Aa4$Yjmr;f z%y0?vN9vDMCbP_^97syFY`=t>r(WSiSO`mp!2JjEqKVe>B`;REm}j$0RM|@jR?mT> z&uJ!2Cf)rx>;AeBFWe9R(1TtSQsg&(#hj0lfW?8zNr<|gKQuHX6ss;fEFxWj3Jr0# z*}?I=2~wjL8^LNsT&VbyO$SCHYqI#OmS>Mcc{y+`_;@zUvL|!I%-IDU$Ysd=J2A-! ziVWGmNB+Q%wOw|-;*+YrcrNNep+n15LBA!;emG*D~J(MffT%?4Ad%$@_LPI6YE)9t3xUF&UivbLQzqiLr?|iD5;j%}7mMWI2iKpU^-)r*ejpTn4;_M0$VVQt{hD|oDcbq&ZMqLNbw$q^b z{yz&KW=;NtZhJvd%B2nFm+K!1TSQo6Ib&}+J@U)LnqBm^eg*~r8P`orz=EskvtviDaDj`I@ zQv>QY5i!nJ5&6^;XV(WQ3K`->4tf~jiL$oCoRzanmGo=vbAUn9L?of zm=cE5=6X_o*9=OTo1Og!(9@;z2qp^2^wvf4alk^qi39U2@E*jYv>twtZ624RRU8P7 zFnbt`F!V5=KGLNUaM;m5a@M{KFrMKBwu8x)smC`b(@G!Xan+(L*uYKm(}FT$VGN;h zvaIUwZ`Ih496wa2`&EuYkn=pH6@Oi+R1*8X%7yLJ=T%R&iG>QFB8mmWv-={-6+%EB z6mPgM`9^Mco{$h66cWH$_aI&L`}>-$7V);exO1M|&B$$(c?4$H6|JE~?WmMOu)?95 zwjwX$4*_B+Fk>>`)_Yg87zF6S(2Xu&UvHg*ty=Ezafg<*$&MO8tFY&kONQwxd)UEl z^Cf-IARBb_z*(kJb{CScw=oP2fGzV*OlemWJg~o-j8% z&mk&Ttabjp+@dLePMsPx;LTstH8#fPu=IVqTdmkQU%cKQbJ`n@vb2TmziO%TtI0IQ zdjk3=suoy>Qkvh?2(-1MS>7x!^gUo$SB0pCLhed%Vfb! ztFk>}p)PlvkktGL`^QjPy#f~$0FBn?k}ske<{rLJq$pJjMyS0wfHV&Kcj}3g)VaWo z3Ym*d53fpwZ>!GXj zj)xHH6uYxK;B$2>m|*y_+$v<*K1(+nP-9@qYm@=Iq$`;B6%g}TKYvDo@C5pazZGS< zg*NG|ycVb}y8f-pz_H_3To0&7`Zw<>{c;BL?XeUkrJ<=M4Ep&8E2*s?)Y9pO%CUM- zE~FlmUX7x%s@2$|AcW)GZdOQM%+`wnVZZ#|#Z%MN1y_V*XCFtCK3TR^zshC@n6r>o==2Y>mlXf!_TySA^Chs7-&qSbM_b+HF zWMzz0YGWBWzIjFswqXH&Ib3Os1b2=aNsJ_G)Jn0`JhN`3STpA03HH`C6<=$h$#K3M z$^;Qy&RwoT9?odlBEt=sL!`2E(QqJ~RxsDESc|?G@j4$M{0G5$zg~|aW8y&!B~eNL zhus0;3*;s!@?~F`14h*eE5ye(llgu+6t7nNSDW*tYJ$4le*>fLLSc49J}SrD0^0T5 z8E^+gX@lReexr+%BeELt*7ZU_q*Stu+fA6_(jLy{LSZ%=|5cz?5cQ0fm=KYaT{9e+ z+_mPFk*T26W+lH~8&h-Fgdv|S9JwO)mzQJ5*zEF^n9V`>`elk0^J@1rW~l0eVfW1& zmTZKV&`-8PG116Yu2KKcLF*?7A*p{9628q%-CRCBPOU3z7|Y!d`Q7lJs6hJ*DGEAD z+GNG^?Mp$XEgLv_S0P!sC|3?->E?zj69zSaZ+0X*td0c{2n~-01D61Rb{CHHG=Gpd zj+R7ki7$E!O!Dj*D>bTk>(4PrzdwTQ8>E#_xkb|Z1&bHMY;8>KyQFsuR0x_(mF-V= z@P7S-jF|Qafrom+TuVntkA=s@xYQXwZ?*c9FIrBEROLAQ#%cM3wyX+$52sjZ#B?|) z8V19ki=-<9MZS_*PV;vVj>K#-rT?+bfDZ?wj%O1BH2pOb#gchRE}d!dc>PqSUw*0b zMT?nK$U`xQ0gUoLJ=9brV##}*^CI!^46Bm-0%KG(F#q*a4%tA?Mnb;+>1B31DP3z1 zmT27s9(bC|>h>>MPIhJ{x#{eW$wfK{xUw$K-7tJs4i4;Yo3;&@K<~5HBC`!XIzkPd zhUbU3m(vR&S*)|n%`o)ySI&#-ZZhaC%)~F<>H|5S3ARFajQ>@!d!)9giSphBLqlF+ zw`}VKef6dw5pf!2T?+~ebi(M5$}m32A2?7Tcl=Zn!vYbyL<$p22`}p9tyS@pyxJWM z<})#kp{yc3D-m<K0bmCfrB9Q6CcDh{6x3s^K<^rQaze$PhzCFV2I{} zG6DuCtX&;7NudWn>nJxoNjlqF)&9UwHec6E=)LJE4}XE}>4!sZYN?CIC^%p&i4t%Z zH2(D@P=jfWcmaC|m?m)q{P{`t!EuogwoM2QHV`*)Med{q)+Hy@>Gs2=3nhej4aKI% z6ky`69kDhvFhLJ^K^&({M7#ZPZ9kfMS$jiULF9I3=`%u;9Mq@Y6$!DZ=esieRD-aL zIf+JYct$87^QW+q9s>3`Ol22l-#w}EIXn)DF{=lsNbO38n66x4g7sMvGFyg5e&p6v z#E(Vm1v0(R6NGn-p{z{u*zU?7byYH&`%5d7UBL`(OBenwKTu-%XY2?+YyyD@`hT_{ zM+*90PgjBw`3d5`XTrL}9iv~M8VR}JqnfjVUDSiaoB>A$C zhwMIi4bZ^=G&picfTd$utdb}it)N>S()uAxOHG8;kN!#RCdL&8w~B1+3+#VHu&09{g3tz%-MxGPbb-@vCXJnXhZp^So6O5|LGU@LC^)v1>5qj!Nf{ z7{^;O5&(E^T8>R<8#*`;=B>Z8+UM{E>JC&a-EsZietS5Kxg(}mm3$CF;6VZo)(e+T zTtwlk1_3$1aQ|7CPigYFE9q*itwio~z+2zx5lf5SS{(Z26XU&Ge8I1pauW1)G7CZN ziu$Sd>UO#LM2>(@B;&K$iAM@_E6`oL7f(8bv(EnI8tn|?(CD9xwRVCqNU&qU*)L#Ae~gHqF2d3bhJ_B3cEQT>ALUg?!7Vj%Ye69kL4b9AQq!Dq2(mH>~frK!8@+rj6}q z@$sRu-$)v@c!sX7IKZ?$7GfEp)~buGH8!a)b_R3zVfS5yQXdDq1c-=m?B&59Bz=uR zm?K(m)(3LMaz1BOx$NJMMW5Kml=;h2<#wXD2&UO&Dj+?7_cO|P`h zMdmUML-|8#FKC>vu`c(^{p>UOKs?lpIAEC=20yYk`u;wcFAvN@ViSyUF#BC#uT!S6 zH`AC(>5{0R$IV=Ew8)okW0*l3Edjb2+o6hAxD7LQ{4IUUzZ&rM=q9J8I5XCG>%^`i z`#g1_6|C=FaC7mCy$9_M?&_-FNucit=e_Vvkg=MvyQTDaX(PYBaQ`*q?SmWrNSK&_ zK(uSC*IEwHt|e+$5uBAdox1V7%T%;K>OPL%1EqSR_I-ZG_?(c9&Hn<=9|k8;HHU7G z^kWDSELv!mD(_(pu+L8wqw(!|bWz8W#VrRx%S^+Cy5TIR(T9B0EFz%Dx(Q>T>ai{=1dXC7?Wn1d^^)y}p@)!6<+h4~(LIDCW{qSEvsr+7(EYCM%mRX)Nd!_J$THt-@<0Bca)L;i4=0 zqHXX;C?A*pjD>~F`Fc>w6%dzFg+@pBv+u-rj4U(Nr__bTKM!W%-W{Ga zjLHhOV1lYvkNMfS>@o!%mPVBKuHe6>DNl1PVazF!CLF8lSd1_vDT9jSS-rL2%WtKY z+ft2f+2gd<3|pO%g<8%>MgNq7&&; z{fA9@1gE$@u}P6ke)b=3(>KNx3^-9rG9s?6etc$Bf4j#Wli8%&ffs#=DkE|mJDoO0 zb+eA~qgB;Mmb)O4f6^2}>r1=t;H6uXQbZcQu8gGl^H~#YU>XFuG3-MmeZ5ob!@5T3 zJ2v(*bM0}S+L<%w=8#o3W)okmPOVabGn?_x3ah~@=4tw`?r_xGi^reb#uQ1^ST4m#cyHDw+6SguZ?}JhCKrs~B zu}4Qk9!D??-~PxZ-6B*$P_YsVviuV>VmiDwoLZ#G#Z#M6esa^NgEn?w6ml4puP=6v z1jWiElv=lDR_(06M3Uqs-f$o(&Gb0Gt=~w5{nqCYRheS!mtwS4wx7IV8N#c!;6rB) zkm)Z>_(+cpUh$|Fg|2WEm7r8&J0K!Dnx#mEatubnF15l+P!tN>@R%)3mZ7-k7k=N~ zdI*;5Cd9zR%&PngW5uE-m1tI5z{BOe*1(CLc!-%uss_b0ccpWby+6hf}GhaLX0 zkpAoO_OkuqhlGNH8OtVv6*3G`r$@9-L#j-JS&<8lmQ4ih<7*0Th?i{)d6&f~wnfC* z;|tm>oa$)Xyjhj_uH0^S_?V#FJM`f`pa?`)%rb*)pb{_elh!?Nd|CI5x3@g~^V>R* z-<9i=Oac|2RW2ry)P8W7)~b~}=c#f@eJ8a*-ddhvU<_4--A&l4`)B;5hH92Y&lYMZf%J><~Votn1XKY&gILX~xZgM*`ZHVr|y9f#Gm z>zg;wnOoV}#U&np1`r821Qeay!fiYMoz#nN;3w_`RVL{e2tegp43;Z4AgiBji+I4m;0{tI`qz=i)3K{4n+`J@3Oc$^ zk+eD59umaReuA(f5TC-y!=n{lbW?H1!}s+hN6L_AN{~Vp<)no$T=$DD3CZyEUx-#T zbi)lxYz}c$1s(=a9jk7=C1K2GHhKw}a_EqF$Cf#r>8$omC_%k}aFWsQBtuA8jN}6) zX#1~n@JDzXylw5lt4A4*?*5P&_*(P&deUvHaS#*R+kQ3rV-122yRDN$mNlp$woVoW zM-k4wY1oB7w3;w?1Z$AeYO@_eU>U@spojS%&y%kR@)b@Jd&j9vl9-={n_d(&M6*0Z zE@y%iIw8N0`$*oy#>TmJbcWADM@u;-2gw*>4u8t3^r1m6q=sdyCnw09ZI9LphE;VM zXG&%>#4?#=uQPLTM~TGw45?0nBaFC++@F*Z}=-eEOj4Xi6zvmA3b*jQ*{?v^pDnH=k{?et5v1^-CCVBoIsg)qYJ3=XV_9I5*c6Wzbp+Qxb-AB*Am|9!V#&3Xb*#CJrG%D z+pf=uGOh=IAbZ;RV>&Q1o3!-AE4Fo6S$x=~P=w^@x$i$-Nwcl2qb_m$wjaR%axKVb zF&S2Rxvrinpv^}XbIbK%q=;U}NoZ*r^wpnE9-KB`rV2xe<|mpMO0??*!N|VjZlHZx ztec_zUhJAxuC*p4R#J9-EE67orAKbM%ZN7e;kK2D{;eW9+fPd;`ViE!{odjFD z1Q6l>r6HX`4CM;?IPMO@GP1BN0g-4S*fqr;$3i_fsbEAnT_)Q+;*qmfw#{BQkTi|% z+5(hRMF?CCg;9gutXMmNW)bVKy`qD4CxmyS(MB{AbK zv#BB#*;|er)T9wbH;t^}w>NchRn2PB3fXfriqyLWQFpQ7-A*tT+hN#z@O&-=m}o`$ zTA7V7&XE}?Zgq7Th2LeqJ5!UHby|m2LW*E~Hm68VOwPA$?Z%7c zELXzSl#_B@vFAoH*1$y3Q5jp9rM)RRDPyc->}8T5U=yOgV}9|Cg}(|)>bi=to7;y! z&oi`pJDCl7zP*n!9BH+Zt!`k0?%&&^v~D4cCl!oF#%E5w9}Sipd=molPk<~R0jQ)@ zumtt;NKJifnyM7c&4h=^d2Y00GB=7sL!J86GG5>jc^H_k6a;XYXr6st@Mv!K^d z(Vzoz>YhTXYoc8wHKOqK+wk%TLPi=?qrzEUUX8K06lhPkRUH5KKbo(%ab5y1qtw|x zH|&}lHhoQL(k-eZ?@SR+z>ysEYYl6S>9I2M8j4=d{cy6^HXlo=SrLb66yFP zA(l$)PsKv`u7)F;13OWqLM?{NAFc6E&d9TwN{6MCDy4>NkF`lyl(m(nIaXpB`BP>;dC(lOUXgnBwYfPN;iCl9Ls}; zZKQ5gFjf-fW6oa^CPIJK9Of9*36|QX-XoSS4buZU$ zsNJP7e2Zz+aZw!CPPtcBn3F5&q?E#awNXZGWkIAh!8m1271G-Aay}Fh+>5(Y9S2`e1VJ&&JYqTc9S1Tn}~%>_BzceG%Yb< ziTC2dtb^`k#dsGaov0tpcNy*VS2UWx7%pE0p6xq(VddIpBj(`X;O6by*np8#AOuKT zTf2X?@7>M!?bLw9*FafT;CdKafQRQu0}BWsgJg$C|Ea5P!xbDSkIy}4_3`XpD-o(& z6P?9`&D-h$cex=H$}f$`;T8kggf_$ti!|?&mU&&wtLnn@q>{*8feRxxpI_(iOmi)u zG{kC>$OvZ*w=qi8?&nEFy2c$(mSfPLQr8`?HQOC@|4X+s?#k|`Uem&0((%KN%(+qX zPwAyXrwMH}oirDgV+%m6?@556U~}9~j2;S5;uE1z>G9(Ichg1@$i9ti_50@DNm&dp zG%Cj3NvHj`3CFYeTgZ)FI_&a(vCMbbjA`w6%){M-roXe%2y~G%j0=d)*i-_mmo0yq z>!Z_gW$BY+W1ppz=ELTSMd^-Kp@voi#U!VVN8-mlU=2gNN!`q4f5&*Qnk8<-@J2{< zU%@fz(~d<(wf z-x-t{C5+;)4^iI0guV;2r0(D&hsbx3lgyKAjO(VcmE)HpQJSSoMdmz9c#{PJp zY!=BC4I>U$A4_A+tKWw^W)Z)4cIcw5`wcDncVBOu4dRG8)->eWzIjs=5QFR-PYA#j ze*vr$;NWpc5`TQQXCJM1+3TMMFwaHiLDv;EW@L%CQ@tKSc1!M)wLTMMA@2=EUq>J8 zwq<_HUv3x=!veHEUlg|KKiWazZeuA%Flvd|R58uq)dTi=@@Ip3NRIn-`B0ov3_>cL1Fp~+D=VcB5Rg}0IuaGsH9D|H4 z50B}s#7G{oyoe*k+oDG|7W1FX;JmYzmVC}o4kO>rjF*YU5(m+AWm-e66~n1paK+XB0hdpTgINKcNt(fJ*n2+_=*U&cFyw@V>FHRpe_B_jK~LPqsq1? zeA|6+Kz=<_w}klIKx3=jELn2_hgo3kfTQZj*RYvNP_`gC0Rv)$k{5|;_#Llh!pJEbtb#GM&?CMdv{gb|8Yc-)<>yK^ZH(B4U61*cT{)2PhQBy$ zB`gd;CbF%n=Y=ESa*8lOi_ATCsGHX$eoM-k@qcj`#+&M=)A#Mq&QZhMrDYdpoCD;8 zS1^+>h4$p^cM<=eFd~LO8og~e1divt3%mc^@!{p)YTL0x{Y|tqm>5>yc)G{8ka=`A zH>#;L4W6H&lGbjVYj~VJtmyZ})izup%PFW6dSl>jO1>yfCKw~s2u<+<>U`!*<6MWt zVo?mia+T>K4%|<;m`>aGoLK`?0XP+x;##+LbsuleFCCsUZp>4e7jb(9H6A7#e>K4q zEpbQhZyFaoMKjM?G2xNYQc{7_Lrp$FL|FpQ8v$8FxCk_A@=9B!=+HL5($4akaaFYKcR8jV8O&( zmpxWh)h9v}!-uYFy~?gp2an0#^);3X0{x_elOak&2P0ymd}q-#4Sj(Tjh7YM)*X}v zJAl>CeSn3s-{Vpmp@S$ZkB2UiRegh6@tr*&A1!n7jlyuVQIIOER0j4*gWY+n6BBo5 zMYU0tQo-Qe{W!&z5osx`7au$Qw5=02>gEN6z2bJDf6@+RN*4qZc4%CKonn>{t3puQ zuOU-hA(Ih?q3M{27k1pmy<&HI8m-c#L0okX?qA<3VBR8&insme>@y6;(3g zWnXAe{v@C3EN43TGzCu-`7~Jg;sm_kHhEredR04Amo-SAq^ukJKYe+<9c*hbJF+Jp z46(e|)i-9AOOYpThBr#P3ohvUPIU*hd9Bk&Bqntht!V6@R!6lae`6t)d!%ly&|4#u zeKov(uX?&0L>H)j?b#yryH$uZxguKEb%WFFhn4woCvs#CzRsU4CPtmxcK8@l@A_lm zp^6h=Fp+hQxC zgmP(014o$^$}x@v7_q7hNKC+fH-w1SxgCHgvYw#*ATz3&ke9)4!3_A9@%9WZ&*?m# zMw&j;jg@|5d>VO%ii;G1bYiD727N@lFaR41OFeAZ4Xkn-i@bu%b`kTP1zg!!#8PJ& z%iT4s*>!Z#g(ViQL{d}F3MHtSDw?K-R;7XAS_{L~L5x%eFp>;n&@?fG78+=v!j){V z2o*tsYv`cfHTqLqQp(yI0>NE9U=dL1al#5H$V~W-7y%e=ER`ki-*d4YUD@T1j^HY? zBd@YtZqSg-Ygo7{S8zvVKkk@0jC1qnvAVX}=MQh^x(VsILBDRd+ngi`n3;?*ymRMH z%+1Z=vBw^Zeoz1mCr+He6Hh#W7hZS)Q&Uq|TwJ7Xx62C)3#ixY06>PQ#mrZ=e~?t3 z=bM;_(5TmNXy-H@JGL7i-BHJsX~Xn7sjY(F>?@Z^iHV0m@5bl|kt zSMki5e?~$z)FvC)o4f}tTX*IXexCLoeF&;~1tvG^hy!lL_qPnAxmRNj0o!G}%#nToGo= zsuMw0Fw|I5b*d!=hyZ@wY09{Se;$zvsU*~gq60@jkIZ9ife_3QX*JI9I3Ae16Hg8Q z60fbVy=B@AH(Z0=V?ge-%4Z8LcP6fkO5K(?0+9vdHgkgEjbU?4ceMl)cFzgyhHeIqS2Zo3s#WAOc7zlfD~yJ%RL zMY+1Rf@jYC7>!yJwc!Em#!=L4C0%c3qB29u`=VQqQaHcMs`sVfLXw3CR#vMOrT~Jh z+GHSFDqsA`4=ArPWU2%b^_cP^F$UF2 z70p@$BaI&CSih`C&k2@R(;|KF5XA`A^QasQE9@YOq}arcNtlhy&7o&69Sz^oZ8!kgfkniW_)-V|}F$+G}Y zNph$#Zk@Rj2A&2H#&ObcDp>KUY`IC$5}Jl_Y`6(?^dKyNAN=Y?tgN;D{2A0Y1IsIm zc>44|U~vC1>dgUc?e0aTmjILBE8Ahl-TsS|+ zZi2xA^{_IKcXkXU+TVGG%-KeMP*s{`18?Erc?^TuWHt&xi$Ij_F5bBOIPrk zIfI{9pT)`g0JgLyv2T1Q?wCA;V*|Hhf3h7TW*A1Uf275!2YAZwf|f`W#v`jbiVQp! zY5A}kyolcpO=`)Gj8>k68I8!z6>2+X*}Ndr)$J|k9gSq!iaL|8^0W*mn5GHbHGT*` zYdwQY3-j;%ynKUR-v%*K`@{fLy!z^^yk*Ol=m(`nkEc$Z3QnlJ8mlRL>%2b_<B zd^Oolh!5Ve7hgR(iQ5LdXka4+3t9ys$qiD{tA4R+VHsFV!;aHeM4e7@b+Wi?xQYL1_8>aF9-e&uWvs5Rc_t+5 z-7;fgX&z6$@*ULnwea5Bzrq&Y0kZiZF%b2S-;cRIpM}~XRY_2uQMQ@!Ca2?=WgNL!W&`WE z(7S}W?n`)b;b-{Sgoc4K~N!AqI0 zhk5!&x+3fAF~18@UkvG1$DrrA%?($hQota$RRTb>*+j3`D~-s)N=LLohWjU2req9Z zd}Ih8y>lPFa_b0g9qgjc%3dLC$0GAY85eS6o#Hc)7EelVLlUwE#JMCO02eZE6wEP& zFoEx7xnm>fu33MC4@31kz+szIbB!3K-xKAg$? zEjX0n3@BiOX2=aIINPuyN=|-ho7F4%e#*pH=QiHxp2yEN=J4dgQ~2eZ&*ALiIV`WG z9y-fF!ta|H$ic(LI_6gv@Z#my@Q))u!||D;czFCcZm;jfxEVo}E2)DlQNKAw#v@dF zK#m#NxfBy6)v&s%H_l?$WcBo%XctXRs7np*>~>9l9tsEFR>7Th>Ht?3}jZQ zf_=5!c+Zxjc<$^ASYBO0pWZsTMfo+HPMH$dRb4zY zGc7MKV|;x4H!2MImCnr#8WLkLF*=A(9zTGu+&Y4N^$k=5-wI-d5UlVu0MPp5*n}*Z zyIgukm_Bp9n;}Sp!>bQpcEX;v-q{9^4{{KJ(W;i(J%f;Se=W397>p0(EvP>2yTquc9ZvAu|u^%cB!^N?3?8P{Zpn@b+ofSx-y*vTEZAFDqbrXzd6vu_^L^>N1><7lk5i}_c zE&a2SJX>YNqtR(>L8{x_qhw_?>H8QkN<%m{a0uTWox)0c^}6mi*DJkc-pXJpQE-l% zE?v5WMx%jepMAD8!fQGcVsLN}?RFcrTCF_OQMnp^E5=MWIweVhnaL4+`aS#c*#05x zuC1YBJGn`Eu%r|dKp+xCIOqzi3`t_C$zn1nTOkxcsmqU?$uwgZK&Ai`V$uTSQjQ>u zCJN&&7}$yBSZ3{BHwNz+9zgGo!(aga^wKL>-`I$PhF-6SvzJceBz+T=Jxv@-K7~0WKCUgNPL#UnV%}cH-1@KZck@5QKfn1D&RjWz_C_0)dvW}Fof0$9?e(y-wt^Se zPvOj!H}KPmXYkPWd-3t{dvKt#11&VNW5Jae!1ZCrs0&P8A-|Y(A-0==M5llrPa+HM zQDFF@(v33k%?vF?n!#d38%4(!9m?;52M3Wf#5_<#75l3@aqHB6oVj!s>+2in({D!C zj2qI!BZ8K^a^(s+{(j`h5q7&I^kP2%40CgH{*v6ZrM7e~p2Gf!|0x;K0H) ziAmn2R7nzSpBlqwj_<`64-8^^wT;9XHv*x^-jQ1o>d7~FPT|ZEtTa$uw)p+kM#UFn z_&P%nkxM%UH}OQ&7H(1?k#C<@6Q<*hAjLQS9U_RvO*mPeETd@%_l*vrbM#iMu6OYB z*G^-j(}}i8x7)?(H($ozn?FTuXA{TFCoo_Kd=C9?3AHE-oMbBPikveUAuWUcF_eLa^vbZX#$pYtc&&39KUjJa ze|zyHetq#*SZ=R?*_LD18-SRB9;d+JxwFsX%)%S^)y|jk=$7~5y{%cy&=jg%Q+;0m zg$pzx8vaU86-&(`97s?w~JRVynvJE{$Knm`2kjv zHhS5D&2n}YgWw6?{j*d>i1}UT)Q4r!T%su;-(|mj+Tsck4^-G7ZWT`EkAir_SrP)M z<>ym``L$qlsf$bYGJf3t8UBwq{sjNe%YTBWUw;~lt4pvqI9QOxnIz@P@&dm9!jt%S z&;BX?xAT92r#mlT1#Nh#mTXMjPxbhv*iCFs3?dZ15)@bn8b~r?#qa}ZTsVaN1D~D9 z;)GQvm06cQUdUxeB_KPe<>G)q-uVa6#GS2!*fX{Bre0jW9m?&Cu0^6BtO{vxaL~Wm zxpOA~;N;1Zn4O(vweg`SjCRHj+UPOX<@^gV`4f{rQSWA^N+rQ9Gn4qz-TU$RTN;?D ztb)Af#%${(amYML3`ACgOil#u8&Y6F{sj|&^k^3mTWCvY7V(f#zqJzq1t|17J$M|M zFoS-gCSEV45Fm#lVMX3s#Q4DEFur=nQS9G3jY?%R(9pq4=by#jzVRRMg84DllJ%Sy zkYLQ}&og6<$zr6kDUVx-g=H3ig^Ro)Wac4oupE9v5c9bNH|(T51SV6cX9pZCS*)9N zywp8~|2F^E_}^dsKk+xG{s!kRzkzPAdzFIU*wpRzaOUD!{Q0l`JO14(-@sok{Ugrv zC9tc|0G+9oIjQjw8zQ!VI*RC%#dFsg1B#>>w5JTK0l%9=TxX$TXGJ7z6cKH*c;HyH z;Z~*!8|QPLl7_sAK zo{1uiGgz&QXdI`zCLkxJ8nL|SJafs!AV1UJifsb{V2ad1(0?SDiG;PlFaaN%nZ#G` zx*fZwCXtk^S{T6k#u|Qg?rHpB{!j60_2*biItW|fDi=g#e83?euT z@#X;vj*KzbHZh9NAKQaZ?W|+UtmfVuy_ioh!9ao_mw?ctEMu|)IOx|hoO~uHp`b~` zfY-^zC^jkibDlN#)PFJ_R&l6kV;NEN?q<)Z%NQrd$7Uw+h1nyRnHYyDv0P*Z+H0%$ z<(Vh(!-a3)Ozqd$NP6k&o$`gCUZ{K3fX%a^PjlW(P~<^}>;f|02*VFl7FvBF|7^Gj z_W4w*k37E=sw0fWGM4e9wSU5YeEm=G?bp7I)AOg%>BenB-tE-scJT6rQ~3X0_$&P1 z=l%jO;B{EjD-Nir-GS);CA_yt8jQ&2vJ)xvss9RbZZfa<$2x6s?~Ns0x<-H%xoC*Y zPrB?rt+W?bQNiBE4(uM@hDvfxw)lP8gybTh!iX=@)i83{UiM6(@)@+7k+`|wdI>i zN*JS_wKzNf2L5aJzhk+#imz_}1P+@WsGzDEh4RJ-tWU*nA2hOU*^gCeJu44}g6M6o zV
^!NxYWAh|Rfq98w!pG&~$P#m%-j^eWR;1-{EFDI|23so=xOHd`e$jXio#mSo zoc=b5nS9yxdbgUx11T@fB=tkk%TyF>b7M$A*cm8WE_bn9tTMJMt}KxE7ll!`?xa-@MI%Y@}O z>AO)3;PA*T7#|$H_AP>aD)sQF1q*&0i|5T|(|sK445^AlaaUFQ)P;kG03x&1ZXfJCo(bV7Qm56tJL;^{bZFeV_&O@FW-6)_wC(_ zfkvZrGP0I2zjP5lKK)ntY3B)Cte(R<*?jkeDvuW61Vt4^VU8Ou>hSK*x}u1Msta#b zHL?0#P;V$qX0x3Sxf+9EEu+glob8^)U(Wv(o_Oug@Z5#xu-0k!!Ga>oj4LaPIQjCA z@qfMkE&LoWV&wq?M)o`G-3p<8pko46OzXd9GK5Zt@ZnwRs$4i$k0RT2OHt3p+ z9%pA~dE2&aeAiuf@#)j2VT|F?(b2-z3i!T4>RBHaGBXxeR`LDkUd5mNdLFN=)zG6v zF|^34BH%JItjQT=%$YCecZH`R5^A2&7_N7@ghE4l8XnDLOyS_{g*?4?YT|3sb>dD zg>)x@8Q72})Th~P$>K_>cqd_aco@ZEk&Mx!tlQBr9653XQ8;S=h@(|@cX!)U&|0Y) z$hdw3XK#ZE$l#j5IdQgswa{_ST?Nbr$XVq#IwOTE81lyLF*#H~RTI1U60v>(oJid2k372X` zgfKn}Fp^O(+o z--#4?v?=j&S=slFP$7W2+&$%VsZ?RU-%|o zQU8VI!Xk_pjZkWQjl34w4#W#JDJXO}4Pk*$?r>SqjF(Ty06fBj&wqnzho1_Gu&9^t z+sZR|^y>F;cIGr%nXs^CAR;VPmhiJzp1`-R{S+5*4Pl_&dFhP?iDZ%h%x1?US;y%f zUarKAvBc$DBwPqLLW|Guf)dSJ^?HN`PKzL(TgnsRZzfRU9g}w}p@_XbJF&TUW9G!^ zRRWQA>=+ot1hl)mJ08@1`}Wc3=xBVbGS!B`Y&#gqBA?Hb)>`%T^{Jko9!r9s)Bpe= z07*naQ~*F%d;d3*MKj@GHPA%3HoJ&_d+7qce|8zy8eO2EC|n~m@F6Q-PC~4vy{i)> z`FyKy#eSGofRc53Rt~%Z&ggx@gLfH39)e;~72EL9c^__BC^)11E=pXDuoNnEk;3~o zZ^jo6-HF?_Z9_4izE>KCA;zc9;g^@cj#q-mQ7u%Um5MbDn)yPIS^%k8fVK@7AxS0| z0Qhr0G)f+aOorG92#K9S;>UsC$Jz!W)KJBXwWD}+`nxza^Gc>!xB(yn7FU+=lM_eq zgSjKP7R)8iolFK9P)@3ai1SV5GF?7VECC(KgZMNAYu6DnIAbTFnMj$)4n6SIYou7u z2U3E*@RK3D|IuHb@)*ulWm4=_{F5tA*2-M)AulU&ZPCuTaTV5h_@2q@{DEI8A65z{o9^b7UI- zYL;LiU3oA8gZMUt@F33nVg!gfnmE-wiN|KXix(z;hek6C`txdFdSMzrIPstO>B=)$ z$S*~a#4Jf50ZRoXg$U1f0cX(GDxV1sWMVuZVaOJJWGtVFW1YVD zjF}bxCJ;hTJFkMmCJbV4UuMVfnnE-dN`7!NI?)b8tJP8?BO|HRcq!%R=xF?VadDA1 z8B^of+R|CgWgvlwFflocuRV7jkB+Tix{(6~dB)KB{=bhYa*#%iCYhHHY=RN5Oek?3 z%a3|WLnOHcVg2T10^vFuEIoy}$L(^#AgUuUTNgQx8*27$K7l~qD)v5rBZ&1Vg^zCA ziodz*5N_JM1-T9eLakN{XD%PZjve^ip*u0WX){y@;#95I zaD3u99GUrNoX`ITwOqX|C@8m^B(@DKWe8KaSfAYU%I5R)2V8#O(;?O-c(e|d5TbxN zn!}TopW&&=UtoS^&izao+z^Ceh*Ou(;$JWP3@@uOgh6NrNCO{t4<2^}53`LI1Z?qU zO++S47y@D8B*bstCAlr=p*g+;DX1F(gWFA6pMZUb=)QN+mYk6ZOVhCtls}7qr$mcXbBeczy!E zxYWW@t7s!M7Y-m)ixzkAs1;c;%YVJ(T9zGvvb7tre!P>Az{)y6b~YvRrV%H>Ewu=g z5cf$C7yjMSrl1myu=iI)7zzUX$*!IF%$+0HxpAnYWp=e*!AlpP#(!P=KR6rw4)vg! zY)u&9fsKU}0?d(1$CWeJ42bOv_p8(7gOUhIkb`p)Ep0I%?iD%c8fT2tq!vOR{S@M>C8&GE zTVGpgAoE&uuf6BJ6@%E(y9I>~Hbxn&4Ty{_f;W0udt@UXKR!N=qeqXbrKKhH$Rm$9 zqw0(X4>~b5HKq6&&8Q7~rln}eGw?&J72@=jX?){o4&C|P_|WzOx>Yk`fKqpzvMP6; zGgYMK&R5u~9X=f9%UzG|Ted}lz?dboV>Ai74z4Ec$e%d3rE~#B!B(C6Udd$SD<BSoI0_~I*T zA*FLVY&0M7r{)J+WL~h(k0ihKNsK_jaP(aB41PZKZ#X}D8qF{>a(u0Us2#BC$eCxb zyL$)zYT#q&*X77PyudLZ^XAOcA*|#|q(W1bI0%tFb22gmMEM*{8^KRP(n)QOj(g|NbI!>!k9)92aISvp0@Ok2`Xy};Xp{|X?0!nR@wpWb^DK6UUQHVq7{ zqG?#ci{nq>iTSVLN^lA-(vAV7={^apf#@;6I<{~8xlokE^^369@#0n64QU0;(mZ}u z`59iCeioI+N{4Tj!K(qSHLlH1;wR^h;6*x%R!%3!7=8Qw7Fw$WSG{Ti@|TNoRH**B z4;P*BBjj#HoPaG-e}^bi&OZQqnGjQ zj6wr>uhp=vmL!puMpR5*5r&sDOGU}5hdULJD|?{`Xm-}wTpBy}h4ZXe5BX|6WfaTf}o}YLezh3zU zt_5RgQRw(QFl~69bdo))T&|H~5CNcojpiy2G>Lz?Xse_~4ZK+U9ezFebIes{*jB_k zz=yZseY4fVnW-^6I{r8&@{^z(!y^knq#cjc;<1sAe=E9B`Ol*#>U3f%F2rB>goz+XJ-SgbwEV9uCA_J5Kt}%DA&`~ z^(U>cHQZ{2DhL7(IdmauIAvx0HoR|zA*PpWm~90Z-q4TD3*YVQSZ&7d6yzi6Uzqa?yRul7$B@7L0#J;X! zlu!^`25E!L88_IVlY1%&;&`-S_VGMt_4%$=w{1Y2@>H6mt2AYOVTXt+furPzON}20;+! z^Z9UKV1WAj`|0@c%)P8~_wM-*E}0uHVh9UAu7k_|fn?J;SeiC8iLRxysmhWOBp7SjX>AcB&Hp|_!@ToxZWCVX6rB|tj(Z=sE zI{O?d^%cL?D!YHp?}-Rk7pCy|<=@~uE<*>x_^zM(&LACT8qup(tHr^m1_lN| zM2bhNJbd^tt;uoI=;$cM$H(L7RgusTlfXo9O!4mJg%rl{HotEhNmcRq$;UuSLFj%<3agvL{}$J z5L0;YCT?3ihg9JTq8)z|jes<6>+Z(q4~*bFH{FcxQdfuZBTUX;!!IZP6))0HuvD0D z`)3fRCVUQ>d?dhnrjl-f4H*{}Nc4;g8bm+~8kfS0cz*5)OjpdQi1jo7-|F|xW)sJ! z&f?eeFJURDwyAdjTPxthm$(XLPXv=jzLOA)ar@5IvTW@uFYGx+>Gh@JJKO7{8Vu3|BH=!~DnrRj_K`NY?8T>TuC{8Ib4 zC1>n9DGi^TP3)CS64{SqTI(+we?l`9S^-P6f)^^k#^~I0s5Po@_*{QG{>?1R;K{4c z;k>>QX&D?&Z-atsLtr_1V;LR)CS>Dh{8JuFrj&^&CYJf(XhnRTW_{pxO{s!OiUu?) zSEK@V6*i-{*qvxsvOmus`)p}L>9eGbT5tZT@;9=I*>|lS)sZ?Aq z>kGjze8e1!FLmXF5Pjmm<;e%x2ZdzXD)wAKycgq~{2o%c-~xr6Cl7^t`ZnMTcm4qm z4eySERr$wHYmKpMXYkWY|BMsC6R75@XhrJ3Fp6FohsI{_!#^jSGe{n{8T=En&%{yE z_=RX|7cSuWxhFBbbS;`fZ}dEW`~9`T5XUFa;5Q4$+FAxa=Y8ap#DMy?)#N1MzE{9B zek3Q6G^F-%6S8qs+CBJ45x54AEpn{BxlGQQ$inzqDPRi*FxcIXoU1%%wDuw*wY0PpmmV1zL0Wk0953|56HllkM~G{J+bYEcbKr?Qsoa$~kko4l0q%ru_gQ+jN*!*kV> z7@xm_Rv4~nf%PjobAdtMo9e>}p+!G%ilg;Ooy{z<*t;W4@UK5j#Z?|4FZm z(o>t*0+1ZW`VEoBqG`rljoVZ3KfYQ}qHl8b;@Ob*f$VE6FL?wOPCy-D!>0vFbBQg- zL&e{)R|R-r(>8qJ&^vJZ&SB(oc~AcKwb^Rol}ktQ^T{vcV(B?Ff>sg?N@xh;#g$4| zAo-kcYR?um|I=unjF<|q;^oC(VRm^cwZGZ*^|^*&3!_(0;<@TcRD)VO#zdQ%rfUy) zx-~x>PVa&bwUn4Bd}Z(J17PE>uRV{_z!BV?Kq|5$%1&e1dV?P9?AwN7p(N}Wva7io zrrsfxbwoqRq1gN|1BWkt=}YYyvYOE&05lp6H9S0QIzz&F1FgyM!P|(OeA(4^4Z{%U zug&1=FO1`t*IHQ7Ih%RLS9Zf0XZ(njkw_dr^Ds&4UI-6f9xuzu_cFJh3OM1ietI~l zC1fy;YLzqhp8Z*`b0~SF!AB4YeSyLUH*dq=jQj!iZQp@hE|)TXglesVW8=TYFQ&hY z@zM)u=2}UBDjBFs$axlzFzF=Hj8P@IT`+amsgASNmvMUGMHY#2ea!E->veW<7EjN; zjA>e6A+UYXTY0fGT;eyLvdWW}L>ftN!5-vRo(g<2iW0whRZ3_a%tW>pJKCP~5tMUX z81CJQa@7Rem1AR;B* zL;4JFJA(2tlkC3JeW*j6ygZGs9u3fY-(GxRa{*mw*{XMGOyv3LB`j96D&>z=#3g$r z+KrEY!hR-k+v<<(1N-fp_rC20t8e7K8;N;Gtgbjy#JyESw5%wf>?I<}d?3i-quX|& z61MQ=W)l}CuYpL5ezhB~)K~EQ*i*=>B0jO@OW0n$9nfvjIbc0DO$F>T24pu6Ib3ix z&cu{RqzH?80Vk@z!}Q9v4j(tWe?9M;&9;`|?AA-zncsv0-{MnZQt){kgESyaX-aPU z#q*oh!`t=98|`N#9`Hqm53w1(@qk$IJ4sj6@`c5FYM>YtuqD3%SD%D5j>S@XKHR(qZ!*gHHuP;1qx_ghdJ%`vq66 zh3tL}_l;%?qZ3p3$LB8M$w`fxCEp1b&fqvFuwM!gnw68b5J0kwOF+ zFTW5I1OLa(?qBcwYqOI$T0MGFCjB|Nd3{@h1_xw5gFi8@ME4!K zWz}QV$Bv7}fA;y~9CFyGdeKuX`+Y!U_pydSciNM1fe`suT3%jO(a}oE=ko~#_1M99 z{V*UpkBR8G#q#nps#Q?E&U@T(hP3T#qIq&%uaN-*Laoun3l}Hxx8jqx--XQ`<4zD3R~GQhg`eT6;yh) z(A(P^C-Y;K4?p~{^TAVf7_C-I8KcME-d>c;P^HqUGA!#n;(^aRfxnu2Lbcw&^B1n- zADJ#U z4h}Jq0+o0{;`w0rheVrXf2V+e;jSM1#myu5qy2}lv9CWSX0n@_H0GCP@zmI(cxvUF zn9g5Lga$TBT=p?ddgVB&Z4f8sv?9#wDV(kz#d39N9n9bCo`WWhbCVZvwsi^3T$pUP z`R2Ek=3SyExNXq`PYem`%AUt`noTUP08Tc&0IQ4F%_pQ%wvfOLrh}yGt^kv~p90XM zy3kkZL7>zdK7Q-*{?&%4H#UkxLqpE9HASo3vuBUmx^=7CxN)PkEm5o0kdXZwllFXM zJ-c7+o=~YZ@a))CeD&B>yu1K3D9?^WBEhtn_;@@jDz5$$D-)2r6`|7VRgUV=zoh3J z&$IOL9{rMSS`v%s7psr0wv+c0F0$kLOkT3n2!aFiXN+T$LS7SY>gvW{-FhcJbn6HP zdU~Ohixmp(-;Zp4a##c^5 z>u{aS-|U{>&o0j4*vffSRo!NyF}_L$z~?u6X4&W{kymcHNgNV_xgzl#Htrxrupx1c z9V|&fpV!R;%)#?+NxKR_Iq1S*S04futc&qm*Z0?_g&{$adDBly1F=xN(HU8)A3g)17!dZR%&(p_vs0gati7 zkV8I-A8#Me0tB^ShJ$1yswF@w#u#Njp93c2Ws(sH)0SfwVQ5BFw_^L3iaZ1_4LZ2e zm2LUzv4jm}zavB$^B%;sIE>Kdp>UvQ0ADz852}p@o;dpomMRtRQDY*FYqMAIc<@c+ zb{FvO(x)*PZbDA0*wwmXG+vXv2s3?i$bs<^9F?u<8pdmRl$>Mv- zWUsCqbYZA8fLxHv=ClWtT3Y}rR>HcgR4QZ)CXH+8EnBvDOIiZM!w)|k8$GsKEj2wo zt@``>ji*P816+?BLu>Uxoxv(VSgzJ^0h*szNYG zFB4{wCl&VxA%qDn>WB##Je)3#ILY@_DKjl4RHIK204JKV4#ieb5K%js7A1Z^Wxopn zIYk)h-GDFLelM!c2A)2D8kKs@E3FV|T%H=ok>Fb>?JnaF@}I;2Z2(Bcwqu+Sn`4tc zqj&q;nNLAj(M!0}IEPxZc3n7{!RrS^gp0G6Fmclq_69qUvkb%G&NE1+EEfPgj}&@E zon}7A47<}TVIi}*=0Rj}Ag-Pg8o-4ODIZuzyKQ_`3Mi=}HWmj_$QPjMX)A%ZFK9sr zwbmU@Oc1v!bOwL>_U&rdu3dQOp@-<9haRHTEeWL*9)9>?pncSW0AS#CA})buQ^DI z55eT`GfDk-MjXp zR4827; zu&XOT5a(v4;?Xm;2%87X=t?krv#&|4h?#4Ot-jHL2${V64V;g1vGkCK2 zZIrfk<6!V%^y=QW^FO8`Ci~5u*HLV-ND2r^W3D-ax%!lECdBP$_iyYyK&UoqIA6Jp zTB(jMRZ3zmm;#b{#}&vLBk)cXiT^U#0zvwfla%qRq=rl!<^0|&6Muz-K~hksDVj~{P)ZDjO2V1)nx z`}glxM~@y=KF3X^QYp&aL3~N+E3tV)+5M}&*F?BFH;?ZhJBJ@#Sj1#A2U6z9WspRg zH1`%2k}Ky9OrNh7`181K&$v^{pEFk^^G=&U5>5EIZsn#~^@#eUduje*<8LB_1z88d z^%_ZpZk59aHtoXaZo3z^ZrR>e3#N=;D{SJ-l~Fu#?Hf29JcUY7N6X~XMzz4`HYG!3 z4FfZ3*U(td(^#%8fQZ)Be9i9V_=mW>bPW~M-RWxaTO%E&ArVsMvxKy=9jcUC1m)2z zNaoKct8ANC8ONB|#wGqP0TjAXLOv20*2DO%r+Y74hYf)7<{Sh;?64644j(@3)b3P! z>eMMJ7K;QomIP|Gno5eLOEE#G-mbel_>0)N`Mq`9#SNX^DN;M;~bf;}|qwIc=AY7z8Wj*E7esfhWufuVXE&A*%;mH0* zq@Xm=r}FslmOc3F!Fw^hX$zDL2*bKxZ`5$&$_qF$`E{JlKaFaxj+O#Kc5(vj6Pi%j zCQX~yh^`?*EMgMXX2oeQyI)`Tnlz@DXR(s6MXo)?gpL(~(K%kju;b|&l`-{8?jiAp zKek+0SBK?(uye9z) zgpK(UKC$f<{N?TMz>bZZ68bK#Z66yIj9&UJ9>4Y#jOCw2O*L)11)zU&j$nW>Lj5IR)Z=qq76-G-vhwZDQm-DZhhf%y!CO1O-L`V=(j4Byr{Xb>v(DlXTj z5h{%UdE2p?62d_|o?;Hmqm+(OWXkbrzBR|wali&=EQxtpuzYr4%hLE}~d00ss#_g~Nvr!)x@&!PqcNO-;o)?YP;UZ5X^D zc~18Cn*I@hTBC^Uyx7F`px^NCn)!y7AYR9^_LWJ<&QFp6)1uKo^_L1jxFekIW4u1fe zVH17RT?;Q9}MzXWZ=UO5=`1f2MdQ}WJ#XKfQiixAsnl;f+U`^d+#zwbXHLZ#lo@6KPs|9Rm&o||u>fgB$ldzz548KX-1ZOWQkizy4C!FNWR@0$ub z=5CR&Jx#AcmFd6O;J36B>^C9V#|5(#glEgedsX5)rJb@sLfuR`t&k&NU)Kiw?f!f5 zz|FUzw_I*-*?GoKYmM2(Y5eNqkMUgNN0={OMk^qM#Ec->=?U;HY9iFBf_kea_ARo% z_4*fTjoFoXG*wFwf5uq(Tvc#=9FY9&If~3P`8)#3Br^C#Ng1E9u$=o=MJgqaNfULY z^(BI~h9PIynf;}HuQj@eR_)3w56#y(QE;kJl+U4X=N{bEn?q5BNT?25QFES8QsKn?5>PUTJYbb#KV-fb z81b@J9PBxsXJkJ!6gTfts zoAAZk--+dV4bNOWgG#;bb$+HvV`}aio+|wi<=uU_r|>BZVhak$3K}X*1O#p)VBx62pH&<$ahz0Q|H?uWW|I)(u#e}HU55A5p#$j* z%t=>BaGpdPd@D3c50paA#FEJ7_N#!-A8&koJVi;+2Co+;;pxc$lV|*UBOTpYcY2n= zYYGHlrB=g}r!Jrr1o&Tf?8fcAITTFH28*Mxl`~%*b0#SR)mV+C`9F|MRoX*%@>t9? zT~l;qU6_q++qP}nHam95w(X8>b=Fq^In$cu~RV_tzZ%g^}5>u0W~acM-l`Qh)<>rL)4EDrC2w z!NO)u>MjBvl!jFr|Md&MXdP6HG*)j(7| zjK&$!uI#Ztkp@|oisXn6PrGZp+B@uS?s6jsyP(?-pFF$aJstOUJV+TW(Npta&{MJR zhfkc2Fu%akzt9FrTreH#WrlH73U@$6H{Aakfwl}{iH${VE5KDjrFpA4=9LUc%~Q7J zU9(3eyG!24r8PldBHQfyyUa(~u^ppY9YAu`D~pPXLI!uOPSg{cXimt1ssLN1;Z$j0 zZaZN6FAwU7eXm&|e+(6-72n=ELW& zMU#@>NC-b<7HFiId5FKJAR( zNJ>zF1ywg_&2Tz{8(CrReD_qBNxP2@LE~k(5JgzVJJgJ{f%a8Q)qOQ4%?_`tq zu1W2^*ME9}d2L$jAzE?KZb?fR$I{4GyQ$J`cLMj@bT+x;_t|TAEMB2!1aG=0O2+&o zIlo;LT?l6CYZj}n5ZvQQU}y^F)GO{+Gy0tY_okOuSL6}_I10fudX!5nrLs^pG6+sB z6t7&}XsG4DWuj!k4RG6OV^F8=D__9wnyv-g{%th}BUX2T%0LhT+9gEKj7*jeCPX!Z z$iR5~0K>G4OtF+Fm0FO2P1%HYD3!eHg>|iOQ;5&&=e*?j^>XuekiocxS_-fZ0>i6= zQZnR?7;6YXJcCy*Nw%X96MuXu0)hCEh<)*5x#s>e-d>BtZ?q=`-&x=qWYJrXEN@uM zPWm2p+CV3&0W1;Leu}vc(aciI7d66;bpn-@`u7!G<0f1$VzL+raDNi{BMY{_#A3hO zoeg5*<;CNHcr%)EAKHwg*nB=y-*BZF`G?T+@Pys#rytf5Vvt!my`hL3l)^P~$ohD< zNp+yqw#;#S&C86(NdxxjI0dyqaWA0VUiya$Z69Tkc?D^%ckMbis-{lE(UbZDlI2dr zBVc`1|GqQX)AVc}t4p8{O~pyW-z>#{dJJi-|UGqaKPN(VbF4}LpoTso%NgpS?L>jU{7c~>tU z2}q>|9Rvt4Pq?X=1d(BFK2hK?imeyB-k?+LKV6K1>2G((y#T)+x@3faz(UT0$7_OK zmuHIazl&g4gZ)M;`oj_`a4B)=zB0%3#3yRF1=NzpQTDJY_-K1FColJdYWiTR5j%Q= zu+e_`>A9HpF~j`QzzE{`7QW5E7!0mcIl%GjUqDT=r}^i6xrQGpSamC$(Juhvx837Z z)-@j}VP4a|1^?Rah2hj9d8j*B@Fb~70;?HUd)@m?Jw;^JQ40ITwmpF~%9-=T(uHZV4n9iIc zvS58?h=t@~N-B$d>=rE}qJMB1Nl8>1&SJ2EyICEs#TD01=4>83PW2%6Ku@OC5cGqv zV<0sbGJ*#R9*lgtq=4sxtUwdMUBR=!?$cT&8du+hz`X}bJ`o|{Utyuj^jUJVv)p9k zLbHVpv|Vu1jhv{l?3~GhpW$*iml1xH0`L z7_zFDt%GJ0fRoD@4OEA@KcA~w(wQWl`_QUVvD6A%hm+14WDjZ^3xpdhHWU^^s(WVQ z?Uv$nBg~FjOtkqn!ldsdCqHFQp6d!4n49q?ldU?&pd4D0S>SD4^j^$_LptURv{UN{ zr-QX&{&~n2jJ%Kj`(`5UWGr1|>SBqcYz&~yH~7H%A%_kFjz|cPn5R^0(YPx@8}3>J z4|$ABe#$z7n-mpkrgaC!99KAAQLUkZa}WX#DKeN_#sc;`96ohT!ycAI&2Bsl>`E|9 zCE1IpxuDt8UU+pP`2c}{MW1U8{={|T4>3OeRn}g#*2dZzc4Rx&7@boT8tMXKj|@~F zHA&$vkd~WD1xz-%0bYJWYKq6zIzYiVfDOk;C?QtOru9eRxeV@4TPJ)%e!xroeDZLcChQMZYyA9W*C?8Ab?fLt@Z9JsY_$0lyOQh#*$s)a+< z!7jn816D?ek33(9O?tf$`LG?7&)e4b-C)uOK0--U&KchdgL1nt&f?PS;-_=r{Sxx{ zc-_sOvfu|Fu<-3c#X_EUP}U|M^#@(k_M7AP-T4%0-zvabCfg|Zg4Jx@+oAH!L|oCx zV8HP3@zs4_uT|ycOjyT>eO-mY8>Lu;ycJLKl zhm!BuWBw~93)Ni`HUu3ACj;Mra5C5v*l_72?WE0XxKzklKWj9|Jo=3}*A@^~c8D>U zE2Yj|By05%&JBAULcrzWB$DiE#yN}Ico&AI|BN3WlqRpZn;;!jCMDK6*bxdot=y>{ zs^DS7;OLToQ| z;RXsn3T?Oh3QvxxT~e>;9W5?P65#$rn#Cv(X%&d1!c*mD%hd<|vSRf?iaX%rS3!9i zC?3qaw8Jgn`Qd%^D4yqGop_Al>|=skkaFw9I@WY;oGs^(%_s9V^;CPJ;w6%%R7^i1 z!bwodK?osW$}lu*G}*e1?dszGm9^ps>XBQ8s5qY=Uo2#}dPUjo)y|n1f`F#$5h@oD z4rwdL9ju!XBKF>pSVDJ##XNb1K^pJ!$f5|Kg-y|A7R$NsN=C1v3z?RLf|z+WhGLPG zeS7_S@+=u9TR6*+4$wzD=5$uRvO3yE;#LiHm zIcB%_MGp!QBh4I(5EBMtI@VLzEUAl4g>5s8>waW}p6kx^%AmVvM=Wq&Bk&v_8(}oJ z`rQiGy`y8zf>hz>Phzd&TFV9wziC=qA_9NV@QQxW7n{C7jSa|@Sq_ZP*5D}IkJ{pU1moz!>&fnzMWUEWfh0-mb zfg(B{dSCx-Xiek;qDXjnKCHWpkLZ+YigS1#ZIz5HH?IAm>Y(}MKV`Bbs$CR@D9W6M zH2ex~A3-_F)jn}d_)bB|$v zOy>nJQHAmPV?FhNBFm6>?I+`n9by>Sz?@4ng_+rGmKp<_Pi-=+N?_Bfm5L_`c1w&i zy0`NHO0en84)?CHK_ovV5148CH`$F8$ zFLUe`cGdbb;v`dQz{N9c>cVUDk*1l*pcMlj%o7zBF?iVAsJusWshDc8v2_&N$2WML zpb=1);ubBw_R@Y5MFhM_P1K*)qwmy2MfTqmTU-cM0jf_GK_tRD%Pha1k9qyhwk-{+ z?W`wsWOY~nW?b%U>Y>n$djZ1VB+T5i{HpYE?Q=wACr`Q_^(WFgS%#DZOS8}KF;h8) zIr`6f)?&*jzP6neTI3zB%9zvu{SiBWuW?@&lTXLv?RhuWS`96hcAikF=H5S_dkDME zDsn}AHOQfLuKFfPUB*OZ`1@O{WN$)DR=Lp=lYUOQLKeLyNUs*Cwjp}L4A6`8(oC}t6+yv1tL-qLeXndH z$z2tq_kR7skD}qGe62s>fl1!I?GZW!pP(2jl{k42itjYI7vD|%>CxdKxq9aM8qKcL zkOU8Af3+7Uboqj!NczR+wk{o5rZqS%eloC!R46b$?V=>ApteA3{0_jqqnncdEil&i zddJ7Pu$bN7s712alsg|x-R>@K4^3Jy_n$zJ$nReCZZ@dd;$Res3I`Ik%ChuhmlvY?jEr?ucJ=m{c64B9R)TYU*aHBkR30kBq<{GZ zv}SG-3dORFwUn~uUL8Zt5|095`y!RPyS+Jm-y8ZqfDU;ha*~&6Z}#f(pp} z{SY$0SSUHm{SgLLy@Z~^wSCP&9ju;RoU-!K7IQ&=pi%ySeXJdxr3x)9?H^5fb=t23 zdS%tv23K;iM-*+OYu#VOP-po%Mhnt4p*1i9S}%St6fKM>ukb>O;5FK)jifY(|26|a z3Ix4`+Z<&Q`I84epvy40o?nkd<{Z;1P1O8xZ>;1FVVdYSY+MNa%4WqEeQ|m$*0J)Z zeBKf5_E66S^|<86t=zp@9OXb6TN))aTLu+|oDESnpohgWrs}uYL$e99hLEIOk}e|$ zf+nnI&0WtgFU5S**c0`g+<|cRDODYC+LQ_yY2{_GWxwg@37Okht!9QaWQ$X)Ph+5F zZj6?_zEE=HcOD$-)(mk79v9SP%5x6xS8H{>w;`c$!G@vjQ~m`-j(Dg|mLaija6Ve$ zu@fyUbdO|zjXxe1!A%PhJXo*D->B^%y36ALwr-Gm>DzJPsx3lSUn)}1^DU!X=?v65 z)PdC~lpSD(m4_Tq-^s^iN|BlTjj{Zc5FsPus0t51g%jJE#8_VgeYj`mJ3#-86Em^4 zrtzp~tR{xK6W`+exm}L6MBfBG1+%UX`>PJ6g2{MnN60&DS2?OfzsF zt&Bt7nzD_6fwO!WK_vIr86GbtR^; zQ!>C_#LjEPDpi90+TOH+Pe*5WPiLx3^kR zgZhbyiAVXqw?&-L1#Bh+JUAERuA~#`!w76mcXeM^gnk zK@^fqW~bJk;!j#JC3Htxg#BjjKJdE@fBeaj`sKAL6aT@8V9{+sXOJFIX7k$K^J+p4 z7&hXDAs9#jvhG^={3Xmqc=K9C45%0-1ehZC#x^#Sqp-{Q`n$gvDl6{OE14)i1}f@_ zhq>Lsa?q-PuDQ_AP>K*mA5x+1x->AtZYvPn-OVy0Gy3C=R zC@WVl0Xy%k&uKB|LSFc{*YqV8N(?%95hSE+4{{N8`Nsj38oIV-(;LSJbP7#iXMBwG$I(c#mH-n1#*vQEGeOT$ipfX5 zvOnvS)dHKGMJ_C2K^Nk2+GkMqo+HN zS~0i3Wi@+b-x`cX!!}Kx^FCPzGxBOummXGSz>rWXT1HEsXy#H)DLA9M2{llujwPJm zj`a$YTR7PrqVmXb)fL4d?SJ)o18b@9AO8uC?=)ac`5m?6E~2Khvh z8NDY9S;0=<#%*-a`w8aP^)Rj9+cpl>AJ zU^@7-$@i#j9RK(ui+Q8RpBMtvaj%oO{nVof=d@TRfr7)9Hu#s!v@vW#&^3BvIBA3S zCuQ8P9VrR4w+WP$D}GYQhk#z6+Ba)sJs8%NU(#i&v2ky!b6!9v0Fue!1IlN&hop*} zYG7dCwdaJF&vS6enBR5N7zPno} zu3?Jr#4|-7jzL|TyK+*!Vq@vY9Rnw=#5zveL&esu1iAfz{(*W{Ru>duB&Lz^)7g#R z-ricGrxWk85aEIX?6XCT&fNG@?omuu7sM7l-5sZ$YcQ!IR32VRozl9R$Cj<)`85!w#)T>(!K6EFG=&rdEC7Zf6p6OY|%e1n3*fAe_ zI4`5mvawO=kBT4p;$v}nTKC*$i)TkKu1qwU_D=r+m>kY7pZrrA^496Pw}yrVaH1`& zgxDYqsY>x=-y18nvn-$i1;sG4>xKSjezpU6{`NGV>X&-u-2=R*?6iv`?fv#=-c{XA z%-6!kcRWZSsI7z~fG$lgViehQe|$X6t{{x{j_uV6lp-hNBqi#C5{k4G$Kr$e;(CLt zJjY{dP$=H5j=gK?9eqRW=|h5!@v8!g%c~5S^uyzcBa{OkQ=k8XIww8(MAFjItXy1B zAnU-eQ=sGuB>JcvKa2zH*G?bq-H?j8*$=2a-dDH)zYDq_IY5WV5`M-W3LZ1f!`8NM z6>d!`yIs{H_6yA}@!DFJT~wy2|3OGN+TRwVxhEo_UqutP>Zqprz1YY% zf1m?B_666M`$)a-+*yowZ{KY`n{K=DJLI=(5IY;8h>C9St@A$$VQF;HrQTW_8wgf_s1B~OSkCN zg+yVXRt*e@asnNZ@YqZ!^B#zdq$@2xce_12K&$-e*%>DP>|vg$9j{vUJ4oP_C_RG9 z>!qe2In2B^&0)zFSBY@`qyeQZOtJF^nKn@jDhiTTsm!_ytwL_J(h_}qr}(p^k}16+ z?BHk=kKYzbF`K;Q^e01!$D`|H@8b$~hhDp(v`Bxw7_m_E6LRCC?fyb)-@x{x*y-S3 z#0U|{^)3hQ-L3-^sG(brVqAVJ`nVawr|n4eeRa}7!l6P$@iS^Cz%cim-;2*l7*a^+ zN`B|sD=Zaty_^NgL{Haas#@uh<4i#D9+)KfJLpQnfamBA3p@CCj0L#w$cOmX)A zYXQdYkB<>DqSs#`$h~qqDA379I^f!lYts}#IzO%Uc-+%hFdQ;86uv5@ruR0@8-K3F1-B@3E}4(naTjZkn(P? zc6jfu(01Pu(YDccZ1-$*)g`~$xc0li3by#LRsEAMu@8o>6^_^7SFVZPn39zJ=Z>}p#*CDdl&t@@gqM<*PPeyM(Ls}=HIrsi zhxoNZXj=;{%h2`xO|k6*B-@z`hSz{u;R_>_9E5KRU}l384RJohdJv-`vSnUM&j$&S zo%#;VeLRAb)SAN)vix@>5Ck;(g5%kLwzUp;lzV?hyDoy4SNyX#?gR->u4e?~P!ngn!26B7`i+m)8z!&U!|3 zn%t~$o*b3KvEb+NDr zJNEcdjrd>C0FaL90DkDJGlA+R8OaCU^l#&(&bw~e4luLPd`^qC;Oh(lJ!Lo^YL97M ztE$3<{!&+bNWZ6~V%DoFmQ{P}Rcb3feb^m*)2d3!s>1=>yXW#GAPR>cLt5<({rfYA zgN|ueLTfs;2a=)=mSEEkLv@2Ut4&U$^lE{qg;_i$iT0zdh&rx{@%q-uYyL#nK3v*t;yY|Dk&Dsc8QtlK zeUy1bL&egQ@AxecUhXKRSfA)(7`V35e@FDks9_8)7|5S$R%xU~lcqyyF#^*95=u0( zk1*wE+2~@g&Wo@Yb;LaWt#&}8W>jke+o?EuJw7;;)~;Ye`}?X_UFlfmWa2K++PO_a zB4*n?a=k8Yv$t?H#gdsVp7x`(2jcB+62FS0`etIz3zg!w(rw;;vR|r%%@L z+0Lj-E8bzr3x9p^_FmlglE*59&ZwY(2(zhTOsXVV&$N2s=>N**70e1)>u%Be)?>71A^50EoxSE} zz!pG(`!n);>i4cfNY<1XtEuMqD+6iBKdu)xP7c%$)qd#+$02d(-N=J@{p7imZb2Xj z$oT}G-SfghiQBJ2-F<#AWj;lWBsuS8OK|cBmRG>Y}6E` z3ni2+IC~4p#1T9dRgGFT*?Udjw6QAL!4QggOR?~PMD2v5F7q>%1>4{d0&=_%`mt19 zU5TLxq}yC`Q;1@r?+)-ID$(iV3k1r5P$zyb9B;gFKL}st9CWpS6!G_ZKh3c=TLM3d zAP%l7HlfxdBfpP+-zEoVc2`j>&%-xRI5@*HrtYVVu7^OUPY^Ec4>ZsLz0RQ$#48qQ zM(NHxs$bG(`;Q@T2BPUY|8g&B%WSFMheP7+^{hwwmvqY}9cs$2c+_#n#DKdI--}+5 zB9_MBm}z)83qSmi3eioLQd=C4n@va%90CH4MHqK?cik!B;{FR+C|nScN+6psb0A$Z zc3<)kn}q<2!SW)=8iC8M!X$IQA~P&fcDWc*DOL~>(lCCoA$>X==NAHPbx!-VLtQ#t zBZAu^#{w-M6x5?xG~F|&92%83kf*D=MRsGLuZc{w`GEAb@%`D<83-Pd_OyY!&2#+U zk?arr=AX;*&)CldKcdt7uY8d%v(3IYni4xpk;?fp3y64s76FL91brv&mhJCgX}cM+Wo9x zPmTBE*ZyIRn5~T3p}N;x+Yr@x!ahkl7m;$-a$DuD?)jK8!d|5EZ67i4yk$c?u!9MP zYqUK2;dfatJlN$1t!j_8#l^F2Gy)Sh`<%YXH7B>twEs;(EPDDR1xIf)mVj#pNWez_ z`h~W;ro*BH{$p&QWP=V;Elif-@bM8tukJ@AADa%lN+~0W4l1cv#>R%OvvQ)4OuSYn zFlk7~aNw0Es)lV7Hv11v=uaS%$YhW+%$?X1R$$l_;a&Xt3W4lD6`j;9NE%1vpG8wdFQ~CnqE}iTXqO_5o zJ8BN855Hjj9}&XqbKSeM7Su&yAkn;A6sbBG30D{JpJ%M1&+d2&PE4!-Q=OHSR zA0C}o*kK0}sdKpvB_JdCFrrTk7}l}=Yxt)F6PMTY z{tBqBShar|r7OJR=s9rC3}2m~_U@}g{b!NhOYV~SEg(3GW+7$Ic8)O97`~)kzfaHH z7geCFWG)L{3MOSeU0_DGcpdF0b*i911RY?y6{AUq9|$&BXq^(#}QO8 zN5UeHc2qbw|GqT5miWYq~#JKvkDAES{`vDPmV&uqz~`$P}oNoCi>Tx2`isHRlq80 z-_+|12OtBC_vuz%wRDTU-gMg$>fvBSG@?|gKCQq0+%)^Oydzm5_ z8W5}EYkvPNB8=vs+UYeYx%Mu1o0gw@ncNt0>2ekngk1^^M5K1~d?yO`? zh}%5s(S53so^YkkrUJL9F)BPdyAjOS-YCQyp2Qzr?21D#VpTeW{I7eVeS-J2aU5^O z>*JKtG@zbf_f1?C`iD1^V8v$Y7L|sH#br6Q<)3X*Vsnp_g+|*C=j4GJ6+n?v64WR^y%~`1Qh!2 zrk9_dj!uwTO!W#~(E4f-;TH$`H(Q5NB{!be_m{Wd&9O^&V@K4V*3CCq#70~Tyb=$M z;$8=k5j1`qI-Vh=8ubmB^PP%U?VMw5RLDF}4Ud2t;ab5d6^)MHZ46J6)Ep|MAmlsz z_apj3amYK5{{ekc;B7FcD64TlA@@!K^Y*)y7xin2!5n)aJcgu0ng=f`;52gCKsQx% z<4JoK^6(}mRodppGrzD_pveJT9kU?tx035pnit{Br4>L+oUnqnA5R#t2*Ie!W~|z@)CNt!@9DRTab5q59vWeN5ZT|p7{n_TVu9OGQh7Sziyg}2#hLA72LtLVij@0+G*(Gi|O z63*Gm8~Zz8Px@iO|IM_KnqRO9591M%VA~C(K=|3pi}+T=lM*>>*pKOcrS10_uxEz` zx}bkD_tKa5qX-kzJwkAuzK3C!RyT2`Tb6@(P-63tWGVX z)fQ?WG|C=FcA4D5@^YG(#ZVGdLVtfeA(!JekPQYd=OUMZh@ulvoS|2cU`1**2UYA9 z53Nho4|1(B^D*e8+G0Zc-krUvI7^oLFobV+xn)La_Au=YB-#T$I9(KlLhgl$MV@}A zTlql_G8q}%4h<0)g|Lu_+p62a%-dh4en0p4o0^rObAe1^)O9kS&$nYG^!)uwXka^!G8gD z>FJmiCO>+90i$im1`j9M0$dJxdILTnW>@iH2&Jgosl0p)QY&%dc%S@Nk?<`K|f#o%oC^7neJRXjA^ezNG$f*ZIwR-J5!c$e`1UTJUTdqey+Pqi`iltw>A zm)$eHI`OypI<#3PJsl1)zg-lD08vF6y@DRw#pVQ0&$LEenytgsnOdb31*Etz6(}fb zIyBK-o0m=?7yw@X0*44IJ3G0)c}YPP1G|@dVKhruOISgkK!Q`gV04odI3J8bF?cD% zi7C5`6(?oZ54>S|4!5~>6h4R`ws7!;#16FtqhM#wnFQC#CA`z!RH0Zuf$_ilF}n;DhoMAQTtq(SGTFgOzd{)wC(9!Wb(a1o^yz&OIr(vFHS! zUyWe7gf%w$`9!w-m-lcqS`Gf;dbQi~Tz3N_0jA8s>Y$ciz+L3SMzZj*qJ9L>3by^` zn-io4_qXRSV4m=9?4R$L)x*JH&pG!m$Qg2Ry-@7<3g>=HqWc3+KlC#D0&fqtLyzwL zbUO7g$92GHjg0corP4VVv%t~*A#w_vGM7%?Q0)xnLcNCa9u=qt(0f$6%&C|tGkwWU z$_3Vp;e(;b;B%dm-5y^>(2-DOT}0!#`mo&d4bCnpZD1(V?98F`nDOWvbN-k{%|(4V z;!g~EpocM}S2Ygsz~mBmKEg~Z99_eWrYb__UEO2&Nm~^uT5uC`Ja#<;9)q_# zvtCsdusaXR$d)UE)#t;d$q}kx(N`Y()zR63fq0^TEik{irVXX~R#x#l|ti<79NJHRbCo*hw%G1~IlEhvu zTemOWf?SeVA*{XzvyjkFWREni!$|+W(d4H&Gh5R(#pQ?1xzHC^#1Ig}GBij0Ud#fa zdsV;Ex4iY;?PZV2(uvlu%)Ld~q$86>!6(IucM1q8r{fhRBdHM!w^OQ(9g+;?ht8^0 zp?g;~B~mS?!s}ia1FlY(tRhGPL!tPM6Yuta8}2VxzXs-d($z44=awg&jZ~s{_B`-# zS+V83h4RGB*2v#=9t)_x{$;q-z({!bbxhIg{U!PHEEWJ*H9SXtRLP*rXO)D9*0Gdo zj7pZ{NeCt#q+K5^d*kVogXv6!rFSb4c=27N0DXBCrIbU@9@{rz2&$wgK`1`yrhB8J znY|vnTR26A3lq{D_80tYe99ob-eZZAo)Zjb*JdhIYoIEMTpRfEW~`T^1&$_r-0d*r z?N_F+iC5(P`t5+{wJvneIfyy#liUnswX{>~3=1uxaUoL)k7WQ`)Z$@DN6mtzR=eAw z=mY)&bbclfWa#{QaoD7GzJ7D=0>;qIYE$1o9?CA`adzEY|M__N(_ij=;)?s?Lnu)S zeB*()PCzxc>@7!$bX5ut5z*-Uyvo_?ci`(T$9T#S5BitDo@T@BZGEp32Odc{mDg2& z5+0XAng<2@bP66L?=Mv8UpuWkfp%>_KKmB_t=R|EX4|)pF31!|pwUKSd!-h_k%%0U z&DKMGfc*JWbJcsb(q$ZRmzbG6H^ly^$vLmV-T$+Y&*;bK0V*!;cX(vv7!r*UxT?7o z){i3Q>o7ut?Eft!fXmm@7sK3U{~|99h5S^&XP`pB)C}(3;2(}0SFx-AXeU5P|1{7| z02hNGo(=Gs2|d#gpD<=HZsQ$}dPW9CKyz2tdrLJ<6C0e^<`L@qhYsiydiMU>f+ik~ z_LpW+Avi~(^OXJP-9?H@S}^ zZ{b;#9xji`-~OZC!79IJk<>#53CTe#PCNy1G9vcsN5*JUIWSK*U z9oMU&n%|(oqLsh!jH(O<;#)TqjJkJJCO3PJN1No)q67qIXJ%N3Q^IE1S6L)H;J$$A zZTBUKLNON?7wbPvfoxq)P7c4x=nxUmpDdc>FgIy!we0A5zZri8$T5QzN5;C>H}_>V zX@zR)e?e&5^z7S-E-bM%9~>?`6=)%^_($(PsSfUfH(^DwvgI>+mOVk`p#TGVQmUvB z47pxp!AE|W#Dg$>Y9166yfZ)&(DfD2eYZOVi1)u6dn*U#i(4_7*ZoQGsCc^Fa#R!% z${ZWtXHg;+h~De@*Zy!JNIW+23YvB)sS>Ht^^O!BL$g5X;Fm0oaN9xxwT)EDrZ}wL z$7s!h;!i#U6_I-J5~sOFd281jfSHb3`H4rej*xvQUZ>EX9UELczux6|SC#nQ5EtCzd`i-VT9W{}3%^dN%* z?A8ree&7{cgd8P;@V$$lwHE^9o(OJ5vzQ93hMXUTe^?g=%(3hl`snr+n9Y(6_iS#4 zRxs|K$pxWEc+x!>d^XKZrBia|GZuQ*a89{$VB5n zqRh|UDz=A zg$(^d__~AJ*-6tS|MnF0`4J3Uy_SsB?>qfnjCaty#x6bu6vG*UxyXo@q#8LZ;89D$E{rX6Tc6l9dI1256CU0d!f$B*mc7VCj+diev@VK7dwY4H3y}qb1BBB2Tfmi%> zohsKcwj-Y}UmVt>E<~M4V)hBHn{ht(M>)3k5CC->tcBt?@exA_4P{Qb-474^2idrt z)SnaIO{yfZ{;1ge@W zYDXPTfnX;uP+ph4&AmmF$OyknK@lm_8#;0_=r<{f`scS7>HLQU!mO!a=8Su9wlY_g zH^#~VY8eM_Yz5rjEL)svUTnaqxg+sd(Dmw^jSSlQ;ebaEG&vfA_7S(Ha=uxw!+k#9 z^lD<%a4`BQesdQGp)d;hB;ly{FZBJzL*ik2UHkpwA$~`P58)F2(|V<2@rJzzBE_9b zAl)%M4iUlN_s*yD9st(Q;@{_ejxX_W4^PN~6z+0D5E%YShN`s$|EBNni`xElBVk-a z*=j`l8|9(;RT1GtW*tG4!oiEsU4)cj=kTs;E52gRSIdP+cY(xxS1&i6s~tNReC=v= zz{n)Uue#GbVyE4@qNVPwZr?fm)Yn*GHG^@mD$W%<5>iB{A&jfX zp&92G$J5uAL4qNRMTEMaB>i59FHU{v)5YUh)Ihj5YGM+DNvr(f^c3O88g`?Ru5{0W zNY@h77&X>mTO!TflbL9nWsx6$KHFQ1qvqv`dm_(Kb!+AP5XOBB(sb zWHIpt62)W+NQy-cZBkWp(i&PR-+RnnuTbuKFMU{7sM}65)|H{k$(K783((fRjohOAp=o(I!!C>S( z1EtLs;`tiMIjnR{zEnK{=Zhy`zdAK9Zi10q)aPdgIJ5U^mU^!0$lP-4(ZK?Ef(0Ro zcbW%@SPC!L?9WWCbqO#A5m4UiF`8G%5NP&@SoFeBhbK@Nl%BZ1+%I}PLIb5w zd3@Q)^hs6SaBxhcP;B_@yVQ3?2nN?Z;xE?|xbenQW^7%QgX6Js3(x!c_HHw;&qQb< z_TBN@=uz+0ig>We+m-~)jxGp=)RDvL;cJtk4R4}3hRx@5I6`z2q!n2facHGR+XfgO zNtX^M_;Fqmolon4bAMivczC_h47k+p!|RHw)u4NovCG)$A+|IjE!k2W#bKyzIJ9f% z4H7`@b$$dTDD`u?;i00Om$gGHwVxMLL#nhnV;dJ0f&?v{+10IBnOk8{FMqP(){&l{ zLIN}3sdi0|#PC337SlhRwhph}%nnX1i6?=YEDv+#2?8I$5mFI~_)vjP@8PVC(APPD z%b3B+*u2WJt2O!Ih8l}M1$>7KS1XHlY=$JdYDL0=D(ym(rb;yEOgjX^cF4P2yxv5C zkswjvWrFMRsBsS@qc$jAtRV-DVQLjY2At=xPJ0N7U?S2W@+&@Z&US65$Cj-4`1Pn+aX@I`@&Q<^O_ye?FAG_@;Dm;vY1P(ajlERIGJ!@)6wKsABMQV}5% z7ljQS0FipMjKhdfMS@ZlLw!$5f)6ePSHbzoiB&bEJPA(wcCxCrIKi=>wuL*vS-B#@ zq;dyY-9Xh?dALHoo%fbo{-@Dp<7DMc34Kc@9cy3=yy|s92)~jZxqR!%%l6&UewmBy z-8m=PRD|k27vlt&SnJc108ISDm;0|+`xKZ$%*3f`rf>O0QeYL!LslZqgca*_HS=RL zBF+&zdw&08k?cF*5fb494iM@;#)@{lQ+DPBg0wBl)U-=Xa}l(A=LMoM8u=H>QJRrn z@G^Q#3XUu}*iC|q67f(6c^G9h3azp6Oo6w`GRf{nPZJ2h=oTTJt>QLK)0z_;0^xeJ{pSU{$C5=jo?gFg3~V)H;6KH3`%ubk0Y`A?2?Rt0wVzmh9p8LHh;kf z0#;%bYr=_MyD7}Nbuv6hG8IwD@`?+4il{P&lGmp9uhdvVF!?+G}Qd48TJG0m|5eN5)pu{>u5 zzPWjgq4aLefG&CFgNb-ajqHJF-OkrrnsSkceM)G9j-8yB!l--{7Uvr!=k)vY(4$rk3Nfhfhh!t z_Pybi41J|8l6yTXEc94rld?7>CGCF}E#{XY=H_wdO#B6<$Uv`k@CiqW=oida5GgEx?s3ydrRb5f= z9o;Ja4x76~=Yld=2#+aO|FgFV>TjKJ64x*dk`|)2>waWg3*77XM>7^uh%|5}3!`AW z);rFiJRBTnM+i}r20EP-A-w$s z!%+)=Ieq+yydX$Lf+|XOMscY=1lv}9uZK;|uagt(`^8l{y?H&zaGe*I6;|4!Tl@*a zmli9QxRt-9VX+h^_=Bh%`MSU82I2M4Ugm9Wl{;B=R6l%ZkI};I2Cl%li)+2Qh`QW0 z>^lefKW>7cix3yz;;hB1SQix!zdT9}mDNiTMe~G8=V(;jZ}bZrh%330`WKDhw^Mb> zleiB(%e=@R6zt$QDkHq=e^qEZAwp@2CLksYBMJ^v&OKaq<&9C}2#ij#Ix|IQ!f+8LW<78ItqSYW5N0b|J( z^uH_V2YSKK;u^dQTEC;}?ak0C4(+uP!@_Ngk z$vb}9IhFK&=!=km7G`?Fdr+t(fk=Wf!1m^<2*rLk^;3Zcz>p%;x6~g^yq`5{8P6RL zI+WF;vJ78sjP5sOswAELyd3s@w8as6pHLocqDze{e({LBb-cy$HBJLb@~OHP4+ z3(c>WbZnQ_CP?xD5iw`E#eOk_N}+i7pWOhI3ewqWY zJp{eKt5@&QZ7AOI=8E!0x~0MKQMHh*Z~4c_Js)1xXD{yk)ry2h>0BbG2RJ!U{vVO` zT|bx8ifLUyVBano-N1@WdtvY zpt8TKpHHwkPH`P6?t8nnf-DRUgg1OwR)Xfc5^bRtqp%1*~QrYZDi2GmgtwGzP^41uC zXAcA)YFZL-eQo>B%9}FFszn5Gn|8Xhw60yiI#`bm@!3W}1?Mh}2uoPF<>-6YMk1Do z6Ci|(gkfJuUwFXP8u#huP`?qu>S;f26CD4fN%swya%2q*k`=ksx`D z!77WN;|DeJ_-phs)5`}*LqdG2O)&0ndP_?DL4^ju^jhUa`b_g3IbOauiODEeg9h|* zgkUD==@i*G```N5Pp@x_{rXGM2~}AOn}r(-Qd-(PLH=pEV7m#;tJw;e=)5SAaQ~b< z`Vm>i&<+O1!?pC!be=L@5_xQ&U)Ky&vp3;1(d>8HrNAR&ZL?W8a`?-U-3rd$4UC3?IFAjr`TMQIh9Se}23j ze1*+acW9lanBZK zYy%C{1_J}L{-b#}ozj;TvZj0+^0pP(gl_aJJG&SX8hPZkIcxh2jkZxx9j^%A8H+8t zlv8QsHBwGh6hldQnk%U_j#jWhI>P$TW?f`GjPKsPjm@3F7+6}$6~@-t5>qQL9Ny;x zmAB$A;&y<1Nv%XQG1R}olYDz`WZ7G?nFovQEcFX>-z!`)VRB8triI{{lTbKUwWVjw z97*E@cxlT9h38|yX|6McK%>59aP|*301)pu@2U_Z7a3LYavv%80{U}`Xk68}L@svw z3xML4Rx1`esriZa_4htoi>y&<`?)2dBg2T|D%7uwN`u}au-QadU#9lR9^=e*`_R&? z6%Pl&HH&y@o_9&adiJ_;a>53Xk5Z&F1`PV%=-aVWlo;0}f?aUd8)r=5Lidr#uX0Fx#D(ma; z*HQiJKG?p~Gn?J`IPxnoNV#jZ=EJLqa! zB=lfh&UVC&Cx-E=nKc%b=--pQp#jx1UiBSqo*NW|QZSv(hx2Nj(6rGaw^yEh4!VP| z#*$Xf`8zic36H=0#G2i(ob+_`78zdk4|p9G3BJ(}$AWDKJ-dnrPu%g`lzf}nJ4)r_ z>=lA?7(*`B3iIrRw)uxR|C)n$y9Nw@cEgsj$Zm>K3{nxQ49taw!W;ArvxJ|pCoXpj z9G$?LjIv(Kb+(j2wJ1KbQBQkI7Nx&HJPl!0?T_n@T(`?B?#uIXh+|Tpt|@j@I3J$1 zld)gpdr$)mZOYuk`v2t@;6bPcR1wz(_SUWpo zLj+dl)jCK%;{`4FvGSsU#05%n<~pc|)_i?!f$dPjqoi8-+vFW1-l_v-~rHVS+ zGo&xz{qop*{R6&btIX&!=vlO@ynEV+_uyo2x3olvwye61^;970o(C)0M~UTTc*yzU z97H`49cA>#`&B2!Opj;^ceKgoI9^UNvqK}wiEP1i7hhVlFruZ^>% zcpr?k%+4j){7m`b`N8)m>w)(@hg5O%Yzb2laN4L^_}YJNoeJ3i*y(m5UNpDe-p)r# zOuXOR%yozFe}f-6iNj|AdAotiUpN`8DR2i3&rNLo+T?0fHY_A{Y&<*XzsT&PeF4yi z2S5Wn9p7Qm;r&Av5d0AaBsxtMEv=uMSMA>3#?QbL-)44V58?TpaO01}U(*j&MgPTx z@>XJKUGKn<=p2t`(5E2lTQXag&(m;;F{{gn!E@c2(aE@%Q?FaWjG4o%kSeVro{+A# zv?@#}JpzC0pKF<%_5J=(pn;8dQr^|}`7V>NKjPGP;f*!U-1svAuid(2k2cJ)+O}C= zu96zA`|o-Jli?GA;a3;3`gmNC4ub5TyEI^m)Y>;m@3N$@KYb;`xFEiNxE4!?Mdj`b z9=8Tvi~F5)WbRwzy}bc<&EMeq=I60JFf0ZGf@8V91LTI;B@I6Y>#CC&@uixU$c3TW>f^qUl z6>G*PQZJ@0kNws+9x?zKD zM!;EGrtIje{0g55nJG8Tsyq!un5XOONJF)s2De#m&p7@oXrxb81i6gtQ8DDIVD;`AXGy=kfTnT5_b^zE8# zw?_0uC8|y++WZ;b)6~FqJ?oTu9q(XMaQ2xB3Vz>L<~6 zUMMOLn7RS28oMrubz_vx9ZXBjKzUZamq?e(B>ZJTj5df)W5~PMfDm(DDp{egFgE~u za9*swE*5zde3RPam-V&e!rY0enEzEp@O>tQIMm3zqVA;}T;&5Ry0$?mwa zPCc5*L!dOAha8SeOG_(X)JJI|0b<9dZm&gDmz>xW{qCB}7j^o4qC!(1vv(n=&_=iP z+`>W0B_cx*aV=CF^oPfAAZF-6{cXTTWMt{kV1$r=WBP3L>t~?Q6M*YlZf8YNWvt2h ztO!A#y6Oe49+vG#PS#gXr=pY6?}<9F_+3g(>R;+=%CwuyHZ1VpEmQ`Ok#Y;Sq}Xsq zo%fJmvc4aoY)IuMs&IM#D5VC=1n|)XMNqki%e0(xI6$5Hj_Sh;2TKts+P^o?q|By! zmL?8Zu1a`*dvsXwLG9hPutYb^dPg$Q?+URfDWRAvqIIYqG<2>4>OJt_kYUn(alh5xG#Lk<@r)p?*8Hdu4ux1hYbv1d8}^jS2#>+=(@g0Z z56<-}AxhvLqDZl=^gUDaXkgg(ZHg6x`5-Xem`J3UMYD}XakK&ca%y!=P zav;a(5q4)73Gx8uQrh8liKbr^Syfjkvim%OqfjUn8!r)!R$wl?sGpxk8|^KQXT5F= zktQW=Y_4Pws9$~BIrSZ;(yF_n2Z7Vt&y1u9#gco~(i*PtGSkv6S{CxvIh#;3l5MHN zd4&2Si{f+w^b!h05nnf>VKIZCU1z@F^IepW-$4;+5F(YymlYO9t-oHtShrNQDM~>{ z#Ad&-Ou7|<8w(7 zam(S8vgY(x2@!kwBq?k88ZDB-+Xda&7SLFdT6AJ zL62}Yc!Br_cQn$dIsZHOpdcctntl6vi*&Kw`y_plZs~GFo;N$@rKG%lW0Ua{I2ED* zZH@SLegF|3*Vo)VgQ&>RSiTz$ZRvT!*Dj{b-IBoW11XXi9g%7r<7AQfeKkUTY4=`c zgXF22;VBKR1JXyu2W6Qek725)$(3AXie*Q? zZm_?ZO|GeuZT^Nw5HE>!NT!KOY4kM;gu#+2bo>5hN2C7=l2zO04qTuHbyT`j)j|Z{ zRkc=i-0(4@p{l*t%9-t(m7}`LWo9!MO`M6Vjy0HSpY$~b#?&Z$UTVO=;2)fp$jh94!D(J30-bO7<%E|zl_nfK4Uq3+HP#68oIM3k2`PTRj{ z;1k_s@R|+Fww$-VM=&l`=i@1Tpty-Q#h>yT3&>8;;F5pv8Zdt1%atN|dQNHRf??z> zlOf$f*bzvq#eE7of`5Y!xZ@87JW9tF}Hr9}~k2()-vUaSP zv8_sa@OnS%E^*vQSo_c4s(2>3MAwMMDgga;^<@Xl>Ou)~Yr2AJx4@Q@RZ|1M?o~}W zIyjnC0h(XZ#U#7h+mX)PE3}wy|AQz`^?HN^6Z7-Ja0!%G8Dbp-C3H`Dlh8H@Ybbnt_>ZGjDKI1 zL{ay}Z98hm9Y%j0o*HmU*!Jn<6CdH;wnSKbNE34|J|OO3l5 z0C2;`<} z&-OEJ1sav}LAfHP*ZN$|ibq;)J}y252|IPeJrFG2v#a;;uFZ4j(A3-J z?+OU>@Y0AhAN<)&Hr{=AsR+e0sO<@5nR&xxnKqPc+*lRMVeh~(`woMBiOp%$(*1RX zvv?-}^b+v?`qao3COY%f^mMi}dQ9JFJbL_?>|~x2-=yaRi%2mO?$ib*bMkt_sJGcS za*0squZ9TASq_jb>XThT8Fk21a5Sp!7E_>RpOTJ6n8skQ6j2w8e{zn)j|ea2){(_8 zNVeK(<9TCu`1j%!B{Iq}<#Lq`LwAFdfA>uL=+0!!YwrpMF(}N`1!w`0AJuo4RHHb; z2oT%$M};ic>Z%x4#}##yx{;}X5AN49B?Qf^1@P^9{PjYHAw*xcn^BZKp9(Z9PR>j$(i~C%;A4^ z8pV*6>gF{nN}DtJKxM@asCblI-`|KR72mo4d`oDx+o~Aa?UAlQI4M?XZ`z2$u z+2pbc;9$PjIDms8(?GgnEk6l(R$m#KX1?YOtnfwJmZ4TC5 zV4AWhhLep0mB?M?B#Rnp@2*W#Rq=3z2#!Ba0>(ec`%y5cKGAnq>ztZ^`G1GepO;mA*$#ZId(z-rBk zd?Gxm>dHaY|NX<)lO~PX$NZ%0+~J?{k~{@ozqyaE6EvjIQEOD%tUQjnLuu!WR`{aW z@^C{?%yb6jg3UTf?&*@<23Kw(J(>M8VkxRE)QNL;bk*PUH@gS9U>)lURpozVz~G+n zqGPQ*d0b0)3-IZ;Cn5+TBSNB)|y?ahX6M!q%#}@gL#Y5Br4Qy9~xrV zUrLk|(UTePE6Uj7n-Q-^mDq*_5Hu;mDRcV!0!4;}_Tr6}jz2*81sf;ZtMg2t`_*Ld z;wnv*Dp7WFen2ve5TiD6Fd`lz;+FxWJ{rsIecS_Rs619YP-DSAvo|X>Hc~)RN7ZL! zjwm`6LcBbs?^zFnEPR*`$x>eDV-r+b5A5X_X3K)I8%uVXR??ri3O42lGdP347a%4P z3_nMPMK>didnV)iBzQ}(@X>H0JCB4+4FVAB?YVE>n=P*~mi$6aV)KGNsu|LXbt_<^jes|)FODt@BKF2YkHHmFC$*mGb>)6vqJlS;%C z6(bmD86c@eiNb6JOThetsG9>>_pVhAOvTgrIv3nElUu!prqGQvHADaJ1$f3dxN&gX zim%THu#bOlNWqhGXkM@nX^zvHF_Rsl*%4o%>M}DRWa2H;mh+Af<+H-J;aBLiHV`zA zdURc-Mq~20N{%YUST*Srh;DO!E#8+1;)SxP!lPo-u&&K1>qKY^ zKXZ{a5JObbPc({p`f0HaJrrcT)F`Z|3>GNy4xj**?gtV*gADP?#m6F0Q{0+LZO&Nk8s?DN9`i*lwW@Vsn1} z-cF^vATFSESS&wY1kCOayd~Sqz4?b_N`>(HVr|v3)+Xo=7I4FK|qMNPfdYS(ev{?dt4zCH zpa+Fy*^(vPCJH8eyP-l87J4#<9Fe_e7t(A*dG$1{$XWRpUWV2u@N^Y}nXt)F;y>tW0yThQl zIB)Jw;e4D<*}8anBBd&Kc36ts5gu+haL{c2PgSXFZvF}xf&`OqLz?AkjcDP=`gl(Y z>ECF5>ct@yUorM+nAdDT%bwri|{S$QPZDzZlV0agx2d^(fr*SP?ymM<8G8_MeX#qovUu z&;-tf0z&eF=FJd_NZ*s@7vof-#7259*Tx@)e4otPl*`2~^1q)9>NXkl9OPGrv$7EkS6ill3>7w*03IhsFbAwBlJ zvq?%sS^V51RFyED@ymD`T)prv(QXXtihtXg4^y0}(pR*ZMS}tSGEktUrQvjMzjve$ zHbg<)X&Yleo~MTrfdCAb29~h2fP{qNkZSHXJsH{9^!hU$a>ON+mnA(i_py7P<8CL0 z>L@VQj%=I(zIGslhkxLfq5I(Nb;eP(;>=#3#$U&lplGqX*5MIjpIC`ymwH}T^yG96 zx>s{yS{H?E_RGp}2Pqp3c${wUDW{jf6~OrTd?^%KLbqyoN|he{RR&vldkxDI3u~s5 zytnYjqYo4I$Ag+kJ(E!$ieE|fkXtykcQfV>y0E*r7rTLT(E9hyejHtv-G7~rT!I{T z?59&+Nn0_Su9A}aPfrE`SrHSarlx=ZiE#9}xcF9K{|~_&zMo;mXfTu`=#Ufco#5UH z`{(gRd5QR0mMUE@3c*yRLa_?*ZHwSx$p$=jISi9ct>C3FGt$7d=jFA4UV zHZi}9Kzx1U2hQgwb3h3(Ojdy4Nd0Nc1+|K&5LH`VTn)G+iW^RwdPGp;)G_S zHX}%CWF~E=9&`?Hl3LAyb8nHXP)aJuOQMnnPdN86W~GsRS-4yCeq!CNlHQD@X2Q2p zg$B97eY>DQtt?~cVfnU@+A6`ge_jV!ZEY^iXO=rP;LXNsyYQ%&XVgZOo)ueXvmcmQ zWW)k)sF30%!{H^rL1P@5Vf}x}9f-$vEe6{6Sb?gJ$p=3SH@>?L+HhQohzoPCD6>xB zmYuS*5>@2`S^MkpxJwlB!~*F#>6Wo`=5zk!K9E`QL|1 zSr`)}K%rRTdDnFpk49#keHXf`V>d^1kKr2|skaSuV^*|PxSfB7Huw@*Xdetr*5`Wp zkSoFF=H_M<6hs9e1_c!9W7n5ScMq^_O?0)=+*TUCGt6=Y3?3eq?uGB9Db%GHPB0gb z(-(bVTdp%*2L=O(g7pa?ptUaY>_IYV@{nXtap>rPguRVr^$($aXBfmF%F-i4(QeSe z29%k2@Ifq>&(njYk`2#IsP{iEVKx2`v2m1(c5ZQb?X4xU?ng1q&im9aDJ83ejm#W) zv|@_esy*1oVGBzjr9wi+vVpfhB4d`?y%k!}|FrsSx8alPNapt8lBb8&F zzMF!l#!UFjFzMFGvEe!f2kG~eOn3$nMoa8l-9k2^@K*d3SPT|O;$X{7e&w5G&BK>npqm;S;xg4gD4FwvRC9r znlh*CH05=}OW5V3=>&HbqH>}&9Srr7`C@p{kBOT^-{<#=_LYO^ANLut>1% zo;34@L==SLc+yK}FX_EQWBj=2{kCeDS_t78XGTUwl&dvfE&eWXxwtH+sJg7SjJqiC zHN;;B?EY_vNG6Np!lGArVbyK!eYapGZp*FfQ*bFP@~UJn?e|r@!vshI$YbVTl%73M zwK3k<&JI4OZm&ArczCj(_@m=lXq~q?!r%R#!l&4W*p$8lu0h5erKJZ)7;n}T^OlFk zKe+*!rrI|^C;Y~Dg1s9zOy%27A0ztcEVf#DHCd$xw|@o6?88%YbS+r&T@ud6b68hQ zdnlHj2l={0W927qt1q2`cgaOq07~6%9SR;p`R>8$Cm&xwXvIlTKQW47z0UUe}L0KI1N5orU+!FD|A%+#i=6%Vw_qILxj8if6II z9E$788m~yHA^fT9BfgL`k~wX+RR~i_z%>a(6tkR3aFmFWFtHW=Zt5SUI`Sd(c+rgz zDqi5=tHG^tv$2%d@1OAo|6zUNDeulrnG7)Y>HEW&0JGD{?-<(UvTSxG7KoCs>CxXN z!6g~<`_E6$988ts8ujuhC(jhm4j9$!a7k|sE&dZp9p-%;(cc)#*yGVw9kkGn2=Wa*oEJOeo3$R=T}J~$>N?Z zh>uF4GwhRw7%FhrNndsKSJgo(fXMB0KiyH+37l2}J(=X_9>5L5AHIE{GhyQ0eUiB= z!lLrBmJB9G0bzl$5$x3+l=au#=WtL0{Acu)EsjE&P7WGI>Nb~3(8mq7qrSMW$T4J} zc$xyPnduwi=%53^2(l$x^lUFp09msbp>ZiO!NptLe8aj}z5(I3c4H7qfD6}diyUqA zM5^`P(hkC3azOw>^U`BMRrG`wfs`1!32%gzo zUTLZFMPK%#JxxMmyfQ48R$O0P9VV}k0zw}3V;d86|5j%wv4?x@H40v69nQf(3md?a z{f^PI$CnEC!!JX>60f-CX=8g;{X?X#NjrW@IPB$$qX>GStf`*bjrI0N@psv#$R3ZS z!q^JbjM9E)7BDZiq5=xRNZasMtg+zT?;F^lg?-V)KSPxG#5bKMNK|PH)A-Bo8=%lB zaq>4paAw|QFV)kpBd^V>?NW^(!LGhP+=Wds4 zNhTi_ErQAesqI7ayNJ(e{;;J`sHi?bY4n)FUt7^c?GC1i}5+_S7{8&dRV0_bp$S} zU$MSIh3%m!cag7XAtA^Vo&y7xIf!7%out&=0s~^nk0i~`$XmZewONx)FQIqn<4}XY zQ!AfD^s!nw;w%k#`ZydMd7K|6x3%!cN>!c!%QjA~xKaL@59HwRo$P->0%&P#_d)18 zRQ#$xAPwcwbk0xb2u&9|N*j{M(PJl5(*eWZ;d|tES(22-5O=nN|3*od_Q@^0V30a^3LtDjU{z``xy@V1*w{E zyw|fz-tfb-TAlf-^rB&_py0&e-dgw0)Iw|AXU^}}T0V(?;t(-+-^l4?JaLe)_*;q?oKUEn2zV6T2TE&RT=hB9=^B26DJ?}p- zsP*#Kf$*n^M%A}W|t|o_-X6y+I9em6V?b8OUx$`_S_kZAc`i${T9u0 zHv-=#x?2#u#yX4>=ux&Q{8%y)rjBX3;j$D>oRwQ1E`3!M{Bir!!{_kmmqE_g&V?{# zl1Byq+Lec#?!}Zh>g3Pk2kbi48a}=cr|N_xBo_zuIS?+Tcba5~AP|uGJzwkmJGoiu zM?!XwC(H+g9&DoZrFRaS?Vn`_p5@&v~w zzjDGO;~w)m(Irp7?qBNv6ioqro+(gz+G7`dqE2eIgJi^9ln(eyb$)u7?3uqg?htf= zJU;0@oW{{v5tzerkunrQtaIeYFDmJ|r0!kSx9jac1qB2qMBa8V0z=Rwk^@X^gIkyf zBMA<3Dizts=_xHxfNe*5W5Ow&)0BMH+t8tdW~vHxE2$a61k~o4q)#~S+TSr{#{lH< zf%Cz+e6M7)Pe(eczE^Q$$$I`dfi;WmI%uWN8#SR_+(_ z!=s+?gTE-tzcpT35I7*%#oej)&y&?GyF)?_+dPjV0gbOBF&JqICWfq0dOlG!*^kj! ziA&q!35spH#yJtSX*jr|cjIzLq2O_ghale=q~g-Mzn$#!4GAn0C`^L3w5O#3(U&Y0 zzp3K35D-XgGx%#-4{s)i;RL(i*uPYDM?zME>s&nQU%#90Y>++DtsZ(gIwqXAD??}v zUG?=)-d)XZmD{>Wy?Oth^G22+%_en=Itb<#%|!cG=(_~vDTJsJ02juaA~%74dN8<) z;Y=V%Nd@b@HP#4=W?jbdO^UNeLqmylDA2pUvyLoS;%a1cw3W3747<2^L}@4C)d?Jc z+`Lo0AAu?(&&_&2wcp(~!gVc%5AeUc7Kx?I<9#FyqKJ=&)eaNZ3{neTV^t!AQh7d> zqJ0m#Kgs4NGYl?#N?NW~VX-6o{`C#J$@|Aq|AMSqPPrnSY$^T);vjm(FVq%!GzTt= zoApI%zm99jjT;QzE;6jf*-dQRkXY<&kd~@mO~?+?0M!0Bq@$ywQ;6Yr9jv9NcV1#n zi$sVWumh2m>ImV#&n1P_5vicwAH3U(nm|TYD4l_gB}w{r!5n^TDZ8!kDBbZCFBFOy zEni<{e2NIWJVd@~9BCqgm>lDm03&gSJB`04I8m4L=g_$+b?j?6K0V^_^hc!kfioU-XW}8Go+hLFNAb zDLsqldjEwHywcCu*5Cwl7K_%jT0NS7V-LP;xZc2dEHj9I7};1|Ev&C+Lk|k5HRzVZ z5W2^7>!ODGUuDf9k1Q;A*umQ(+1An+Z&PmheQfbEV9*{O+n+s>TMa*1&QdVl`T!jX zoPJ@a*Dawe)yPg??aRA_m;hBVv$$uUt`D#Dw8?Pl!-AG`n8SgrQcj)Ud% zCJd|(fGQDbo&AB^3+%;Da~IjO19Zd;GC~}>MX0a!z#Whv8@|-v>c5||RI09~L={+r zb}362N1w;=R=~OaeKlA1S9~}D9O;IQenyM=85SoL7$MOd# zPD{huA1MuL4Ehu`4f<^+H0zc0#hTS6Mr{8naEu?5B!XiEFVT{I(FXj#7a*HR40AAN z?&tt3QL*#abgs}hh{>XOY)tk?>spihmBH%r@+jNS-pO{zEewz3p~wX$qB_lF3=JOuWa1xaVGVUH)CYeRn}qK1^W$} z0fl9;YWf>YUZdsAf5Nqs9}-%yD;f!(J*DJ`VN?l{-0S8-Z;+7) zO5-)2xQj?sFaH8ozl1z0PPf7Y7Z=o@d{O`K)wmg_Rq9EBJ}d|B7~Hiw^6Ei4-Q5BB#6}= zIw@Sy6(#ZyQLFs~rvD1$GXjWnTz?Ao*+y>x^jYG<@p&hj8RPMPonF2%Nb=sUN<$kHT>iZ3#}nLH@KZX+rh>DJH+Mje%MIb+HA`I^!1B z4Xxh&MXoN5oc@FAvtI^zLl)IRZuA>G6X+ggJ(Wy84xuNwN|*wMQFQmpv$ou95PT9u z;g=kQq@oI?iUJ`hrES%`7u;Nr-AG+`H0D@RDkAu0;{~7;=DnVTgCgV!^Y}&~ol9Dc z8rfOPF6U0$6~PVVc(oT`$pdF*{a65vKaE){3Jr1TeNprsj{Bb1(mvbbYWB%vzE26j zaM>?V8z%Q+IYE7!x!bR)Tf1Lo*SQ&Pv;~= zBd?FS{lTVByG!u#J7y>3j|XnXu)*~3aQg``1kOYRO24t4@|q?r6^n-B_Z3i1hun7) zUsXX(;KV;c9ttzf2ZQDhV}=0~@WJgiZCcVKl^1ACO=&k4zVOMqOHRgn%<|PUMvb6I zw-Niu``B>z5AX5*CzItoFQKd)MSK9|(yWmML_oYLqRaK@&(dTtvf|FVJdztMQHd`$UYH;;F3?a8aC`(5UUe>(1+2pkSmDlDs1Ir)xm7`a+qL z%rzYf?z1}!3~UJukm&;|E=?rr9l>Dm<#a(y#}CWqjAyo7lZq%j2aOspMx97qjR;b= zAjrsxo?h^=Ju#6$$ZJ^K?)^4aHWS%k!7lHk5$pg^G*NC;70RsDLavx5QN0k#yc-sm z>Zac;hYJYxM@&;8tPm@eTf9&*jGs)LvJLS!TucJ$>bg{N)-t;*Q~24hnweb{b7TkG zjoyb5CR#sN}yxgCFJUtaFv$L}YAxSYZ zewPS{SaK;yM`>}$0EmN<5Y#aHk8&i>w4Z3{sk;gf%z*z)Xu-T*BDKzQ;$l(WZCZWt z)04c2qx~?~Kb)84J|H*;mWXD?OnW}NcjHi7w8jVZU|uXG+z;m!y({Rsoy^$cu}sS_ zFA(XqGee+z4dxSd`Z$js{%B1~W z8rJ+si??R;%kGOw4JamK7~7sZ&GDxV)WlzP2)MFIAcq8|F^0XPaS(JB4;hKUiHT0i zLuRB9y@XRpC>GM-n>afs^}PJ8y>0(_^pZ!z#>N&nH1ze)53WCFuB}>bVMg9ngDn$S zE7qw5-5e&G9^Z!2GWEuf=0Rc#oT`>D`^dN`OeXEcx3SuH0q~Y5V&Coew!BXCQdypp zjHuI!)Bpze{v&G-F>F?xM375MPj@(VJqsf70!e{`TGqI) z6W)$>f^kI>2#&VLfH>645f9d|`urFuT;+YiC^b=1zWvYP04T)3GZob@bffqsONn~T z64=(f2%56_v)vZ(s01OCR#cKBF0;GbnO3IJL|W3HP^#4@)sCD@ZAdx(er4j+s9Rkh z)ToS->I`%%t4{M}A3xrZnoa@nsA1i_yzqaD{8r!4+Pbd~aOgwVp;NkBB&DP!l`cULB$V!u zPU(~emG15?5l}!tI;FeeTio~eJ&%7~AMZYU?X~6{YmPC;+_Ak_ClxdiL^J&<6)Ffe z4e`JE9?RF=-@lpEYIeSROR!U_Qc}Lo8B@ z(|tPnV4AkxRl2b(2`~iV`fEIcv%<>NW|r&z^g97=zGTHG^&^=MvECm^TMfhW*`-PA zm83Y5CJ553S+av@re^J*Hd?sgSpP~x5}S)b_%wDa$z{DI>f!d}C?hBzT*fH}O27G{s=QXo={_8#mQ#A7e zJg_3%2F&K%5}}=5=txrNNLrEz?u4=O(H{mXe=9-FuCkk>c-C+!v4KfNtaMFdAWFUZ z&acYf-^{CPgGP0T(o0!cM_F0-$iDB1{L4g{Eex#Nrs1b_iuC6(toZy?eP~Ne{>xw4 zah7dDN{hV=lJRXPv~k7mx_~imAwC;2=eEe{p`)5LfO#X0Hd1fA9RV{8Dd!ho>eU3hl;aP3V zu#@^=u$j7akrl6-EcZ$Xt%^1dMTIjkE^zCm)l=A?>dH{(^yMQNTNqWRcbfN~BGVr6 z%fT3|7JJ*>S+-!aX+HA0ega^jM9L+0{vt_bpzw(8Bwyu{0AA*{Qr`jSj_%`eQs_PQg!{(oXvOBT$PCmWj+4B}r2;wLuFV@KN-M|GVrEdUbX6je3-=yrm0N zebe=fb#*wR%|8@|jc7@YC}Z*WkzY#91T`1lzDB+vhGC|s=03ft(-#n&ZobD)>f6a? z6q#%|bZ?897U}Go8;e>Ns7EA<`P{DaC9%8c2mezNdETLjvmf;zp1HCgGZfZ;>>u`R zTuW3bRNJw4*nPF!WyUuw$tX7MKRS0D`%=_`Pt8~Z1B;b zS=I?=*|*w|C4ykkOY2qq%GkU1!_=3w^;bGN6)i21#jnZ(LT9u+P7UxIN%_mWQ2qAA zg;*Oy(8Ups2gh~s=JWS=3gooz*CZ^690;2ET$BIdByu2Fe9&N|2`Z2wTPoe$Ez)Ep z-`B&KUJph7UhjzRQ*yhCZitHpCHQI^ULLw>@g|Y#E?YiX2OY8wL)XF!jv(PO^Y*43 z6Fq?m3JE=}=7y~Pi&;ge8VFI)i~psEJ5OD~mTd6ljki$XF{4eEuv^uV&%gkrroY8` zyyYOAQM-|(F!Xs?O@cz-FT|Jzw|+Jt==2{54IT^)IE&ua=lqn42}Pt9^lU2s?y>Xp z;G%!oP_YtI7UBoQBx)-EZUnPH1td*|nS1hRwI8!L!%OH>P^O`cRKusG_>L@tWr26c z3!Ft{B80rew{)M3HoCOP3g>=&MtSBQ!NZCE5}wX9x8az;DLk&febM~&R)skxNO(H% z!s#Uq*}{1=8+U$1tRzheO*^&wMZKljF0m?)Uh*hioy zDh1{=2Az3&dajaiZjDpFYrjdD?}ldKB2OcJUxgQb`NxI`D>|316)A?$nKQIO;(Ny8jyIo91DO^L)ed44VkSqdUC zTGA;N`0z0`rd+a!K<6~R!Y_uy0zL_xg!Ukwo1IS7N1j68fm_z00)@@ivO;}5urWX~NNgQq02K221}i6DhF8nNDL$r2ws zH_g`ih2Py(o;Z7~EHK9gYlzCxCUwSWGiPQUJg;1@876g+_m@0$@4fVSInMONm`6xR zUZw{u>FF;`H3Z1i)Re<=7c%RC5bztwJn%xbZ@+U{E?b@8Bl`(3q)HYb%dtBJr4CaR#H5TP=HuO|uixT2r$YK>1fywpjZ7fcvWlgplQ!Ce`N8t2ujIZ5m8w z)%(bQ!Xe)j{>%v`8xhHJ3Vf;>VjJE?W+0y6E}o!L7a=C<=WL0=A3Q7@WkN>&kU;$< zre~88JQ$S;2hn|BRjJpoIyVy8tfHza?%-c}IRmVFIX3opqRS4I=WZpsqeD=-m4=7L z=mwSK_FxEY(^kl&|L%>nxvp*9nzlJR^q#1GG!V}Aj_vX$0SQ}OiVnhc8OzF!qKTCg z-hUc{JhCulD19}H@ussK4>xdt_&!*E`GmmGY5btPO@dLV=I&k7-rgP_q~+oM<`X-= zDHv$R`ufA-2PF_cMhx-FFtqAO5PAoc^f^bC0wXRuj>XiS#xExSMpPAN&*OV+c-Z^8 z{g0V=P#5|z-Ebz?A(>id^1Hq@ z16dj`%vV<=sP?cC8l?5X=2JF~tVJy^WW`Ml=lyj{jl;fUcCsHF8jMd@r>3l@aQBye z?WzXoh68oQ5&B%Qxx~i{w2fNaDnEn_*(H`?cZ2I>hJ7Bz>DI*bvEA#CB@qi928}iU ziQ1PJjQw4jPs0gHIX-{-PMtVcG{MTfBd@!B%p8w;-rxVGIpdSCSo~D+w+kC13R!($0%E8)7{%<{d@dZx7n;0bH2$( zby{BKyYlQ``OPyAqL(HX2lu358&(=A%b{LAbh6E9=66w??v1)}fTlF00sv{E4R}72-Mv_!=}~LY2vZgh~jJ_cnbszdP|wzO!Q# zOt(dJFtOg~Qr}YVm$;!Nj8)pA=WJKr@(h=IPlsvyJ;AI~pe@^C_VUS%;JgkTzvy4v ze?DnH(&KNPSl)L1@0U9e0!M=Caw8nYhJ&DLNIm3z(ax91*G}U&1)xrPaRO(_)*p1%B6^Ko13JA4vnhMhv1sGia|&%ajs zbvo6zF*T=gSzpMte|84z*YAmt1Pux(!c8gdP!5_VCpxtvi`>-xM2aKSrPb)Ixw3@X zu^s&-5C(z)A198C&!!0`;R-C8@>wu9 z%n>+Y$*6xiJ97q1eAR~p#77R^LPBIhZ$~wR$J$=3O(k*PL-E^PDb{_|v=ms4iPq`p z9ldt^tNf2P(ch-|-BlLyzt~InN~@_f+<)4;qZ`=H&=qm(6E9F=b30a?!+%Q*<<#YR zNx|m37eF(K5VtHilQ!rd-L=Wow3RCX_eNp2O&T4bp|kAhCFX{ldWcQvnRCN`KJEj; zd`UQ%<<4E}xX~>f+fOm$^^TYx-|+PAbXR|riii1D^%gymsrb7Ge{8)sEqr{gPV`%R z5s7M4b-1-C>GN-c=t(igG_3bQKi67sOOI7LS~pA3?OuH`h={s@pVfERMlfAhNJ#we zkZV``z^Q!b`;q78J;bKf#E_Jnd^DwRFU8W^D7y@yn9*FpRenM96*2H*GL+l>xNyb5 zxCW-|!l~TnUgD?5j@H|Gi!eBc(;K$%e)H{{wHQw&luB zJ_G~oc-9kA{PTfl956)xrH?qsi2{!BMR=jGJn@WG>67-Rk7uumUK<?e|~*Kqw9wVyqd40%%Hg#TrbHc>QI&#mJx3=|5WSeMvL(c}>SXwr?z819Kk z{J7zwlD#yzgwk^-)^^oq7M}AlZh0Y2PZD^lqO_bi?6BVGU9KUZ7TFOunI&O7CE^vY zD!@HVjd^dnO3C2p>!s;7la>79GaYqCi{?w7o6c4p#Ut>)uLRiMu3l+pXGiOtVuT&b zu#OuR((UEtTi=}&?83yVv6iVAyczt}O@m8INo!JumI*&);9J6rc0=dJ+1%NFvX=|( zz!R7QY5(&6JSYvTz~-!#j-Qg8!|#+#8=-JIUn5jV zhKO_c)bupyTXJ)EPaO_}Y4X5+5UN*k$MPAHh(t8V!pwfpZtMDq_n7Pd+1 zol^<7ajhR1ZOMpYZYm^%KGVrA__{+1S1||QaH3OThlol@j4}6ek6?IY@Zww+S#al>e%26~4sB+A4rSRvO6)s)^BYn5VC+e;%u~j$y+GXv`__)r#;zFc zfmrG}@^q#C4>u`aBh)V#OB86q#fFFmg@8}L<9t=P4&Kildl2_xGQoj~2L{mCCyZn$ zMLudu~NjB0LExLcuU-e)j-_#x&S7dnmVmpVHGDu?KWx;0(0j>*+%SN^3fbA~{{l3MVN0g7(K<3JTZwrbKO-V&f9RlJ{fb*0~0hqP1u>mI+BoK+C z9s(eM6Q=k;C>vQ)xtO_X%E$dVOZBObSmKlABBG=TlD{|iG6pmV1xwN$p1I|US*KxP z^`&Qh6^U=f?wY@ZyMCSNi_)c0YRXkbLU3`z{5y)3ub?G@1a_~F&)Raw$OueY1~lxS zJj+hs9M;80t*b}zBQf^EgE;I=mHx|%YpbrNH~=WbP(e=CMdn*s=Pw4BJ)HG3>X=4H z%0j(ujzfD~RWVIHqKQjwKcc@nQSX=A6ZzWTd0t}i`xz{@u1JBcF(${bu#gA$#{?xc z{AWqSD*mlwN?QMcu+j>U0W~;nYivWzlg6$1{T%m#?xlEeh>AEO*j-!J9=^UHlbqa6 zIGnnHn(Ck+TQ)Kn>>-WC#rD%|jr8bz@7gjT@QM8N?9~oIY`8fQaYC7Yi}5%5r)9Rz zyplC{1PpS8t5?+d*8yT((!bnGy0mr%qjN+pamJ(kXE&u-g`&(yG zlXh8oIZ4r#LIr)Z2u$Y9FpfAXJ$0cIdTxZcQc+l%O2<_a|D8Tdq?X`C@-i!Pa+Aq5 z5>XZXJgs%^$Mak-G|oL~=<9OIx@XR22MueP@y$?H%IO<@KM0kbS%o_?BkACQlGC_E z{WZb>m2jUY9>M3{1~hY{>p!HBT;^Qq0_~(_Wr8nH{HtDbRZWq}e)rly^?TbwYejcw%RHKbjyL5i@>l!Gdw5_jKW_+<93R*rnai06LvV2m4*{)J6F~uH> zI8eyFcfm7r53!CL_`e6+HmKGoh$TiIaAe?qE}h;9U4=s`8X7|9>g^{@xR=U(&WdmU z6_-z}4<{E<4P$VI{r;^j?z&F_Spub5>cvgQPyXaleU}weh33cE`@6e$O!A-UaOm&u z@q9W=p1M`gJsIcnOCXVb-s_@m9r@$7<_9m0%)W?M>WYO6A^dG69|h~^;bWW5E93LmfaZU?Ow zRY)6sKPi$1c&pW2f4Z_h1ON8m1->V&kuExC{-~0o!%7VO&5cPKO@gMt-?a?t>Ajs2 zi1uGr>#C^s_iett+PsA}GMB4b1OzA-5^@)PF?cvl1u`~|C!%c)!QrH46bqtGDBIG| z@It#XbiLx!_Z*DFK&onlzZ{r()tGfsy`aakg**+=h+s=iY&#t zsv902=Idt>%IX3|OQeBGHX%X5pYLiVWke~k(IKSL+YMO18~8S~n&0~`8PVPpZW6e5 zN^QLFo80+;&tp!WoVe7-q`Yu381xKBE-dAZ$HMJUbwAHrV#I_{8u1CSKYVtX{ zQs^xF_SSRjyHwcr!*6>!L=JINFG%{m%11pstLAq=F#bRGY;p;@-vGiTqf0y&)j zICj+4g?N2;G^w07?pNywJCtN$wTQ-qUclFxPQynK+B?)~-EfK2{u!0{*^8xYi+mk; z$$a6$+^>E42S<6*A~Q#c6UWdIw%D}HpfS^03^%y(gx&n@MioPcB6eQ(b&XKGWy5%1 znw*q$IKnrU0Dgi{YJgHeXhmI}TzUJwi1$&1F%)8JZ?9Q2={OR|Q#NiA%3P?>6+GVv zy}-GG4oy0u`5fi~tjt^$E~?c4!C=Tcb&z1=jvL-9R@&@-!izvyO4gCjB>S{GZ>!FP z=AX&wa{AU^53b@}uoa;ph|+jGAK#U#u2ejc=0GaJjH5D95NgUPA%VAxkppW3EHLb_O&cP>TP|$#|XWuoSB; ztleY8nncbYnlNo~_!p|JgAu&>#X%~e07c8du`L5H==l>xy^9X=^V+{iPhTUb@Yeqj8`9g;al88%Bs+Z$Lcez$99Otn&|%_NPFZJ?6}3 zS=CABBneiQrU-OrGPClk@853C-(TIUFhUXiv;77Mvx0D8dCcKEXCjG#R0p;->|1!c z9nuv2kEK0uA8OO@()M{HH?~uw!hnL(>D~3FtMFZXTb5YPTeU6ZMU=1G~T=if~}^H(RyyJ(AQEl!SQ9Phqoe*C}~?q)&>8pM+J{JAr}lX$45 z&iD#U^W^R_V%zynsNQvp#qy;sQJVuF|PBj9uGc#)WUv^`Vu=Y01BIgHRf zQyNUV8Y9_0bp11U{f_Nm{F(TU#n5c4<=onDxOLUTuX2CJ)vAl6v19ajjOcrT z1Yd&PJ!Kz~(OXwRpDdL3G6y~cdl$ZbPW%HL95^>8xGWlL<8dJY8qkU-xne>gH}wo} zc(6}SPHx%SkJ&_RwiJ_l%J2V`cOi?3g8@%%N^}y_{3>(#T8jB5rDEI)0W#q&nA;u9 zy6~@;O}vK=IvwVTY+c@0-WS1H8rwVTHL4Pa6UN3OA*>NEmOZL2w8*+`y+}L{Zdv3! zsRRFrpN>fZEG+-($MbVSwRc{=)qN>;_X`YR{vf(Zg6kw-grI3s&~jH0<|BilZ{He} znVHEVh%bv*QtK&WKG|m~vO$@Kjt&*?qx^vp-*j_cePJ`$Zk&o7P(8hmbso%Cy%_Mk z_x+H$S}7Y$T;SIm0(lHY3FyX3Ba4k>`a#akId$I2IFYq62QJz^88I=&JFhv0D#&c! zI9ilko&%GJ;|kP3=wD)DVvDQ{X(BNS#9hp~fG|tgu?zpRvt8JKcNP@AVr-VtkUjCU z3f+_ewIZj<@(2TX~DI$SWEj<=6t$}Ar8afaY6KuL1=>rz37 z6J*2RVl_GaKGezlxqGRYDYN16b;x!AiDDU<_xnm^sr?^jyid>1rGspcdX^TjMeS~rIMs_6JCZ&qqL=Fp@ zFeIiqp8N7OBa?yY(?hhd2ZDSB2@Eo46CV$}Or;0(z*6!GofTqmX>+fb#~JaXyvRhv z!z!)4pY-+rm{3iJV{S_G=4lGHn&{D|_Plr*8FZfatOX^MvV7gI9&jEv?F;5s~uUNvn6g@}>SQKDd7UERS8eIuhX3Li^YVE1Uc z5EE)v54S@cLzwBubje1g09p=L_B&UiqnU&#z<^p)iyBOEi31aP`I6!RR}uiEj6)2!PX%2;g2hIrlLniANcZw( zl1SOH6_*icFRUIcZ#fQMMbISn11EQOmQ1gdm>$!^>vUYcF+lk>@-F`8!I6@X%2+h0 zEA&U(Yj;}&(dQM$7yTbhXj#!@zFo%AlTJlwGxG=L{tIg#5>qEqQg?}eNfs!s*T2-< z9`ZNqUMz0>aQVIxkZ^CYR`szzn;xnZXf21mF*T*ln$A=*d;cCwcl8?!QWv4=A)8>^ zVHc+6Gh94*^&Ut<~AdtO6W1LP3pb;hap6 zIDVv~qQ!FGY6wGu`qS>4XQF4nG-u}K%poaRSz`xd>V)bP{pm6_#e_#QlkB+jp4@JA zXW2s>FIk(k>g2L_%f8Z)wbgbq;Z~PmGP{hHuybW*q89M{ipny%bZw6*b#03>t><_n z1s3lr^O-x`K%kc43PS}#r;6p{(cDQ^oLU%ch4Tew$(J$t50 z@)Q90hWddGb4CrAY_lVUy_|Y}F7t{!l{*yjbK7ajsNYd}rs#<9ytv!1gt+^$+*xiW zp@|q;%Cqfh!Z4DQFl1ke*eQk-7_pakm-|B74h<{zhszf!3XCK4Ha3I;Ta5bBAH)Z6 z)v@~DlQIE>*`YZhVqdd-aPI8y1O>UgG4uAnye0-9!#hx8buM*k=v`@DF7xd7-|u8( zTwGm~GYfJiw_g_!B1zWI6|ApYlzs2?3pc{2q05l){qorB4cM)^`udy%06m$qyyAe8 z4}0^UN?ebgjf93`sv`lbc*SU~qyrPP@^}6t_p4MKzv-Nb13sw*M!U=`?zO0p5>JNY zzK{KmMV~KH5BpupLQ8He#J?aW)c(xmIJ_p`@;Z<(yJ)S)!$DnXCIDO{(Flzt3f_~E z2GhtRJ_a`*pD#AGWH=~DG#?ef45ssFL;T2+&~9L{HdB6|@cRvOzJ9*7M<8J@>&{29 zn_V2=97O-X)humCoi6;(5cNQfX(MNvO=7 zVu5^D%|Tjy)QY3&#|izm5``-_9sK?#2Q+PeN@9(|RxY199uA;d>?9!avv>Vq?4tI; z?0&fRHNCm<4PPh)MJYrZL~w%2xow&#pP41n;eLHv+DasgcU4~>6ci+?lQS=GMr?^6 z3^W`k@oM6aOVi-IL)+>mnc%zWnhL)*QiN9$)^%(Ss@CS(Z! z#?{BU%d0UGKh&l_s?hLkqbkzUzMRw>{_P*5g-a((CC5rTyH4+&QdkG~Cw=X`Qx6xuOXmgcT_&67J;+BD50CWX?d}jM&?m>@PTn|D zkVC#s@9f4S7Z5HsIY-#k&LYr9SC$7YgCff1L~>h?ed`&qpF*sROB1R8S6T&+`t&FQ zp@iJ{sUIui|1Fg2HQ$|6FjA~Hxi!1D4MbE4NwK@h7}etDWiJZnLH{#RW_k<{{!a@{ z*d7lz@Y}=kijV7*u!}k-ndO{^zmJvV)a2?;MHUU2JmDzcq&?GW2SlNeO;UW+=p<7{ z(?i}T%xH*HdVF|~RfM;#Pv)Pizq$5`oUWZJif8y{!5Oylq>=yEXWL( zq;ZR#*-Vm_NlIuEBa8CE?vc^jjO1TC3I+HO4nqMT`UjiH*idYT6fsJOUTGir&%if% zu-<;r@{Jw3@#wJ3EeA^hDx1q!Pe#vsdDwFtX*{L-k6s2At@CG#{nC35F7 z$TM@?xL(zLjy0Yx^cv017^(dN3AT8r@8olCep+WotFoft$a3X_2@OCE3%7RJt+l{* zitRcEx#Gf)jM2z{&ZT`U%Xfx*X7TpShI0 ztl6$Wh!JKteH?n#Fm5%oxA%S>yQZ~uG;e$W4Ct`5teZOTY$!>%ehb-ge5c=QC=g=- z$TNrnln!|U0W#EfCTrt2hWlX}S*=yu+FP=&QPJ$H5$d~5#$Tma`P4>zz{HOGddnMD zXHQQW)nQA0zbO3}2tGbVf?5?|`QbGG-5*4lcHFsHqE z&O@T=G>-X%2%$j0DG%W*P%a#7SbTZ9=ykggnJtf)ElCsqTwZ!>f$DTY<*=U|ZfGcf zuqh$+;f5^k9D79y$2!deiPFD4WD5uYnkLycUZM0QX%v{5UDNW_+X(o5wQKe3e~uLl znDCa{<6)TJh0Xh@Kr?tsD&T>yKFd=r1LS6FYr8ZqPrW{F)l(+M2$|eD6OJ|~k{$ou z*l0dotAW{&t~7HnbUzzBGtT> z4BS&ofmz3$@Xt*%>|Q#Thws_Z?eEfTJIBh=r!e@}79Ktm<(=jNTs|N{ z%HP0D3Xm9A$Q?yz0d=4o8IY9^v1BY2K$YqMIT~yM9GF{=)Thp|gbrckZcx8>HF+CU zA@hd7QZB8pZwdd!T?~jvj*Z`r&$QYI4Nt3nz)mk*D)0WbcXT;?(wUKb2NMo6l|!1b zf{@2_9HDJzqw;Ohk)6k4U%!wS%kM^*7>6*Db@k!drggxP>Rd7~bg{`q%>M89X=b7D z@uBK5L45ehqUwO!wJ|`Yd-*3PC+F<4gH`R+6povLp`q9>b?h4M21M1rcFB+qB8Q<{ znjc*zkk=c+aBRa_YPZGXbpRBxZ#?u;3jsRB|pp0f*{^IYh)VNalV+&HcRA*~Aj z>-cB|Svv(`vT6FqZ+9Q&d{G4jcgDjgqw))S$cwlh(2XGv|FGf!n1%b}7}FP;c3I1f8*qen&YIA>U!L9EWf4s3o5K4@rE$|h z5_<&p$Tp=pp>-&Eo%#xK9e5})!iRv#VJmpe(#zFyh*+=3(dKo8Ppk~%T8uuFCi9_bYVW3TU4IX^F8O_9TNe)>im(4Yfsmz2Plp!Mg(9Wr)-bIQ z9r6ls)1T6o(h6Gj>j4ohG1Y!B0{@L6Pgb*(k^hmeB)aisvqJup1+>x-CQ{8Up`%369~iqv`11H?Wo)U)*qU|gqMIVG z&QaIF2E%_l_ApI zIanpj$YE5pwW$txSb3YCG6KC zoy>@qBZ-;x)teCOWr0vC}o-%swhNByM{Vo*O&xAtP5N5EErQ-B=m4uS`e#Af;4 zyHDwTYz)vxqQzMeF)agAx2Jvfrhz~;!1%hrIM=0F zWz>=Y__Ozn5JLSC{XAOBCis7o(yFTyelGi6w_|#j#dm^kiFy2<_7UZS?*sONn#dbF zZ;WoeMZJ5_=zOONHZy~QqD+_u>yun9mPAGcGiu*k$LfX#E4e(pM-@ih;=##u+qpnn z{0wr)vnp;}m2g2I-2^fTVCmAJF%D)rB!vox=gxOQIt0^I!chWudTvL#VZks?OJxVC z(EpzLnGTbyj|LZ2aRi`*nqzgAV=e=OM7ud*vYWlDr`t9i@cLQ73(gz{^QsVa0 z38nMPqt)|4rmPWi4VHpP>dP%N((Ai>`Keh6?0||a!Tnays5o%gJ}8d!XClMC0cpm#`ME#>;qeVJMcj$Ybj8 z2OqM;Dmywhb}}`kLv_2w@na|!@kKmCj_TV36*}jqu;)t5*Drg9{ukaxW{{Z+TyvT4 zCz*KzxnZP!+ZQ*2(dK+)Q6RiHH5&pT-XIUrnCPmj%2ZbQm6t~~;nL=)@9{fIzXWMaj#2vC`ctZ7< z641n@53vsaZab`Om0E-dF$Omw97AzN1;B`Uf1{SNjlGy+4(a z&C#ZkNoMZnySm^qLjm>Y^IfwG>!C`>WSufpN?OR0e0__B*6GQ#ku-W&~@8|Y;j*s$>m z@ROhCFm>35gPh&c*7gH(IHAP#hZ|OE^Wyi;+3t@Y(HywcTT|<31h4te_ve^g>%i7UkCm|*-T!9<>*`h(SDt~s}!TnIg4ZDU8 zA<=~OfF1w%D5l%1m`)gCh-nJ`xPGSUrWxAHDZJSpN84OxUT|$`BA)7xp?>?S#M;qu zyzak*bxfJ;U)II+0i1-=(&eEy6IXTmO+OzsOGk_a+xj|z9(6~HuklIny2ZR?rU60O#oRBJ=;-loY z(UG zmz#9J$CRP9bLZ;UOr2vIUj~fpeZ+-&tq&!N+L|~!pOpbY=}{QE^c4db4AnhdZv3`A zHlAcS)}s=J;-@nC3!oW$|1H#7J&q@4!x_E&p<$r(4O+aAUXBxiLWdQlmna$5y#qIV z7g=h_0MEzr6D4*?aHwtlTrFrYs?#a{Lt^CSk6>bL9VTJTS`g!DX6gWRua70gPF+$e z5MqmKUEFiNz3LhK9KwKx2tx_{Va0!o1evbIMq3h|S z4e}3t{C59AMEB!-Ln9+OT*c~tRG&?REYbk(x$Qd_H`J(75P9MjcnAN-ljee#`PLQ|>tFggh36;XD0D-* zD#gE7fKP%$-gt$Y#9fWOMFr^l;?o`7`SoB9MlJ_-nz;U=zH19^`(FFQkif*6?-BV1 zj8Ube*6I*Kn`}z1F2LTfN0pLn)AkRYkjwl0V{~+#$6wEeAUMa-KN{d|HDC&J(cR=% z!r3L(OK#udZ|}8AzIAca;Ic;s^0BiB<(ni#GfTxdfRVoQtFY{d$?E#E6(ne=Q|tws z-mP-Oj3L}(wyA!%?T=v`nq|3G7J9@GO7j&9;dZmNwN;|hJY@twi$Ng{MJkree8Qvk z%WE6M>^y+Z3c-1E5MEon9bJ5!j_b8&W8BPSonSGqi5d9V^!iary86!=4H`Jg&CSg= z;A+5P0p8)GJcGp|4EJSu{YUgA3ABLh(geEXH!QjY{{;g6ZhA}_x=*GY2wTtgTs%2c zCVP~yUxYD(=QSpp@{_G&6~3!Yv*ssjbOuhjSe$$-K1*K+P+qN&>SAv_V$y$q@k4aykt8)>|7Eu<>`O;XJyf)SrMz+G`$dt=zxCCqmkiaM zJu-v@>MO*h&bbMS;FlktPO7DY3fc{M`w{sDNHZ-pH9h66=V`s(Xild`VQFfVD7xmX zAfXQ^N@;>i49HVOqoXR!1!xdibr~7Jc+pwv=oYYH1kfnQ?W-1bKiHX?E`O$h-On*7 zIH{6d`b_*Eo}g`EZ|Bkdi56%w{QAWHS>|7A%Qv){um7-|?GRs;g#reOx4d!bBEk(f z*>TYTKYCqwx(9gj0s?nzbX0dU?a+p=!7qA5VEIhT}e_&r#AEidzq9@yz=;yMYrIsOVy0Nig3$Wp%X=P>E zM%P^p=aLUTO2Uh7pz=Ne6F#d4P2scs)V}kHQG$vr@$0E+;D}7^oOMxip&|Y|^PmQi z8Wc&4vAZMrxs^o!`|i3biIiFqQd8Z$i!$q#V7ji?@?Z-aNuXM7MZ0w_pPyx!|I@W2& zK6X+`NQAl3H|~aw0D_4o8DHpKMcJ0eYFM7yy7f*uxKhSng7Gz zu~L6(`Xdo_flu(F6b6ckk|U;FYPddH_fP(G6+R)Mw`yNRQ(bdUu`eX4QmNNY6~Vw= zCWx^2HNPPkzHQ{WCm;Za{Q_-``)3}VzElZ5@z z9HP&BORnr^j+0mUu?=V#B(~T9yNKvd6DUtyGL;rUGgCF?<85QJ^Xv~J*eZ<{{-JTg z(W@X*We7Xcsl+jmM#(A25rfEQM@&o%&f!}(SJ!Dozv1u>q)@|wm=hZ8l_d=hW1lOF z+Qvo&&=cpjS39j$G&!zLxXqw|XjA&nNn{zg=XZ6Q;BtS22b;oW)v+YeB>6r9hVDH- z*`L*Z64g;5{f7wuyG@0-Un!)DEL8)P^6|qA|EuB1w)={75|J_#*FJ}%P%|l9Hv>>; zU!8(1Ad+r)U} zcF$^(HLCy`Zg98RU^Bi7|MvUcV=V%n%RMg;Z`?4=(zEqths$SR&HBOn(D*56k`t(ZuT>3Y2JDR^PQT)} zo&vRC)0D@Qah~bAPzh+A^ijqv&@JP8mF$~Jt%YH+zIK<56M94~u=y6W9GpJNzJW8N z$IV{7wVfSjgX3y&T6#Jr;L&Sq1uLeSQi4V6K*0#WJt*lrpo9i-U=LgvA2e+4$|w27 z>>^2h(_~H^%C!E=xz=xFQ)hVNLDqXO^GOIm59-sKJK%KobwuRLB|>zn1+AT6x-~9z z(28HtK(0qqO)L?}$!Fy9Ow}?$<0CK&XluKd{Qh)51U2r7y4(~2U7q#oH?Q~aN54FC zRef(~mjHt~G+giZ z^_|gsmr>R1!7_Plv0?$?1ae z=k`fsoS@yOh9xyFb^?%(5e|kEb^P61I17c?^o<5|F7fi{!!c4X`6j_#fn_k5iFHL^N^rjEaT9KE;Im+oUps3;FhZJ?GWUy}SEsdN4@X(iG386yX7cNFfk z4;&Y5kBSc;8#xH|rHg1!FyR6j*n|M#bsA21I#v!3aAfj$TIKvB9{_OmKR>VnjlWh& z2HBDGOop{Cn3iWltM@)j^8z23L9d=A;i-`&=B7Y|jS+BpvfXJ^R?#4Dki*PQm>tgS z`bFO1Zu&rV<<`ZoU%xbsw%%4WB+yxU7^p?(*5*7}-{kMJy*$wmqOHy4`(M zeBH*X9;*jS7x#QXT|f1@K@=~flO2EX>dGI8$VpfTK;k$7Q3h~^xX?@3;?kO0=Vx}{ z`1~jAtOtqZU%GXp2j#dPzy;3$CLQZT1OUtGf^(y1n<)uSXfWe6=@&P8s6?>tRVDsg zvhI-!@En_c{ISW8ai!UpUL;5jQA9DF{15G>T2iHcS10`g5I~NXL{9cVl*kp3%JjJ7<)=+`Prhhg!2*30HoMl&QN_bUzr0IRV!QT%viZs|s} z<9zKMgv{|-qXCpE(wdeK8<;|(0O6m$L8L&F(4*C=GLZ*% zq)g!ArIv{ToHdUnue4z+G9>wU%DzE_P;n~-3)&m(*2R?mOHmTyV&}SA<}%+TA9Ot( zQ~{(p%De5Cm7;wm<)>lR)~i(BLn}1t;%dpPxIH?4ab+UHIDH6f>$aw*CcvQFPzB#) z)L1VXZ8bZ04GO%dwV6& z7qwmPv>bsM;H4xoXJB{^mu0LBD2&_PR#XN?SuMPy zn|K-q;MQ3h)}1P}(Npfi??8<91$d6#L6d7@!vma+SAZmY4xJsF-Fo_^E|AK^Q=1Ra z2CUjEYlU*}fNWACd$p%15qQQfyQI!t#tKFN6b8;hB@c4=Ng2I^sxh zGHTRzUexO6A18C&Sz@L$EurURkI@SDKQ3|E0v;v1#mLq1bB(j2HSDLCCh@%Fq zzc4lOc>nG^<4l2K^|+iGj6S-{hnc4X9?+p7^Lq1Hhdr?6oc;TN0~W`%5(GKXoT~%a z(h}YQ?5m&VKUH{PukFjbI zSSQ)Z>YP^ex@yU{9c?Zf6)OYZuO2D=UXdBpeEmUvpvZhip-~#kBaT{_2!WC3Raatl z&VJM#l>7Gn?duD&UMpVf6&P-;%>;^x68pd7l6l&)f;264*4@xnA7NpkQ63f+m-&~; z$&Q{4PuF0q)+&7~N-r11%-*~IQaV3&6m4;c6(2Vu2qF%fYSz=xhsoK7L>QIHDfx=g zZ}JS+>kR>$&a;*M89;G1FI4*Mp<%ZZvezlIb8}@~-9htFtuk%LwAhbjs#7{{K?%CC zRn)%w@Bpqo0NEUM+e7iUPgFFeeuKIt!Wx`xMC zW#0Q@93reO<;rWIhP0Adg|sIY03ukDJ3572GKUKK5M-I$XT0_&DPYG ztc1yF1smh+ylvzez7>D>^#&Q6As(rMPfx3u>zZwlhkr#SLZ+`bw7L1C%v$uFe&F0o z`hIRnX7m-+Vw&r>Dn*wpR|gD2uq|MYR6;QjD4#t}cT9fH&r=o`7hA~W4EI{(v8BBJ z^Qy%{B1?r>YO;lc-Y`*@k`vVNX?TUH_O|o`%#ZICJ{3wczJ7EoOTc_XN48CCDX|kv z;62dUG%5As`+bw|_pb{%=Ba^%NsbAoi^usN#2@u%XHfm56Cpfp6vL_x<=Trq zpv589vW> zWeA-xW-$pMS1`#43`rO5>Ya~pXM!>9EVem-Ay#C{WC{J2K+4NA{KZx5i=*hu2aeX1 z*KU?bz>{QXQ!10A>@qn^OUd;#@H$6q4%yG8f@u5qZ+D2WgYv`9`1OXq4PBrC{g;x0KJ7-6*|S?`3H*rtFo^UJp;zJM+eW zREC7}DjY6igbg`miJ0c2Q4049%L`K3)RTv>%u6ApjZI`iLc;8B80wA9t@+CFlZ~up zDX|~5*rZO991zpIa?R(@obmDTPoINY2wyxyOR4GjJL2A*m|mYEJhCs&iBQ;th!|t! z`!{+#g-_LG&zatA6tk`_k)2_q+6CE!`Z%iH6Fk-p#8!G+@C5n)MSJp1XvzJiWRg*} zm-#|zBLlEj=q#sUDhNdAt$l2UeMJ)M>ypwTF;$fnRIr_(?9;p;gsRH zrM|8H{F&*>ZW`^}$lWj%cv+~Hti(%AFuQyD!%;NFv_~hc(1Q*CyV0csOm09)gGWv$ zx3rW{I3>0A-K&W#k&P>OXHas8vp~M(%oj&PiNK7mYPlz*b;3vizEC9)V&D~C4LOor zJkQ?Ju_04H*su*`?1yCBKGxsx1JQh|m$phqX7|-dO%2n?isFnTogfW)JqxYS#2as-I87}7FhyWp5XSQnysZ`^coU8ZwXi(7q z!cCaP{qXNgoyPxl`|XUu)31NL&(Mdi@?@YOV(2X)weWN*{LN}5GL9s-6xVpn!F(P zJQ%IZvwb`}A?2K4r{)wZBp3lD3X&t3EiqxhcTrD-rSb#0;5O zY%}td4X5>Nb^QA*nwo^ksFama7={HEjF z|0XQTdUQn2dD$ACsN+DDs;5t>%r-1EAt0R|f%gHMR3U2f=%}8SIPwi?H!ialrScC| z#(*wG_+L=nZymBPf^eIKWuo16B%Kq5#W=UeX^ zZqU&gd|h4|9sMB@tda}KP^J(Qc|gR#p`=@&!H4yhXMy>?o?;B<>&bHE@MwDPJsevQ zB^pUWdPC_M6JqfXQ&>M&ruycD%~-9S!eSkDIP=q)Gnf%70>U$>*PD0|c0c@zIQ6SN zXq*RwRdya;-9OumeJCKBoleVPsQnscn1S35+p@Xc!wUC>7K zanv6?VcC(xgUb(wSH}AK8G>w~6{<~K+C9HXP3gRLFmPzY1#l@Yd6NUZ!lv28#=yn> zM;{7jXmLSNE9o6)zX<9&IuZbFyf`~eXvMFe8~bhykHEb3Dd8YW4)_4mWh~XxdRO`&H@=-h9jvhSRsV$B6Qh^vxtm5*{9``xSCAjZrsQ8Rs=^Hy@G9Qs}X? zoto>iHQB>?huB5FT)i^PHa7OCd_xx`t_OB?_q$lqSI5q=f|y)1=^E6Q_l}-e?%7lv zcTg$sw{k?+OfcCRe&jDmRZGV7$rdK7nfl35XaI#wWtw=XR5_J+$(-qYQ+f&H9*|b{ zdS7rv>C)~yo?-jqJ}}%WW8eES`1TX8DS}lR?HfqCjqhikB`2_a`-+MEEyCU3A z_5XMoi=dz!m&H~)25H|gR`s)%-F9I&`b&-^e}8|iK19;`XEFsf>&k-EYQd}BLZ^YmEu6v}_Y3(GO}WWMRtf#7iFq+dC_hEb^u9>B2~VXdj)wR|s1rFj z9{TzJYXK|?!$=?fG3;{iw&UCLsR*@BTvM5Fz)?_TEmOwS5{NWz>Mrq@DJonGo@qwm zzx&q2KFP*1yUD4&^4k1~@E0ZMF#1FGdxM{^mQK=U!~eX<44f|@WK^|O7Pj!7edv1E zA>Z1;$NA?$kSt5YAQ8L@jU>iI-6eQuJ^#yAeDTMS0S}wxn)7sA*>u}I>*9!zw!T`$ z<4gR-6cPjbIcuE9Qf772H$Bh8>>Gwi*c?;`sXeB7~FD846zf`Qawrz4z=DY%`sk^D>8SRR)t!(jBvmizuc~@IbNC;1<_IMb zN_YUP1c z?}^B_U-&tLj6sYQ^JR*6l;3zW^7N~J)oAy5FQ4x~m!&b|Y0ycH7svX$o;?LMyV@rGSAU;d%X zzOK6731oGfd4-F3k1yjt8uy<8bU`YF+LsMzB(m(fIwYIX>@Cf#aYCASCaFC+t>-7Nm?u%as@OpBpts2 zyKD7hqY8P_b7SMOM~@!GK9p7CjFS~81zOD+weCI#N(f!`qh_DQw*{scs({na7`m1z z$$4^m+6(R}F4TU$MyGJERYZ8gRg5w+GO`XIG^v=Ho-U<~ z34lt^1!1|wUP=+M_UK&s*BVNd?(f*%#u!Ji#?;FD5SOsR4(P?@L&p zn+}D@)k-*`e`&<1DYFQT2vIA@b0{mlPNfuf9~w!bWHGl)CFKeh2{A1ATd#vjMnSX6 z10NaDlPjoL(PDyoejCs0;m3ZY4^xzNCjQE!>>_gKR*?dxi$IcjuUTb{KQSWcW~ywljlQ%UD^a9F!!_pTPLf6zEzC09kNQmM9a z!Ru3m0o9ExL~!)9YNkCq>?n^}&+9)V{c68>SgiqR3?QD6kNPQ}Rl= zG?K$iUSOVOSt)U1_)s7OpjT|zF81iLBlHzHA&M*B@=2OiiGE2ktDv&(WIMj|v?4CT z8!Y1EC>(hyB*^H$7c36yFAdK4m2}12F)5MF^;~`2jVw5!OUTc9qH1>J)N)NRRH+h&PCD-FLqj~p^B&_I7&Pvs?%|{G7I1DL$(B$Zt2L z7>v$U$rg6PE*d!Ww%2xMRK`p^WcD3F zw{=^D9A_D`Cp$*to2pw4&e^*sPeVgRw0&v}yAu-FH z&#Fuxqzo2Jac~r#0jBW2toI)3dM9$}ddG`Ce&QR^zq2s_Vf3fUBkdQ#Gi)o71%%1gpr{*h@&(b z_d7&Y`hf`#GNSmKKtzuBbo!OqGl)F#`-wyn-oa4bYlNJ6_{U13iy9mxgiRK1JP($eCn7!?EZZZeR(W&_jK6{Kicq? z1iTVx!&_333YCt6qh1`8bN&8|otwxih#FE5z{@RFTc_3Fj5vPq9KRv$)qigjsZZ}Kx*Gh3@%I(KGIoA5~n@h{^_i!q|rC_hTq1l2@cU<=r8x5 zN#$u%-_cOHpZ5#Dxtc(qN^`UfUtLE{Q%?Ux@`;djE~@hRchpnVq>hd!;%bh*|zw&o~6#7$On1rKKpMw7;Qs0oO>f^Tt9s`*J7U#(R% z?4qL94?n9XhxLSh07b}XXcq)J()WWv{$x12b_@@FVNcoWzB0zuN?^TPv5ZKW49?{^0FxO5-PtfwBxGfp-@kb>a{S3$q{ym6MPw^ z?;;)j*5$y8Tj-vOInd`3B5cJmRR1dEnRp!PM25t${o5N6wJPctgA@LzrUNK)9(HGJ zwZX#biQ#f)?>&9PIEB@)F6G}t_g!b?TO9axSW8MphTXTG<11Co?}>X7ke^(uZ`NuW z;aiGeo|gK48IMLcI*IQa=&RZ1u5|Z_lkN+7Vk6~gJ-)siYs^)BgTb?{q`Az=8)f%u z#lM!q7mEWAoBR(~#?nbu2o^DJ#{>5C<*<5g6)HhZ zHe1xwY7|7F|HbCQ7^bK3-KZy=q^Pvi)UMr?%fq&ht&?46=bEO97{MZ&ze* z?k#l$<-jK8U}sy=lV^Y%f)m~{OnzW^fhT;8?g};1U&5xRM>1K)0?}7U#$ZnT;D`s< zUKE0Z@6S*kYDwIs>(oxlQ63T8^riNmamIth>sTfvVuCw8t}Jjx68O zg7H*;k!{aP4erI?HP0~~k1s15fA&x%yJO1D@Ke6K9B)z-)U2Q}%*H!%JpVw(i@%&}#Nz)u01gunviu@07HSIHn2BtDx zOOR%x^FsH{jZC(*9~+PjZ2ZfdPGDG-E@i4!#u?}n*~f*(tjZD7=T2-4fIk+rdut?+ zEJr9^@gYHG^*#9AFa*o5D2>!G@~96{(G%Sv5x8L-|1sr-VIiU=P(PG%!}RXL zQRLMdkWQK$?t|Q?w3Pz(6=8bF3V98fFHDXX%3{%$C*U!32!G1S zO=(&z+TTB3@025*#=_fS_#d}p{MLTH7<5pchvVCoMRdnu*x?wxS7U|V zv-H9VYON-RqGt}@!ds!-I|L;n;qZaOl{>?<$hpykgA}oe+rF9XJjzZB&N_9N${cZu z-;g1sgRkS;%dgBS$<`h&qHR|*Mp%(_^5px^ll#Zl_VThu{JE*CwGov&Lv~LLw1_$N zjKHdi)K_A`+vTEn{I|KVe^`hV1;N74&nzm16{(Qf$W?SqptxXyZHJ(z-{65;>7hGubYn+mJ(dPRmTP8pw(4h#2hzGHs=Vvc z%;W(Rz@(!#^j=pX$BRs%+h;TR%S z1-iC{gi#W5cuXM*8wFXTLM4xI?sB~3&CVEbTtWTkb2q(oHEY|`#HRm^UHMy20|n0y zdv4lf5*$g)wdk)W&p3zbtt*5%e(YOT>z%yFHtsKeDS2jV&WDi13gLq({YBu6$*Tqn zEg)8W9U<9TUXsy7#u(wJ)|L1T<$5^!Zl8ieUOx)f}HY|ZGn*yIl4MK)Uh>WibJbRNC} zR-?RzqFSEbi;HG4DJjrGpahTn%UCiX68Hz%M00Vf-OydZc=RFPb-9E_2P$g+mU6lU z5-q;yVp_jcp%hckhc0$}@mT1y;D4CmC9czaSty2~50H)?D3N02WT4UFuB1D?zPff;t;|2dG9AbyWri=>93^1(@iPH( z@g#QW^9m>2YrJ=Um7v75O*xH@3)a_)*{thMpIP?ZU4N;)0;y%x)P}NOCde)C!aA2v zV8Pt2W9aamA3CSkeMl*`)6A1Kg&)RYgvEpk10k_>jH+{DLeS|p_U>fqz+0zEnU1JYVVw6~F3&^L zzx^x(fSyOyj0H_zyA0qwKXDBB4j4yU z>X<^EglHKmcJ`>tfYbUCFT@u&EoEH+(kJw@Ca2*T+-`(?(N=A4^ER%Jl*KmshLO=- zbWEwv<@cE26MEKUs$@@IqXYWMbW-JfLO3>c@p8qamFKsZH;;9*vnORJxjn-@G25vH zStvPl9juKG(Djfn8Smkp;HrqaL%()^ReB_su23|E!u&cenJ)NS`-m_&{Z$2HpQ}`^0Ee6#JHO6J?7@n4Aw^F2v$^8P2`EQifXCQ34S4^$ett%@hwti z_g664NyZ>X$FJt~+=bCqkUz)Xbo9U-=zLEmpwK)TW;q6zYbHh#^7IjCOp$NJr^C-# zyjs~BQht%<;z3CBuBbTemf9GWnIJj7qNmcQ9aNVJX*5m*l^n26SKMqq?gCeE1>cGzPrHN?o4o9o9Fkcb&ujSa)jVpwi9rLp z#qN>X)!FLuD=G!&j@OuY{|(U)=p^&prF-_CKGca1k9=r3?1?GCy?VSKK&m&fQUCc@ zl`0)X6sdS7WoJL`rNfwc9_nx=#24iKcqcRTVl=;cl!_^NUA$#GjXMAs4|`q;*`+xh zxPHp(8?EiN&^?_!%qZIMk(B>gj|URfd#mRZPs7mAg7cl{X#jdfMO|LY5HNd-zWZUP z^aa$o>?wGRjEskUeb|eByVCC7-UE6Xz~0l>)dj=owmN6qg>niAVX5Z8TQtGxO`5LxLZH+12L-zr4Dkg=>yP*r-1sZz zp+204-+iQOo*8Lc*3|OHVpNOwmE9($smE-_4PV9fU5~`iN2Azoulxy-n2_3&VfQo` zfwg@^q?Y8TuUJA%7#Aara5)cJ`@M!MLpw$eM;c)Kau@9PWWK*;PElo%v+r z`};HuJ+1NqVlpz$nhp=%Oj_EXOL@^}G8eQg@U0!5(`+juBbb7u-+lE)qna^nABdqQ z7|sL_WpG{h8Nx_qn(w9RT>&2^`f<<&#mzF~P1igqm`+bm-GCT?X=W9IfJo@1_`-Ci zO4HZVcO42Xez@E-mUdbUPgvt4c*_I0OE=)MXWH{?0tVn(o_ifDaA=P?w_^g_eMb!a z=i^iX;o17%aG|L(Pl;}_8G*QY!tw@c3M~NvjDxi}&LU(F9FxH!YQsZg{xGE7C5x{6 zY-qkNlkoIU0X9}~C4uzOyh-D*h-@!S?e1?ZR2izFY=Rz%jCZagcxG*d^DV(*<2O&UN`O3MJX3;V_j2 zz?&C{1#s4QD>I)#^b9{^xFKS?tFYfbe$1UF({DfdLt|9Z**V$pbP8XS7LB@d!nCF;=l2eeOS+^+@&XWNT++oe=f&r-Zb$ za@Dl)a{k1|*#(MV?L)5ClNGl`|3GHkKgYgeVq$U~qKcJiz|ksJBU%F7dbxS(V!INU zIN7c0=I-tkEBj5N4?1BOB;>6bT@GYmmfY*h(_MF4`?H1JzZ0H z%E$jXl~ybjO^=CAZz&UCFK~oYo^?J3>%^hQPSV1VB1^W#4-tVsvk0nU_b$gGC5wT! zN@mH^D+t~8Ha4N5R^CTCM z6w_4{xzp|e;?ED_Zw@XSR>rChG1zBlh|f0$35B76iF;^FMfup9&Ok5TzrGfhwqlfy zhf=WW(2E73lt%Q3wJ@PI^a{JvF`^5J%4pn`f_?J(v`-1PUSTxZ2-{%ePrRVOIPIJk z?1cId5>&-folxDZy99p1fvm6=e+3M(6lAnOU1}10S#e;z0nwzZgfHT}X4B&2?NG2cGRQ-%*zDxLW1^ zmp0C>4!_YrtrNdMVSY83=+r`oig}>?_Gn_G3RHNMOnXHQ#7-N**l?M}p2j7>GhhUx zb;>QKC475HEEfUXkX?Q}mhr&OKZ*nfEv@*KWz7hAP&{-h_#yQl&X}L%-4{yH)C>&>?q z3@{E(d+g;pF`q0sTm4bwL>TtFc`7+TMZ#TD0wT#F3EYYfs8B;^+~3%Y&s4z=q#YJX z_pi_V`~}WXMd1Ceq-9>*l3GGNLu0?cb^gS8^}*D*ZkrG%qDc5*M)PQ8m2q*(C&B#{ zF$VsA7Jr8LuVaWz;PM;garJi`J}Y9ISiRi0QoRTDqn_gzHY$wA=pkZvA^#YaQBm! zhlf)Bc*%~}%p#}_H+>cUo5MHOt_Il%Y#s3chJ>4)mfdPFj!8&`j*bp@IO5pZ(Gdxv z2TasH1CGKwqwWe(7Yh*zvS9OhTU%UDkK*BSr1PVTo6F`a;8TeLBNsA0aB$48c^|H6 z|NZ-S4@3_D7C?M|1L%30F40$FiT|W�jg!OW%C_&Az|O_aYGx`TMcTZ_?9nM@nwb za?AhCCt9Vi2}?LJ_zk50xS^D7c8~SZyM#L=0RE6U!<#T(GS04imhG`=^7~a!ev8o= z)Oc+2t+J|hW!F5YbM9PJy8E6~pXHVG4TG|7q6vmf?~ZEA)tdYm&OQP!V;XKc)Uo!CO=B3m=pZ>j{I6g|CEr57?h8=VZos&ms+j917* zmo}VMvHJ6DnJLy(lO)Hs#_&)^;_Bl?YAF)PRXX~trbTq|&hHCPnX?{7WaSIy7Z{%` zdz;4!Eau{8$LjIW0i=lk@dTuWopS%^<^AGTPn^p^Xx7g@15dkJr)szAQ+RnlKfNoStsbRiBHa2Rpa}qRdl3Pb1X~X ze>gLrH-2L7v6SF=Z^~^@SE}+i@l+){&3$SP=WUHL-J_7|B7SB6H9eNq#qy&MgeqIr zm*|AKLIYa{xK5UIk8^%X0e2d3ol*PrHx@t6nF;}(pcrCeVs9{7Vb_((Y*ccP#?sc$ zuVs;FZ*N(VTwxDL<=jAYNQjA{fnbzzS@_$#JE`UYG68;mbgrd`stF7~&f8E_L`;nh z4f=;`TZaMr$I<~8lye4eqQv6Gf3IJkW)+Pm@i(@#4Cg&*=s0zPmz)#(90dd({n2%3 zvc=3qC1%3V|"], + "background": { + "service_worker": "background.js" + }, + "action": { + "default_title": "Web to Pixso", + "default_icon": { + "16": "logo/plugin-logo.png", + "32": "logo/plugin-logo.png", + "48": "logo/plugin-logo.png", + "128": "logo/plugin-logo.png" + } + }, + "icons": { + "16": "logo/plugin-logo.png", + "32": "logo/plugin-logo.png", + "48": "logo/plugin-logo.png", + "128": "logo/plugin-logo.png" + }, + "web_accessible_resources": [ + { + "resources": ["capture.js", "runner.js", "element-picker.js", "popup-panel.js", "logo/plugin-logo.png"], + "matches": [""] + } + ] +} diff --git a/web-to-pixso/pixso-plugin/logo/plugin-logo.png b/web-to-pixso/pixso-plugin/logo/plugin-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..73f9beacc95795bef52ca5a16c1ee5cb32fcb1fd GIT binary patch literal 115230 zcmYhi1yoes`vyAnP}1EY9YZ71-5?FpB`w|E9nuZb(%m7cbV|2?ba&mO-~V^--D_C0 zU=8Q&^XBtB`<)17MJZGyLL?9fgeoH~t^xuS3I$lC+*E+-M0s>)k|?Se+p^CPl!y5oxiO@ zcB(Ywj=43HMEOn+dcPo~D8|JzujlmF7b$Du@r5xP4Q|GFZgyk41=@xlwf)3<jajk|l+*@3ilsj~z|jF!Hv+hko&7+E@Ce8R&EIAfKLOJ4WrXaSSI;F*OFBznLn zL%IG+;D6J1Ru(5(M`Afon4E+AFfAL=Uz0t9vh%+A@7LLNbMjC;fTm$yw;5huJnigp-6yN#*38Y?q zZ-<0bT)h3G#rn>@oL^zV_`g#7M`$188a!tX;`BZ#zk2dKyLI>tusocs>TmnbJD}HQ zuAK{09S=z7NJZLrr5+y9_@H@&dyz?JEy8|M4Ss}(2+{d1NkwCj3HcWlz2zfvWr~V= zrZpi^u@{s-#e0E46w?WNCk;Wtt=Z4!dAu@X6?LGK)cZW?0>5g~HW`VmPKNybT(she zeY!T@k%g(bBkI!E+em6nKWB$-XxwwFSLm4(epQM8RTOC-|N01FXYtsJyJED)4gGds zK+al8C&yjIKt~!ErmS@H{%3>HUc#Rl$>c-CvUVEu ze3Tx+9|1=53zwk8^t1Sc$gmVhVf66h^l7n;PL9#_8{=9pclv@op|9UXPB2D&m0R6& zL<)_SNrcz`P#23Bf*P=`uv}AQl;q|}qcP!qlBs)5TRXugA3R*C{2$_;G58-OCw)Ds zCSjRwtPzc2DX<66@oQFS^ZK^kyI$BG64qJo5F#waU5vx+*JXH9Om-gkM;$A&pVg?> z#`SexJBO?d-sG4iEeT(FdszygO6c}YzY-nquF9rFg#B#zaJp#6g<*N#V2$FrZnF2~ zH~(E!gEv%)H?w#*JY|0#lw^i58K)sZ@CTUO-`Bl;%_L3WhrkxWENx z%9x>#&n88dZ+o4*T2Jism-41J$y76}?9+5U^XP<#zW|Oj;7aGmo2TqwORaZ^5%GJu zvMw%DcPpA!aP6=p*(-hHom7LbcAD3O(lzKc7fOx^ci|u}XDJW@)@ntFCx3qwV zopN>%=bNAdnHfx!_d>E*UtF{GJ>x({25#>X{D3F#H$L;iqji05`54G{peN5*pUEfb z!x~lFw{V+Ijr=_0-}hMG&}ACGOCH;4fdOx+inX^L=sBDB8J~Wk{7Jg}&<_0bF~Bqp ztqsa+K%ex%juX*R+6sKKQ$)nAfayctX9FLK5k_Ivkw1fl$i&PH2M?BeHphy1H(4JQ zrFD=U^&Db3CG@_Q$^#!!Iy6XHv~FuPmeNfMUes2EbNUoZFiJpV#sc=95b;AQdL*jy zYd9YZ_N^>9#bh5j!rPMC5bD}I#-GNY50s~&zw60C4e5NaHhUF39HY6OPFZ9{n;pJh zK+d$e%_~DgLBDv0HTe|#@@bL^E2x3ynGlB)7ySM6tkTMsE7r*O&xoW?f`i*Z4cY|_ z&_TVc9f$4ISY;)i{hKzW4u7&QyU&HA@GZ$igP$cjsv~Zxf{FzZFrq&!g&X-0PS#80 z)gZ4vr@3kQ38Gluhb07vTubermxYJf=xpWBKu|bHR}|8XEN_=`5!T%R*2c!d2Y=c({o8 z+My%}zsN}L(CtN`&{w1C^u^q1%HY!xPbJMKuoU9s2f_fOdsn&WnQ3@$mJrn#OH~{SSCgZ(VtRaTpW5XY<`81#>YRk2HlG?EBAqvng;Tsg-2ZT*IIN6V zg>@PWNlV=kTw`L6dZn2;dKO^f;pa2Re>_GH&CeD!F6&u@`ZgwA4~b_&IV5)z1H-#C z_3=%M3_bh3{Bb1cF@`LmaKYx&7$r<;<>j;-%o7}CWh;qg;2OS5*zF_RDVg7iyRZgx z!2n*j+VRXIkVd-ly`mEn7*3}-68oZz>^NuKy44s`c3qlt*J}C#3eYg2MU+|lbceEK zdniy&dXCS@{Du1M`Cey@7;^25IhDv3A@XcJmF1P}jU|O-XJ-4HIC%o=@iU1U%Z{hz zx=GSonH#VDfL{U7?Fj1{^tIoNEpi*>s0P&(B%W66P-xvK?f3;TgC0)Wlj-}0S1T(A zMEb=_j22Mg7s*#*LXJ9_s-vTR3oxrLdDMQNL8dy0(cn2Ue>by5$$W35Yqp4t;KB{V zM%P!9Fi##JRJwLmH-f6ns}fBXc7DdY`U4WX3NBl-Xw_i3%$tL{-erg4x`OpZYYaZC z4x_pv@1)H+ObADlqf9WNo#uqIybrq4Vdm}hQs^DGpLLlmSzIXV#9v#pUn&e+tHxC< zDzvopE?oRfUE;8%6Om0A`}?s$l`)~e)Qu2kI&4QNg+TJ#%o0YhWz(Avu0qF5@m(qm zu_BBVTYGLM%B^7mSQr%KNDDD36zQ(jgm5b%=fC@+Z%K?=a;-|*OM`kRsOdP}$I-+z z=%eeT7Dk36KnYMLEh`Mk=!MR_QSU=8Pb5Xdv*iZETpar(ZDh74N61{a1RT-p#lTMl zC*dvtv_tGwenI;MvTQHz zts-^Jqlmo0gFd_r;tDgt0_x2Ho1>cE=6N4y(RtTflv^ySdC*WJGXB>Tu|RPYAF4EhKGX^YqP(vi!DE@6ed5n2yqb)GSFV)&kVgx(mz%pK z9oT!SR^8R0SPFevt{OelGuP;%V+k^FfAQ!FmecaG%zXm#^JGh<|0X_zlixL_2*_3RZ{*g zZzgV$>z0eb);;z2hu(0s&zB&7>(XrA0P9-MxX#4A zC|BiATb>|$rrf>5Fxxg)W@%(a&gS-p)zJ$?(3o9n6$~%@hNtq$_97EZPXw0l$7(o< zK6F}t&F=Xk({#;ty$qz`&{VI+M?M9g-wuKfW8GoayaBa#sl$s*%lG`Ce<8Oe+B;zG}GIu>YS_jz^_Yi?%4KDlsG_zd$9-jHoH`?&&UaUv05$#}=k)_{b z!=SFTG~#q5esrdmCJM#@NokhcUG0<7iwH~iom#!UyJ0wY{E(s45i2M(U~PSP6*5N; z?_ch8$mw_GF<2xAV%a=c@xH1WC(DlXtq0r(c*&M?vh)GP+IRTXPAt&d#V7k$wf+vP z&w13-)`699|K44)CrPqndf$tgkr9-Z_F_JwHsV8JxH8H|iU5jWN?*ZPalQ6hrG>b% zu+=xRw~jGEvA3u|?-UxZ>JThuPVbL*84}xl64k8o`PK>0xEYJd`^!CmL}G|&S#p=D zusBJ>vmlUN&8`rKP_@AOmzB}``ugZGtCdF&NTBC^A&j3S6Dyd?GlwkErH)YYuiJ1- zG%pv~$V(^5zMVRDMd*@Rv`P6`nPRW!CY3_~YL?`G?EJ0tUPw?-(Q>})qkE2&Nsbh# zrgnrKi|QiwC))+m+KXQlGpH!Zp2wq)vwxZ`&--Gf^bqCSCy?W6m8_RLoAKlKYPWRhV2GZq2>lc~Oo^d~$wW?dugXrAaXGhK7a}s8n7o)_;2ENQyU9Qx?T(at@mgR)cECz397Gjf!5p zcDYXKUo~0?@la`jSx3MqOOTTxgZt;l0JrYz;(M(Bz z9P8HowMR$@Tm|fCmwt7WV=GgYLAM=X$J)+LX3_kgqci|>9dm8BHDf1W{QR54-$d3D zJfIg<2tl!5<4Q4ijpl`)m3|2|Dej};092V&9&i_k$s@<4EKFz_7I^dM+|=$?K! zXftUHF;E3Ils`Hwe7)L>6Q?N5RQ%UcL;7!LUW{1&c&^$qbi&|QPot~|Sd2jsw{`$l zHwxThuk^;4>kp?fB|_(Y`=Cx&of zX#uziblWNP!X`q0@>$Y=1{%?PN677!ZHO^^?)Une0Bkm78kK(e75EJ#ioB$Q&UR=+ z2^%ox7qe8HMpSSQD9L!BVyRe!g$+6G2Sw3RDEhS8U=xBnth?a|*6-E|EgiVN{5Kw} z&>mHXd^vkRby-R(G@_2Z^^@DpTDe+_?AAKUcK7z??sqP&EFB^U1N0=NAy4$VGZvMV z=ZqkR82Hmax8KxHI9m9K9GS7(rloT4*!SZh6_)WF1^gMXWik@Rf#JxJ9`f|jUQAIc4gok9fof~yR7%R) z#<;LXU&w1z`VEl;<)Ni+2`#Bb^~nkcUB%5u2*-ejx^KDPLY{+XJ_`_&U)|o$emN{ zBp6HmtzSt4k!<4d*wa^YRn|^?>@iTA7tSknG*4jF2%$rcz5q1PsHI`khEaKvO-FlGEi8!9(-ej zAALnVxo1cILkLW)j+MNHc#?(w;~C+LQOVHFxGg zxxw={-CoSfmqc}{Ea-P!JVPLKMGx|t+|t1k?k^c&a-YeRwBm*HAE&(vSH6pE{L#E; z!BCI=gEz~~?kz8P(zRmJAL2p|nhM86T6Ky>fHK0(BjqCObA6=UDlRvxWs#O$PExOK zWd=$M-HVaq-uscKZS1mOk^{3{TGG)M>7ht3kKv_lt~ClFuz}r1|2|5cj2)R?xQD1A zABn@p!G?W(y%Nw18|g)*8Jm6VhyE;Z1riycuMiT=h?o1t20dlLsZGQEv@2K_|7#=X z>Lv~g)Am#L^U%~pZqgPEA#p96xB%~fei5D0B+9OZO?0UnT26O$!iLrh`P&B{x@jGB z5Y8-l@8Mt)zW8^K8ywVg3ZWrVjO#`?avF$3VO@9<5gQjgg4u)bxBhyRQz2^9{?5Ii zKLl{rrwNWMypi~lcOMJQNbjkPevB->$Mbs+e_j`$9wfRt0`3+sh;VA?vB$SQc+|pl zlbo{P*TDNwdSV0(i-;Sj1rDMJ#uT@~4`r8zfFxjlcE!qI{(wq=HOiFkpprkY`tF=< z*kOy_$*jc{lCG^<)n?n*6oOu5rft`%>zbOHx6H8p%u!b;fmj!w7gnc1_<)!Q{s}^8rR%~NOQOhk@)Y($Xv#w)SXU@y3K3qP2`c0Z*4V(B+CmmOUJH~^jtYOi(@ZRJNdOr}Pl8!UQX!O; z>ANhX5SUOCqz9$tCtbWXJyV)xt3SY6>sr&oz>=t)&3tPB>VN-RJa$#it;?QZGV*J#g8kXSG5p?cuOm%PiB<|Pl_TOXtB zH+FzHh|yq&l;{nTvW;vIIrNtvLvZ-Q@n8rq%=e8iRB(g#5v?Y_nB0YBNO2K&eV^sz z!$S)Td2q1S5|MOfl&(Ba<7I6LZ>vUsdMQ7)InYp~XVk~X}AAh6Fkr5}) zWmdWCCa1)Nh7B|VgZq*~DUyuvb1c(HF=WhlFsDc;qL)R(n-$orMK-)5XK&flM>CA@ z-I|)6n#^q5b{rQ`IZ?L$958e?bSci6tEvy1>6dD}o1F~}VkfWZ1c@4;wx6t@N_w67 zQo{9}b&;bK!1^w|`Lx;Eo)amZ&WhZK0IJa~Lr+Pqowk{tQY`_4e(kbw;2wUftuf@z z9E(n3k25YtLBLr&_MKfk;s3som|`{tm33XnS(HSeG3=}xrmKXc@g-U1<*M$YF@ku3 z1o^7r1zUz1=UPvklGq31106ATxcIC#^dAD4aB}8%dl|$=PIaH6DAtsQhGsV*T<;d6 z^mR+c1!^yeKO>{I`KtJQ52)GEVycvn{|L8g{7r9oe45Gq!y=F}|NT+7~Z0#h&@bt7g^vg8MT8^1DGKf!)p5L8!|kr{qL(tWBqVJrVIi zI^S%HfPFt)iuC*jmI&jEgoKMDEL>V2^}^?2HjN>+${}>3!j{m;MINNZdy0O9H*Cj} zM*^|0Oh0!a18av3#iuPe38kicn|2$>u5%nP5nWsu1PIr9^rO;jbJG16*tO&}7c!D@ z_KrPzaKYp>l=0}jobucXK?*Y$C=~n@!E(L!5f-cHTal2MZVu@V#mFv`@14WIT6*Es{gfqWaK101a4~Ix$f9)$-{EEAW}_2)HhndchJP;i*`)? zR>jP*j$Vni><;4FX9^C+UFpWruE2N^Vxnw}o@XEQfyWfDr-(31Q#V!a0Y`|a4fa4U z8H$txHT>pJPu|X4_;`kffzl$K_e(kGZSN&Z+AC-XwW;dhkLIzX8GO10r#3S}r{>qI zn~EB#p6_pd8=kR=zlOHOl4u0dA5;W$fBNkc-KEr+N}G>K&8MH{Z3_bz+!B|FLWyy^ zk_UTJ%5+2_1J&p0J&o~rOqom@#)cHmk7)3o0ye$)XS)1gz5ED{sJr+qcZi2r+7?l$ z(Nm?rmP3-$01?@`XNA@gQ?7w4UaHmL6mrQQ3Eke$6BCU6Dd}MuYj+IMUJ0zX2WOVb z0tnf>#9F;)1x`4qeFRZ5BwLn~u?wcxk(nQSw|g){KlJ)^r!+=8pAzfRYVDx&5#|rxUvAxh z%H3(iGf2ADVK!-qVf%gFuSxN0{PKiw>Frupj;t2cwl0$4|+ z4!KC;UGS7?y~2XIZcH-=X`vo+TEDt+M4!scBDxpX#uT`*XO;pwsa23(U_8tQ^{?Y{mDdyj5rXn)K^33BQQ{ZHnWoS>EqV1Z2Rc z+DQ|8?dkHx3Zfm!KTY+=@qcwY6kam-L3CJ?Moy3niG5x?UWPThdh<0$;yL@9MoD?K zR-;%$!(@UWNC;mb!EFzZs<(zQqWq+oA?Ecm`Ch-x>&u{7BPFQb-*C3y2s!JW(k5?F zDK@MAapp_e=0%}{SbxdO&(A;Cr<@gr1Sn9@Wsc>?lO1Y>)=CuL&-X%Jc{90QXF12* z{O-d17VJ0)%^P*p&q~rg%*;Zh6x5FpZoE=QZvWo=2={S+(vrTZz{Dcg{$!;!p6N$r zCG(8$e9lGPQ`VOgrS_`F3Kgrbt82q9?TQ&;M;A{CWu*)+<<8<0^ zFLR@8M;d9p!izrVj(T6OKQF}DvT_pAcm|2W`vXC9%N#-2nmZ{_(c+H(1DX`R*Io!! zsh2+N?%uPLMKPOiM@gWf@;vu>F<1NT2wwy9x%R}RuMGVumSXcqo91PLiOVG8x871< zw1LygzmFauI-&ZOegr*fY`0YzzaF(uiwpHI?&62ZH_b2IsvuJ@w4?-YMQscV!5fGYmY1f*FSuABC?SPx;#|M$+-@_flZjPaWPKik;WL zUd{uSpL`AWrW;xzxiS%8!^j*rK# zKTjHDWYG+NH6aoL3ylpr01YhqYuMPvrouMk*SF-KOu&}>Z1D$g#fZWHsUZg$Wi^oy z!J=R&C}g!N8lTGrW1c~c0Y^t)U(#ao?x4JSdPwNS;j^u+?TY^gC*oU80s7p1=jEcx zV`edWL<=g(f1bw!lY?oX>lTS42UM2pM%8B^ujtUPUS(>Y?-#yhew+Jd#Yx!F(Gfi` zAknp4l;*&1W4e`3i_&*7BqQ$qu=%%CfzEz?{2U>4pD1*0)u^LSf8F5xJ5_h$S+rz1 zePL~hyYQ-Kk`V6S-8cfrT(r;~xHAiCYtL;NO}HH29r|&iZ1-MWU1b|)Kz$3*p$MMO?a;f_6-c}#J)E)9UEgv68AGVBE z1k)h>H5?f^Ivbl9K0K0%1St{GGI`(KE4%rP0mF{B$qCQylGMvF#^qoPk#41i`pS-T zhSBdwRG|4rJJxVAF`JbYmZ~ujFEL<8NmK*U4DrzYhnwG@d2^obZZxbb4qdhBaVu_G zRx?9^HTVesLh5HYQdbJmaIQ~3LLK?>WTa^NvKMnQc<}VZ57_+!L@yr~7Z=?#2G$?2 zUo4UA$*+9!H@us?HNi&st|le^h7S}C>K2VUrpw$ULcUo|O-+JFZ5KkxIn9&%3#uQN zmkSH2|Li0Di%(%W1&|ha+`JB-HMvQF<5FP;)4+9g+JOH?%Yn$>;rc+GC0P~)#0q;- zd@8wo23g?X=Ny4vG{_bX;zT)jFH*^$)Yv?jEB~s?5_Ny?q0W%(SgCPXl3jJ%{Vw~2 zbzQq#pnh?QnqI(IBZKL0U9bklViHL}1ZMciJ zd57eUUJ~s}9&;O(kHu`;$5do51UxOi{;h)fwOCzQMsx!UD+}T!GwIARN>8dIS2^eW zm$x}t?iZ}xuY4sw-BAKTzZY-bW)f6Mse5DIKZKz$W9Fe0wx?mr<@V=W z65lk+EjS6&($XMlF-kJ~IWBs8>Bq;FY(oy%AY(rhy1#ZsjY%Ni{9Ml*{BywggBizt zvjXGgqY1-h*u|k^L5DJK{(5Mhv?)4Xvo(Hb5I>j01}BOoky4DO|0V+%sBehOGJMDKJ>c*KU{c6{|{On!cnBb;&JgxorswRFE!Jr^*a8Q(q#Q5Ij=X8ymTcnVq`|Im#*OndO zGPNx{efI!7T->jg5f+RmdNwL9%4d`4p?6T}U<56Q1m>7>0!Abw zb1yj=htKb&BP}}{=h{;*N6_a%dGNrPtrGjT(c1K!E~bq%pED zQ&UNozxm9}?#rk-`s^Z2D4IIG;Jq!)~`&D$d2-5TCBX0KGJ01Q~cO7 za%<;vCaq%DolgBCHc&i>t?&Vp^pdbX>PkE&2R=oT@%|CvAxGVW`KYgt%gD$$B^$0> zf0jPsy<58X?X`IM_~~kJH#;zieVU0ldS2o`JKc$(g%}Cf8dGi=cm22*-Mo%Ye>{%( zI3U!i+C>HAaYkC2^5x|v(#xJ{|z@^WXOumB%|aC38; zmZ@dHMXevYz87-(w5_OL=395RVSw>Btp57sd6mTnL20zV-(-MtXXrwcdFDxd-o@aj zDZ4o!wCBD)?ae(rv_&c@fP#a>aX~%qlc?cA>18*vG5X&bOXm-_mKv?yj~nOvcXx{u z47ATHhDhIwo4!=dG`{w|CnADVk_itsr+7+m{x6dGyyGcgKpeqF=s{C1ZL;xcn5Mo= zCR*#GyY-*V>b2{qEP9%3D=I6e78dZIr^uc$^gW6s0ncNFa*B81TID&7IbDs9oQB85 zpt7;C8G#rbw`ym?ehfd`HJiNl4h{~cA^n8rz<$-~W!@P#%O zPk1f{o|YGFes%afa)*Q0Uv8QKfj$NRL97F%8%9UY|^;dgI4ufE>hJX9K6)Pv0FG$NJ_N#-5?z0P59Xeq&fQf+Mh zeS6!4A$R1J>&L^y(s7I=@A1n~{lvu%a4PX6nm)mrb$U7Dj}Q$bhX1sa=mIr6$-9nj zu>6z(1&ZUp2$zuW{&k(@*VS6fw%KMUj0+mL070bw=Q^n{SSS%_q{tA87B!}y-h!{{ z^gGB+w%v1f%@X;_%0R+)-wm)j7O89|Cnv+y|NcVydm!;qOs!m9r?W=Z&-ZWwb>h;( zvyBodq|)HPmG9NX+WInnyG`C-2o=M_{&&CapO)Cee=o98-UNSi=o~d0a6Sz!ZI(RE zZ8g-j0cYme`<%V05}{{H51_aImEe9RW4Zgg=W(M%MMYt+yRawzoXqvRorpF zQ5rcucJu9Z>U`~LoMUin=Y~ZzrhzaDw|oDZ1eQBk1QtxG68Y0bZ-%`xQJcergn{f~ z>3F&MEk*=D6MRov_dx!D9{*xt28Xr;z6h|u|B?}6A7!=NRIrm6(mTo_Yxjy~yIj?@ zyd2Iwj1)s$Figs8H2a@l97xt(vV_Tv{KNCH>n(NC@W~7&OfS2)Jy!i1o0>x9X$pX1 zObtrvx|67aIuKD(;D_|aOX6O*ouoBua9BMcl*B=88929Rldam=;s-|XYE^z+6}0}_ z3;2)7DTJvvs;^YDMs`cpm@1LPo|b^h_)?)vmv-#B{P?sdRLx@0wX!GrAc7Hk>+N-T zr!fcgf$x8*w~nb1Z=`-CJ|b&s^!17wt@gF#|-6X6&T*4 zM(Bnd^7MMlJN|jC&E=3A#GmXXEAVhHMWxVpfBE7#a;r0QmSc(k#TB_x2X)8s9VK$k zUhBR03rE%A)9%g9P4MCM4`{}spMn3uQRGqO;oG<3T~wl0&CMLK+b`lYiI2(KLvfii zCk-t#tyC=f9n!#+kdcwW2#*di&t3tyN5%pM$ikiacmTQpPYWSvmI}#8WCuRJN_*44-UbAD8XQ1kSskn zN|4-u%KY%}mwCJSC%wLf6P=U+put=$)SA@kvT%SpQg2XhKlV+QXbT(u{!694s6?{p zwG{%K`Z9QL*w5VU$Wj6KUvn3XHw+CFdR7#tE-D0W-LcmylsV@5`W?utWZUJhz*A@P ze2y&FtVV(jI?oGztOB)E2M46rHZ+L;J)i>c5Wtru=B#jlpp&LA)2YNo>AU+vyQ=Cs zWFBArWy3o?SK?a%h(X02PjN|!P)A)IrQSRa0CjqsY>`T6Qc_a>bf$H6 ze~zYphl9cQ=`Y?H92$y=h(M$#*;_wtTRUxT(h1X@H=}?JL6almv-%s8-jnD@m0${3 zUVB@9Ho>Vet#rRe+t07#4-cM05EK?{BzETmwd#2sgy>CQMTM2rPUqG zY{l@bp*PuPe(pFA&B);MChqV46KjWEJ_MRr{BxnVFe{3_ZOr7Y1&7 zt}5oEEdEv#a4IwM!Lwurqe$gv4U?Q%eaI&PrDv_7Cgxn)c-QH|zmzH;LyQjXSptND z2|Ki3x91+0(fhPhlHja6*~D}c#2VpN)y6f-(=JryN)NXDG`L8 zM;Jz~pYg}pEElu--H%XqjXHLh(A*?K&_P)OUbqtiw^;yZyaI#+#36^^!?wYx0;xqv zbZ($pu9cfD45)URC6DW0f~jEqkbtLrMXB1WJ8Ux(+0q0eUoJ5*(R8_KllRSAAC4n8 zr<)i^e-`J5KTeyC^ZEtK?c~8}i7L-euI+j%If0PUPe023E0Upuiv7hj;b}eow#x+b zmpK#o=|D5EtyW_o0Qv~Xe<3zyQ#Q(n>dj+g1-q4U{US9m*%Ai06|gQa!l42_hig6* z+;n~q>z{PMOfQ|HzRVXu_mMeCy=CkaE(PhCiEBNR)-dT*z(ljr`o=kJDF{Y z5;2M`>ui^Sq;J(_QJqMg>1>bg`h+TG5#j+*Za$X-?8PR9_4{$R;3O5@PS50IvoQ~q z9EY}5;~GlJ@9vyNfAPlTBtBSj{Y5q(E^oD#dC0-{2j>_WL_w7=)`TyXDwa%$l(}A4 zN9St~{g!|=(Md7{9Xd5B|5&so+R@uvH)+Hynd+h8%K_D@VyZOywI$vayy{bMSlJn$TGE@7Y%V%}` zuNH+4<_L?+OoJw_wHV&nB3<5}pF3=N_;hkfVoNDOqj!mj|3{xf@*)Fq`BZGmXfRb3#n!QE^@OyP4CM z{3bx#{i{L%odm~r(Y{)|)v8oP5Wv=PcuhNG~$cFm+VfDIwv-Q1>x!T;%jZLlbalh+r zRUwLHRqA%QC-6@cG&XWw@GJ4Z+-=hVCXjg>=Ux?drxr{(H*fs^U6~Ih!M?v=mcdn^ z85F>(6;@e$eeL3?HxI-x@lZa{8zt*r^ijx9BO$?;y z;ZLChce@;l^dEZ?vSk*``$6Vb|FK>%5A0zBU2$O?G#NW z+!(uNYha8D;B%W>!PK`4SSLDt%4KSQ0Am1>n+qSw`EKUtNaI=yFojya@`H%xaNPUV zSo&}>Ej&k;Imw=DaId_qIJ zyI~Vgq3W8ixr9x%Qj*_(ecih`UM9JN&V=fLp!fo<@qC!E+J1xEb7FqAK9nNswRFx3 z|09MShw?_v{Ci^(bL@@5r@;Q!u(Y;^LJ1Oyey z*JV%pkpc{hku5d*8Il$xG@xAJ>0l07sMdXSpV~wq7uT(V_YMgE;m{_@o%ud_WJeKL zYjn6#fJPq;bfvOIo5;C2^+rJIY>Coia#O&EE|=BU*DsDw|64+Axa9zy&)C>l6elV@ zv0`?+>JVQX)_#3DZdG3vQ0piVFvz6=U*m@&&Oi(aY2;^u&2(x|khM92qAe+`P2;&Z zeh@5fECicrK|-LQrid))00qEZw)X=I@&5OOH+(rkRnC*BqC-v_GH6v-8*qLqvhF#- zYM8QRUOG`#`3}nHUu*}E;0ef~lZ;bTc0(Y(Em}-3@6C(EYv`T^odhp(MWtqiYiL?MP-XWEMi z4~v3N?YTS$mv0OwgMtW$hRNb(pA;19Y*^01SBL!3b;=0Ob}?k^O_Ms_$GR9)H{`=? zg^FdjnkhS@@_N)|yFLdJcNHtl{Bz~Nce52xrYC?N{~?WqcrLRBJ>LPVjUC){IG5y3G2 zf>erskH?@;DB^#bD$_;htI-*M;|NE?&Sw^1gmmqJu8X-#~;*INy4c@-Lc*E-UhC3s+xC%U#e%DLtt%*{6K=U_%7sK)fs&IH6O5^B2&Talx7QmQ z)k;?#Fh2hcK*_ET49TUdc8MyH0O88a|3d`;NQb8{0!}zS z93H1+33B=9%3fp4yC_inxE(8;Za^mHSe^vP{CN;5ExPw2$P-Rd62TBN=Wlt3xNKjGN_4nJlW{`QK{a1XbGo7M2*1|mL~>fO z-tTD*lO2m%HXCp!;H*28Xn5x;zyu3>U;Y*!n6z*Q(7_XtEdBRU=c_*-Y;0^M0pXkt z5E`u-GnS%A`f@l?0Ok*%fWKg%Fo{!8kcBTh7Co`|E#oDIxtoqG&jAK@88%MPU-gA- z*4@IzHiHJK6`Dp4i#vjSiclyS!lY;!AzWbBIq`)GPLd3A#vFqcD5qJtF z-{Ms|5H+LOZrCToRt%=X?!xM)8K07je&f$CUjXUKp0MP*e zFP#l#n;vvOHl{Gdso)8qhJl5Jv|&?rw<5mf%Or7d5q4#DwW?rln3?uF3e!0kGfDbT z^sk@Q#f5s&bN~TzGYHM6xlR)y%Zl|XoW@M+%& zM8-vv4Q=nT@iV+J8B7z;sfQFneecCvqj(1{KOiz5ik*3AI7@r?i+G8Cp|7C^ePCiB z_MO9dS&xC?2Hq+ zTl=8$oN(4!HcvXVDKo*qjeNiBbh-0IeH5tx;gVB+nWmzjtJP(3BkpOJrFS^|#SDxT z{JA^db_NcFzo{`aG&KD7GF%&I=(hvIFf%iM=+rN=ekJcO*^! zAycGgs}lgQ?=2!QOosnMivau5gqP0&Uy0O%n2c2uF#iW)^~AIdOs3=@3e^fk?zdbOD=mRUnF=;;%fRr7`D0#wZTDHS z!*d0{J%NG>JL9e>w+a6{Hnww~s>2LG&VT|~7N?Mq(%yJ>flg)9VX70g5jah%!7X^t zgOh_p3@FQ-+}x5NHSSEm-b>RDvWS7*G@O?0=)VepnSiyxAGAmV-cVAsaT~Koh~8I| z^xn=#eZ2X@X`6_qSt!An0u+cKVl3x`vsfj9yjO47HTnt>wz2OZqxDQOFwq(nbrM}) zzKK_4_MUjF2uv;T&2`UBA7#JR8rzln5OQ>RqkJ%y1Zf`zvFIFs=-wMY>}oO(g!PrK z$WzYOH|yQkG#Qm2E!>vkWs6zvCMR1yqT|cb!p=^EOYl4Yrb-LsNM>53L^$9}!4(-o0F z%tixFoi%Se`QI$SEgq~$aCGwb{srDx1=4{Tshl3P%DDtn<*Q@cym9r$7fu5s}ys-3_b(5%}O4;O%tzojRh@W_^pxsHV+6Kp;p;o%Bh(DPWF690#!l$2f0M(Ly~up`EjB%2%eo@5;hd1ZHs*g2s1C0 zq#!yf9gTa*i9XoEjk25ST zRWLA)!~-*Kd^BGfKL{JCD*AmCpVnzytdRKm#GN?F4v3vSxk(<0DYGm2Cq zbm!H9c-BrCXw{9K|Mlw*?PUY)F2@!h`W3lUqulxB$>V~*`t!S;7$Tm#v&}w^NRPE^ zek^k6vaV{@lS94({H^2Zzn#@5f~dDgD?ePSIBsKKjP|@tOlf<+R@Gg6JTK2N&tjP3 zM2Vc@xObc6f<1**ohV)-^r7$f+r-qEy(m0{Ya%I{Ooa$%S+$=X^>(m_6O;<#vh~|T z#Pt!<$C@U`$d?SEGPvgMm@~%2O0fcwOZ}GKw?7W=9@^KxH{1E3eO~b;syxQ!-@jg0 zdb$UWAJC%0beswztl$gT7g>@(u-;+|E8HK(1n_AwE03jYsHXBiYn*KJ|kT?e;8 zg1ZEF4elhkySux)Cb+x1ySoGk5Ih8j;C}o4s_yTZnyS;&z0cWeJ$v<-+t;y6E}*3C zk2v{S-n01{w*nTI=C$d)INj7I)9z{m30MYVx`yNebhZH^^F7G1NCNO^^7F}A6$3>* zA9X+@niTt@0k^=`gA5j~^BH+Hi(Cu`%EcUu@!|f1h|Gl2TXAt6qQ8)8sKCERjH4?V zbGSKyXBcKOFXVuh_iwLXZo1lEXEki??ZoH_`m&&}{f{3Z6Uw4J4WI|68Pl3W^8vC) zjAS5O?XvfUIY+>YeX<82T-I7wp&J-b#oMzNZ@L}bU~rLOt=l#R!Njms*!DgxMe9!Z zb^KCLpKJF&`?mo*7ONm%94#qdltpRfQ0Vx}3)k*kwU~%GDWA$&} zaZ*!DjSfiX%$uajmQx3i~nD zVv6SXxjUhwFW0mG`J=nvBE%3;$ZZ0shHum4_uv-fTq=zYyw5sAW(L}@Bn9k*P?>Atqg9KC{#bpCiJJ_r-P zC3eQATu2g`K^A!6B`0OPRFAobRs(@egLVy58jF>i%@<@rD-<3R(Ho`p^Bpfk%V5mi zhp4iRQ9R%eN8-VhBgA^A0Jts%Q z;O#^UH?UwdL0n4~BS~9F2U85e>FwDKV25J?C8&ABZpeu^Y3eZg$@T*O>#E?cY(gjo zXC#q?U(EYbz_SB-0E`ic&h#cz_#Y@YV6W*>I^hlMFYtjPG@Ou6?$Y}a`Z(U9G^rxD z$_}=Qa4FF?Nk&3YKJ#S^*sKj|@B5NnP4xDJS(UJ7Y#(Nn_fSZAd}f*KaIQ(ck43HvukG|s)T@c7?=zdJoY(8eS&vr+$(S4M zV^@+xou7C?JvKuS6pzSPa5Uv7>k_aHY)kBl(0(qTg<>8@nQ-v1()`DL_PX~klRND* z_q#(52zj6<5y)y#e0B^G}wACD38Qv5FjN&22F0wZ?j^E4tTk zY2kuz2b}VrZ_^`VMT<1Yrq?)sH=VlsI!^VpGw=l>l1jFyLGpb-{}SYAOd9u=SmY`v zaP`ED&o?hW6VAiK*LoCD3C1wh_`~xk6S{(;pDOMzKdwP^5sR$4h{7_Wych~G9?9yj ziq}tTy;JV4=NP3M;z}@bsUW6yOr4ppvT4u(4c~S)+(RXOopbXMS*9o)A}^n@aP0m( zX8-U>?kAMoID}0WYI&M^)slp1R)=v7*H7JF9WJy0(6+{B-c9&zB^(l>_i4t#*vTo0 zhK2?JPWg2Im=O{aAIO!koB8ypwDttkrVj3^9V!&SMCH!HF=`X82703s6}MslPUe;t16HsVP$SoL*ft_oDe!vY1q^AV4+3O zKtWE|6}rhs@MVq{R^R6jEIh4@c^5sl7graxeCp=Tn?c2bt8muEu*`u9FIU>bEaM?22+_ac-lxzEQOtqlJc}Ss8n1(;9M9;d!dM92ZfKkQN$nPI%@t#qJ5Rs*sT)g)J;vryK z@scJfOz$#2uTY9xt`VXwDxQIIhI6RkuXC7`_Fh;%uodU>Mt(i(8vL546+K=+p;4RS z6WD6nDpsvf@aWq5&Q=N^7#CzSJhKkHjHXX+6&X#A|jWbm2@6W66EdgKPrCW4IrXM*kHe681 za{bBTuZ0w969U_H4@z?3KaYNjMdhM$VfZ>jEQ=)M{z0AN+nQ1^GKScQjRX=ASENEYPu!0(>2d^X)+}g>%84A zFG+vx1QYM)da`Yy8}ZjO+se|vcivw9brJ8IeedtJ4a_tzRc6{Y48zTWvdPbrlatYG z;r}_&E7l9s(L9%3LwsySC^VOSAZld9C)T zbd35f2w+y*-ZS!e3p@3$~Xu!2-9hKunN!wOm;H7AgnPTN7zv{^K5 zSy^6n;lJ&#CX*!yjI{omySxrZ)$gcS3L9(!zuM8^AI^t8r1FNhd+)*e{x=%Us~Z)~ zyPuC&-%c-&E625|TCgNwZoRohw``S?&F$Ro_9ky{Iaf~IzP39C;o;-62?%r_mpiG$ zfe;`Ra|NORC7TsxMtg09G^6)!G z+JbbL&4pofHNwza?t>Kib+Js$w!N$Q)ekRGnX(l>>xRMmxG8Aw`t!d)vy_eqW&6#) zOAFg-AWe4D4?PYC34eJX*ay{09n+t(C0d%6k3>CBV(oum`C*B@K7S0h6S#vjv6 zOx2d{`v811ie5zR=P$50n3}EtsJ$s*%0WXLjJC_%kuncI7 z@3n9UGF)v<$La{LDa^s;;xuV}{Yr;2P{D zPsfk9$G?xzyy?WFWqn_sBI5be4D*^+|P1`4dTy+AM~H3v-@0yI3mxMW)!AT%xhJt3Fb%_ z`uibjYHA?Y`BYZ1=1Qd!d>$@JV(?iOPwVEqj)Nn1gO%2a%g)TnE=C2@iGfb;>?wEck&G?byELK#^SDGnHRF9gal zvb!uX0j|oLM7sVYKI&-&NpRZNDQy+pr#u3 zqt0aih%>dkXo+yvdE)*CKabr2fm>={qa738`Sm!>GQ<<=z>+g`>pQ}w2YGYk0w1kT zKf50E2?%+06vgu0y9+Z#92nMxcQ_dr(Wi*<)D-GUx3^p)8}o`4Fl;f#Xq6j@Xf72B z-(yXRvLRY~_~*2zl`;dlD@ieDiAq7Ly~6yQe-FcatdYB$xuR+ligdBlF3t}07%Kh>-c}hlTBUEAEgQfGec18 zPtEG9bqNW-`S~&-ME0nGzdLjnTRuEO95-y6;%!FN{0KudYZL@#rnzz#)Kn(39s)8A ze(Ond3u!&KdkCq%Aft3B>3Yvyt-;`3SP_vl(O+1J(en6Ym>W=J%Fw~u>k_80Zg59Z zq(U{B)|7=RiEfCYC-{G@@pt5cG5#2T?_@q?#($WFL^03I9e|O#Qr-vA+{YVsa|fre zyz$6V zF62D0RrWmY#rO|f=rLr`5kNap`Z%4`AA4xS`<*PIO30Q3GZm?M9_)xe-Y$7 z=MctfCns3HX42&aAC5R?&uL2KwRL8Ts3Vn9>@&Iyvb?B@V_V??wN4uM8b#`$06 zyV~dEQuipv)oihS{_o(~83U2FjVPQ-rAr!mZ)*$Vy#mD&HF0>7hqJwrm}N`O`i2Hk zi@DsAr>Cby#QgkZL-X%Heo)bV2TnJPU}TIQ_whi5&!k&LnFvivew`DM2mmbCrf@lW zWFZ_U zcYl5xrVlfHj6ejhRkm{7o}-k6RgL~4ao+0bv&LcK?@uNp%Q|3+1*fb}wiB_C`Qz8y zqB-UN@WEu5^pMZ8XrDrY&r<8*6&8*KGVecIGTWNm5?jCJkW zlIq$DKjRt&!3C1NUqx75G9DAD5QSsYD((Py0z@Fbfp1cE3nx1})ba5G2n7klX$Gp6 zJNjY^IK!8BzmNAVC#BFJb7YV64(z=3 zn@@dph3E=qFbUJIZt819Tfv6or4RLVT}6v7`i}0akCQ{>~=`_1&Fk1jBAzxz7)) zt_Iw}oOsPYzvqtRSFGBc$KWqmxA;ctvuv&Uy*@hqC%uZfBjCE;{;;odHLWQDa!~*x zlAQ9w^|PBJxzRYgK|JVycnLV$?zBor?RzOVqL%W*TNk zQshZ%`qLZtoA9Qo%b0%!xnXd_vDZY3Q{zKQUvQ-$Ws6ICl4ZOyo3iNEJ0tBC3b>e3 z+BZtR-`yVF^vZsJ=TB=Z-!+vbt`#gm>w=2#`edry63|TgwfmQ&+S5A3;cU5gKM3x6 z;Q1S9ohMSWCW@^0R;j(Q9RsH$pvS595d6Y8aL<@U4_CEfO|q_tI5C7y%o_->X-ELF z0q~xZjL%og4`=)T-Ozw>61JR`_3NA)XkZ9A(9IQpr~;Q2>aOnXwCnNn8sYE@+GaxC z*)#japMB6T5R4mSq&UpdH%Ay`F?t(T;~!u|u8_#B3h*n1`bk1k1&;#gch7^j3-+JP z!~pb}ZplsOulUoM%V%LT=B&rPI)6l^z&`SGPGM4gnrE|UIe3JcyXiq#FKEo~NdCxAZX+WZ24UFQ)1M<#R&8HQKN8gd^UQ9;4@X2Xc`R$6x&EL{*L4i2M#^q?usQDRG*p!UGeI zw7TDnnC^25{Xr9>aCS)G-&Um#W3A-yzewMfJJ8Ga%p%2);Bv z{w~vKCBf;C2$SeeeY#2PQZyB6+>eJ8!{*x5?0^kuep4$4bNL>1^bNfZzOL-Z=GAf( zRws+2hUR)y_YQ(}usje0jKxe^Efao-c^F9;q=HJa;A1?V%Yb z#7NOrcD`q!zQ=+)U>ntZylCUGTrv((|%IIq>3MnF5rv|RK zMa_mxT8Jj6CKa&y={z**Gb*3bw5NIOCbarP<+a~oD#R-GNAeLF+1+2(4ZXY`mnyTI zYN%Iee%T9!9_NGyz@Q&~r=I{iQ$;3i81Rbf+uLO-kP4%`d-P$IFjj09Y-jC_rrVdB?@EZyJ@y%ERHLk)vx(8!zhnRfewQ-s>vwGeo*UZsy8R@o7J zqDqc0SJJdP@zfbsc@=pJPmYb8_@TkaJFgVQI+;7TT0?K4ph`46=JZxyO@@_BI92Y3 zO#9kF;QQ*#B>~L#Xk7Wov2sf4b#{5Lp&3d8^}g8=l|iorBA|! z|75?T6a>jiWNt6}B0jclVQwC5Qfrd>7hb{?VDByc-*57M0OXrm-RjKXpxEH_#OSEh z;<>w(tE+3JYK4F4(t4)hl*FP)P@+=gz*nvB5khyz;S`f#CY3&W{@)3Y->?TLdRM@l)3%Q*ykOsQySBn^X;}ECTN)2UU^^Omiez z_~81~ku0BbbP0N~8Rlcr-^ai7MQ6KS>9| z#dO0w&|Nqp(Cg+A6>4x0WFc5CP7jt5d1&Q0c7_;_jidaELz}J5mi95JxxDy*qx2F8 z$+*IP+Fr4C3(5Mhx3W4e0UB_LWscD`uN#XMSvju9)iUVwDMj1OFFe#sS>9KZ8z?7Zx{en}2+IP7y zYN6)0!8Xo+t?GA(Cpau;MWH$C4gxLk)G1W3zOn@iA{|nX_`X@^t{5-|7$t>V9#AF> zMz=eSWI66GI3x`Q`q@fMb=$LHW9OEWzaEj zTpl)HM}AKIb(jA#h}-hDK&}No>naDGY+0;bETQ%c7aJ`w1c~rz`AD8!Aa4$Yjmr;f z%y0?vN9vDMCbP_^97syFY`=t>r(WSiSO`mp!2JjEqKVe>B`;REm}j$0RM|@jR?mT> z&uJ!2Cf)rx>;AeBFWe9R(1TtSQsg&(#hj0lfW?8zNr<|gKQuHX6ss;fEFxWj3Jr0# z*}?I=2~wjL8^LNsT&VbyO$SCHYqI#OmS>Mcc{y+`_;@zUvL|!I%-IDU$Ysd=J2A-! ziVWGmNB+Q%wOw|-;*+YrcrNNep+n15LBA!;emG*D~J(MffT%?4Ad%$@_LPI6YE)9t3xUF&UivbLQzqiLr?|iD5;j%}7mMWI2iKpU^-)r*ejpTn4;_M0$VVQt{hD|oDcbq&ZMqLNbw$q^b z{yz&KW=;NtZhJvd%B2nFm+K!1TSQo6Ib&}+J@U)LnqBm^eg*~r8P`orz=EskvtviDaDj`I@ zQv>QY5i!nJ5&6^;XV(WQ3K`->4tf~jiL$oCoRzanmGo=vbAUn9L?of zm=cE5=6X_o*9=OTo1Og!(9@;z2qp^2^wvf4alk^qi39U2@E*jYv>twtZ624RRU8P7 zFnbt`F!V5=KGLNUaM;m5a@M{KFrMKBwu8x)smC`b(@G!Xan+(L*uYKm(}FT$VGN;h zvaIUwZ`Ih496wa2`&EuYkn=pH6@Oi+R1*8X%7yLJ=T%R&iG>QFB8mmWv-={-6+%EB z6mPgM`9^Mco{$h66cWH$_aI&L`}>-$7V);exO1M|&B$$(c?4$H6|JE~?WmMOu)?95 zwjwX$4*_B+Fk>>`)_Yg87zF6S(2Xu&UvHg*ty=Ezafg<*$&MO8tFY&kONQwxd)UEl z^Cf-IARBb_z*(kJb{CScw=oP2fGzV*OlemWJg~o-j8% z&mk&Ttabjp+@dLePMsPx;LTstH8#fPu=IVqTdmkQU%cKQbJ`n@vb2TmziO%TtI0IQ zdjk3=suoy>Qkvh?2(-1MS>7x!^gUo$SB0pCLhed%Vfb! ztFk>}p)PlvkktGL`^QjPy#f~$0FBn?k}ske<{rLJq$pJjMyS0wfHV&Kcj}3g)VaWo z3Ym*d53fpwZ>!GXj zj)xHH6uYxK;B$2>m|*y_+$v<*K1(+nP-9@qYm@=Iq$`;B6%g}TKYvDo@C5pazZGS< zg*NG|ycVb}y8f-pz_H_3To0&7`Zw<>{c;BL?XeUkrJ<=M4Ep&8E2*s?)Y9pO%CUM- zE~FlmUX7x%s@2$|AcW)GZdOQM%+`wnVZZ#|#Z%MN1y_V*XCFtCK3TR^zshC@n6r>o==2Y>mlXf!_TySA^Chs7-&qSbM_b+HF zWMzz0YGWBWzIjFswqXH&Ib3Os1b2=aNsJ_G)Jn0`JhN`3STpA03HH`C6<=$h$#K3M z$^;Qy&RwoT9?odlBEt=sL!`2E(QqJ~RxsDESc|?G@j4$M{0G5$zg~|aW8y&!B~eNL zhus0;3*;s!@?~F`14h*eE5ye(llgu+6t7nNSDW*tYJ$4le*>fLLSc49J}SrD0^0T5 z8E^+gX@lReexr+%BeELt*7ZU_q*Stu+fA6_(jLy{LSZ%=|5cz?5cQ0fm=KYaT{9e+ z+_mPFk*T26W+lH~8&h-Fgdv|S9JwO)mzQJ5*zEF^n9V`>`elk0^J@1rW~l0eVfW1& zmTZKV&`-8PG116Yu2KKcLF*?7A*p{9628q%-CRCBPOU3z7|Y!d`Q7lJs6hJ*DGEAD z+GNG^?Mp$XEgLv_S0P!sC|3?->E?zj69zSaZ+0X*td0c{2n~-01D61Rb{CHHG=Gpd zj+R7ki7$E!O!Dj*D>bTk>(4PrzdwTQ8>E#_xkb|Z1&bHMY;8>KyQFsuR0x_(mF-V= z@P7S-jF|Qafrom+TuVntkA=s@xYQXwZ?*c9FIrBEROLAQ#%cM3wyX+$52sjZ#B?|) z8V19ki=-<9MZS_*PV;vVj>K#-rT?+bfDZ?wj%O1BH2pOb#gchRE}d!dc>PqSUw*0b zMT?nK$U`xQ0gUoLJ=9brV##}*^CI!^46Bm-0%KG(F#q*a4%tA?Mnb;+>1B31DP3z1 zmT27s9(bC|>h>>MPIhJ{x#{eW$wfK{xUw$K-7tJs4i4;Yo3;&@K<~5HBC`!XIzkPd zhUbU3m(vR&S*)|n%`o)ySI&#-ZZhaC%)~F<>H|5S3ARFajQ>@!d!)9giSphBLqlF+ zw`}VKef6dw5pf!2T?+~ebi(M5$}m32A2?7Tcl=Zn!vYbyL<$p22`}p9tyS@pyxJWM z<})#kp{yc3D-m<K0bmCfrB9Q6CcDh{6x3s^K<^rQaze$PhzCFV2I{} zG6DuCtX&;7NudWn>nJxoNjlqF)&9UwHec6E=)LJE4}XE}>4!sZYN?CIC^%p&i4t%Z zH2(D@P=jfWcmaC|m?m)q{P{`t!EuogwoM2QHV`*)Med{q)+Hy@>Gs2=3nhej4aKI% z6ky`69kDhvFhLJ^K^&({M7#ZPZ9kfMS$jiULF9I3=`%u;9Mq@Y6$!DZ=esieRD-aL zIf+JYct$87^QW+q9s>3`Ol22l-#w}EIXn)DF{=lsNbO38n66x4g7sMvGFyg5e&p6v z#E(Vm1v0(R6NGn-p{z{u*zU?7byYH&`%5d7UBL`(OBenwKTu-%XY2?+YyyD@`hT_{ zM+*90PgjBw`3d5`XTrL}9iv~M8VR}JqnfjVUDSiaoB>A$C zhwMIi4bZ^=G&picfTd$utdb}it)N>S()uAxOHG8;kN!#RCdL&8w~B1+3+#VHu&09{g3tz%-MxGPbb-@vCXJnXhZp^So6O5|LGU@LC^)v1>5qj!Nf{ z7{^;O5&(E^T8>R<8#*`;=B>Z8+UM{E>JC&a-EsZietS5Kxg(}mm3$CF;6VZo)(e+T zTtwlk1_3$1aQ|7CPigYFE9q*itwio~z+2zx5lf5SS{(Z26XU&Ge8I1pauW1)G7CZN ziu$Sd>UO#LM2>(@B;&K$iAM@_E6`oL7f(8bv(EnI8tn|?(CD9xwRVCqNU&qU*)L#Ae~gHqF2d3bhJ_B3cEQT>ALUg?!7Vj%Ye69kL4b9AQq!Dq2(mH>~frK!8@+rj6}q z@$sRu-$)v@c!sX7IKZ?$7GfEp)~buGH8!a)b_R3zVfS5yQXdDq1c-=m?B&59Bz=uR zm?K(m)(3LMaz1BOx$NJMMW5Kml=;h2<#wXD2&UO&Dj+?7_cO|P`h zMdmUML-|8#FKC>vu`c(^{p>UOKs?lpIAEC=20yYk`u;wcFAvN@ViSyUF#BC#uT!S6 zH`AC(>5{0R$IV=Ew8)okW0*l3Edjb2+o6hAxD7LQ{4IUUzZ&rM=q9J8I5XCG>%^`i z`#g1_6|C=FaC7mCy$9_M?&_-FNucit=e_Vvkg=MvyQTDaX(PYBaQ`*q?SmWrNSK&_ zK(uSC*IEwHt|e+$5uBAdox1V7%T%;K>OPL%1EqSR_I-ZG_?(c9&Hn<=9|k8;HHU7G z^kWDSELv!mD(_(pu+L8wqw(!|bWz8W#VrRx%S^+Cy5TIR(T9B0EFz%Dx(Q>T>ai{=1dXC7?Wn1d^^)y}p@)!6<+h4~(LIDCW{qSEvsr+7(EYCM%mRX)Nd!_J$THt-@<0Bca)L;i4=0 zqHXX;C?A*pjD>~F`Fc>w6%dzFg+@pBv+u-rj4U(Nr__bTKM!W%-W{Ga zjLHhOV1lYvkNMfS>@o!%mPVBKuHe6>DNl1PVazF!CLF8lSd1_vDT9jSS-rL2%WtKY z+ft2f+2gd<3|pO%g<8%>MgNq7&&; z{fA9@1gE$@u}P6ke)b=3(>KNx3^-9rG9s?6etc$Bf4j#Wli8%&ffs#=DkE|mJDoO0 zb+eA~qgB;Mmb)O4f6^2}>r1=t;H6uXQbZcQu8gGl^H~#YU>XFuG3-MmeZ5ob!@5T3 zJ2v(*bM0}S+L<%w=8#o3W)okmPOVabGn?_x3ah~@=4tw`?r_xGi^reb#uQ1^ST4m#cyHDw+6SguZ?}JhCKrs~B zu}4Qk9!D??-~PxZ-6B*$P_YsVviuV>VmiDwoLZ#G#Z#M6esa^NgEn?w6ml4puP=6v z1jWiElv=lDR_(06M3Uqs-f$o(&Gb0Gt=~w5{nqCYRheS!mtwS4wx7IV8N#c!;6rB) zkm)Z>_(+cpUh$|Fg|2WEm7r8&J0K!Dnx#mEatubnF15l+P!tN>@R%)3mZ7-k7k=N~ zdI*;5Cd9zR%&PngW5uE-m1tI5z{BOe*1(CLc!-%uss_b0ccpWby+6hf}GhaLX0 zkpAoO_OkuqhlGNH8OtVv6*3G`r$@9-L#j-JS&<8lmQ4ih<7*0Th?i{)d6&f~wnfC* z;|tm>oa$)Xyjhj_uH0^S_?V#FJM`f`pa?`)%rb*)pb{_elh!?Nd|CI5x3@g~^V>R* z-<9i=Oac|2RW2ry)P8W7)~b~}=c#f@eJ8a*-ddhvU<_4--A&l4`)B;5hH92Y&lYMZf%J><~Votn1XKY&gILX~xZgM*`ZHVr|y9f#Gm z>zg;wnOoV}#U&np1`r821Qeay!fiYMoz#nN;3w_`RVL{e2tegp43;Z4AgiBji+I4m;0{tI`qz=i)3K{4n+`J@3Oc$^ zk+eD59umaReuA(f5TC-y!=n{lbW?H1!}s+hN6L_AN{~Vp<)no$T=$DD3CZyEUx-#T zbi)lxYz}c$1s(=a9jk7=C1K2GHhKw}a_EqF$Cf#r>8$omC_%k}aFWsQBtuA8jN}6) zX#1~n@JDzXylw5lt4A4*?*5P&_*(P&deUvHaS#*R+kQ3rV-122yRDN$mNlp$woVoW zM-k4wY1oB7w3;w?1Z$AeYO@_eU>U@spojS%&y%kR@)b@Jd&j9vl9-={n_d(&M6*0Z zE@y%iIw8N0`$*oy#>TmJbcWADM@u;-2gw*>4u8t3^r1m6q=sdyCnw09ZI9LphE;VM zXG&%>#4?#=uQPLTM~TGw45?0nBaFC++@F*Z}=-eEOj4Xi6zvmA3b*jQ*{?v^pDnH=k{?et5v1^-CCVBoIsg)qYJ3=XV_9I5*c6Wzbp+Qxb-AB*Am|9!V#&3Xb*#CJrG%D z+pf=uGOh=IAbZ;RV>&Q1o3!-AE4Fo6S$x=~P=w^@x$i$-Nwcl2qb_m$wjaR%axKVb zF&S2Rxvrinpv^}XbIbK%q=;U}NoZ*r^wpnE9-KB`rV2xe<|mpMO0??*!N|VjZlHZx ztec_zUhJAxuC*p4R#J9-EE67orAKbM%ZN7e;kK2D{;eW9+fPd;`ViE!{odjFD z1Q6l>r6HX`4CM;?IPMO@GP1BN0g-4S*fqr;$3i_fsbEAnT_)Q+;*qmfw#{BQkTi|% z+5(hRMF?CCg;9gutXMmNW)bVKy`qD4CxmyS(MB{AbK zv#BB#*;|er)T9wbH;t^}w>NchRn2PB3fXfriqyLWQFpQ7-A*tT+hN#z@O&-=m}o`$ zTA7V7&XE}?Zgq7Th2LeqJ5!UHby|m2LW*E~Hm68VOwPA$?Z%7c zELXzSl#_B@vFAoH*1$y3Q5jp9rM)RRDPyc->}8T5U=yOgV}9|Cg}(|)>bi=to7;y! z&oi`pJDCl7zP*n!9BH+Zt!`k0?%&&^v~D4cCl!oF#%E5w9}Sipd=molPk<~R0jQ)@ zumtt;NKJifnyM7c&4h=^d2Y00GB=7sL!J86GG5>jc^H_k6a;XYXr6st@Mv!K^d z(Vzoz>YhTXYoc8wHKOqK+wk%TLPi=?qrzEUUX8K06lhPkRUH5KKbo(%ab5y1qtw|x zH|&}lHhoQL(k-eZ?@SR+z>ysEYYl6S>9I2M8j4=d{cy6^HXlo=SrLb66yFP zA(l$)PsKv`u7)F;13OWqLM?{NAFc6E&d9TwN{6MCDy4>NkF`lyl(m(nIaXpB`BP>;dC(lOUXgnBwYfPN;iCl9Ls}; zZKQ5gFjf-fW6oa^CPIJK9Of9*36|QX-XoSS4buZU$ zsNJP7e2Zz+aZw!CPPtcBn3F5&q?E#awNXZGWkIAh!8m1271G-Aay}Fh+>5(Y9S2`e1VJ&&JYqTc9S1Tn}~%>_BzceG%Yb< ziTC2dtb^`k#dsGaov0tpcNy*VS2UWx7%pE0p6xq(VddIpBj(`X;O6by*np8#AOuKT zTf2X?@7>M!?bLw9*FafT;CdKafQRQu0}BWsgJg$C|Ea5P!xbDSkIy}4_3`XpD-o(& z6P?9`&D-h$cex=H$}f$`;T8kggf_$ti!|?&mU&&wtLnn@q>{*8feRxxpI_(iOmi)u zG{kC>$OvZ*w=qi8?&nEFy2c$(mSfPLQr8`?HQOC@|4X+s?#k|`Uem&0((%KN%(+qX zPwAyXrwMH}oirDgV+%m6?@556U~}9~j2;S5;uE1z>G9(Ichg1@$i9ti_50@DNm&dp zG%Cj3NvHj`3CFYeTgZ)FI_&a(vCMbbjA`w6%){M-roXe%2y~G%j0=d)*i-_mmo0yq z>!Z_gW$BY+W1ppz=ELTSMd^-Kp@voi#U!VVN8-mlU=2gNN!`q4f5&*Qnk8<-@J2{< zU%@fz(~d<(wf z-x-t{C5+;)4^iI0guV;2r0(D&hsbx3lgyKAjO(VcmE)HpQJSSoMdmz9c#{PJp zY!=BC4I>U$A4_A+tKWw^W)Z)4cIcw5`wcDncVBOu4dRG8)->eWzIjs=5QFR-PYA#j ze*vr$;NWpc5`TQQXCJM1+3TMMFwaHiLDv;EW@L%CQ@tKSc1!M)wLTMMA@2=EUq>J8 zwq<_HUv3x=!veHEUlg|KKiWazZeuA%Flvd|R58uq)dTi=@@Ip3NRIn-`B0ov3_>cL1Fp~+D=VcB5Rg}0IuaGsH9D|H4 z50B}s#7G{oyoe*k+oDG|7W1FX;JmYzmVC}o4kO>rjF*YU5(m+AWm-e66~n1paK+XB0hdpTgINKcNt(fJ*n2+_=*U&cFyw@V>FHRpe_B_jK~LPqsq1? zeA|6+Kz=<_w}klIKx3=jELn2_hgo3kfTQZj*RYvNP_`gC0Rv)$k{5|;_#Llh!pJEbtb#GM&?CMdv{gb|8Yc-)<>yK^ZH(B4U61*cT{)2PhQBy$ zB`gd;CbF%n=Y=ESa*8lOi_ATCsGHX$eoM-k@qcj`#+&M=)A#Mq&QZhMrDYdpoCD;8 zS1^+>h4$p^cM<=eFd~LO8og~e1divt3%mc^@!{p)YTL0x{Y|tqm>5>yc)G{8ka=`A zH>#;L4W6H&lGbjVYj~VJtmyZ})izup%PFW6dSl>jO1>yfCKw~s2u<+<>U`!*<6MWt zVo?mia+T>K4%|<;m`>aGoLK`?0XP+x;##+LbsuleFCCsUZp>4e7jb(9H6A7#e>K4q zEpbQhZyFaoMKjM?G2xNYQc{7_Lrp$FL|FpQ8v$8FxCk_A@=9B!=+HL5($4akaaFYKcR8jV8O&( zmpxWh)h9v}!-uYFy~?gp2an0#^);3X0{x_elOak&2P0ymd}q-#4Sj(Tjh7YM)*X}v zJAl>CeSn3s-{Vpmp@S$ZkB2UiRegh6@tr*&A1!n7jlyuVQIIOER0j4*gWY+n6BBo5 zMYU0tQo-Qe{W!&z5osx`7au$Qw5=02>gEN6z2bJDf6@+RN*4qZc4%CKonn>{t3puQ zuOU-hA(Ih?q3M{27k1pmy<&HI8m-c#L0okX?qA<3VBR8&insme>@y6;(3g zWnXAe{v@C3EN43TGzCu-`7~Jg;sm_kHhEredR04Amo-SAq^ukJKYe+<9c*hbJF+Jp z46(e|)i-9AOOYpThBr#P3ohvUPIU*hd9Bk&Bqntht!V6@R!6lae`6t)d!%ly&|4#u zeKov(uX?&0L>H)j?b#yryH$uZxguKEb%WFFhn4woCvs#CzRsU4CPtmxcK8@l@A_lm zp^6h=Fp+hQxC zgmP(014o$^$}x@v7_q7hNKC+fH-w1SxgCHgvYw#*ATz3&ke9)4!3_A9@%9WZ&*?m# zMw&j;jg@|5d>VO%ii;G1bYiD727N@lFaR41OFeAZ4Xkn-i@bu%b`kTP1zg!!#8PJ& z%iT4s*>!Z#g(ViQL{d}F3MHtSDw?K-R;7XAS_{L~L5x%eFp>;n&@?fG78+=v!j){V z2o*tsYv`cfHTqLqQp(yI0>NE9U=dL1al#5H$V~W-7y%e=ER`ki-*d4YUD@T1j^HY? zBd@YtZqSg-Ygo7{S8zvVKkk@0jC1qnvAVX}=MQh^x(VsILBDRd+ngi`n3;?*ymRMH z%+1Z=vBw^Zeoz1mCr+He6Hh#W7hZS)Q&Uq|TwJ7Xx62C)3#ixY06>PQ#mrZ=e~?t3 z=bM;_(5TmNXy-H@JGL7i-BHJsX~Xn7sjY(F>?@Z^iHV0m@5bl|kt zSMki5e?~$z)FvC)o4f}tTX*IXexCLoeF&;~1tvG^hy!lL_qPnAxmRNj0o!G}%#nToGo= zsuMw0Fw|I5b*d!=hyZ@wY09{Se;$zvsU*~gq60@jkIZ9ife_3QX*JI9I3Ae16Hg8Q z60fbVy=B@AH(Z0=V?ge-%4Z8LcP6fkO5K(?0+9vdHgkgEjbU?4ceMl)cFzgyhHeIqS2Zo3s#WAOc7zlfD~yJ%RL zMY+1Rf@jYC7>!yJwc!Em#!=L4C0%c3qB29u`=VQqQaHcMs`sVfLXw3CR#vMOrT~Jh z+GHSFDqsA`4=ArPWU2%b^_cP^F$UF2 z70p@$BaI&CSih`C&k2@R(;|KF5XA`A^QasQE9@YOq}arcNtlhy&7o&69Sz^oZ8!kgfkniW_)-V|}F$+G}Y zNph$#Zk@Rj2A&2H#&ObcDp>KUY`IC$5}Jl_Y`6(?^dKyNAN=Y?tgN;D{2A0Y1IsIm zc>44|U~vC1>dgUc?e0aTmjILBE8Ahl-TsS|+ zZi2xA^{_IKcXkXU+TVGG%-KeMP*s{`18?Erc?^TuWHt&xi$Ij_F5bBOIPrk zIfI{9pT)`g0JgLyv2T1Q?wCA;V*|Hhf3h7TW*A1Uf275!2YAZwf|f`W#v`jbiVQp! zY5A}kyolcpO=`)Gj8>k68I8!z6>2+X*}Ndr)$J|k9gSq!iaL|8^0W*mn5GHbHGT*` zYdwQY3-j;%ynKUR-v%*K`@{fLy!z^^yk*Ol=m(`nkEc$Z3QnlJ8mlRL>%2b_<B zd^Oolh!5Ve7hgR(iQ5LdXka4+3t9ys$qiD{tA4R+VHsFV!;aHeM4e7@b+Wi?xQYL1_8>aF9-e&uWvs5Rc_t+5 z-7;fgX&z6$@*ULnwea5Bzrq&Y0kZiZF%b2S-;cRIpM}~XRY_2uQMQ@!Ca2?=WgNL!W&`WE z(7S}W?n`)b;b-{Sgoc4K~N!AqI0 zhk5!&x+3fAF~18@UkvG1$DrrA%?($hQota$RRTb>*+j3`D~-s)N=LLohWjU2req9Z zd}Ih8y>lPFa_b0g9qgjc%3dLC$0GAY85eS6o#Hc)7EelVLlUwE#JMCO02eZE6wEP& zFoEx7xnm>fu33MC4@31kz+szIbB!3K-xKAg$? zEjX0n3@BiOX2=aIINPuyN=|-ho7F4%e#*pH=QiHxp2yEN=J4dgQ~2eZ&*ALiIV`WG z9y-fF!ta|H$ic(LI_6gv@Z#my@Q))u!||D;czFCcZm;jfxEVo}E2)DlQNKAw#v@dF zK#m#NxfBy6)v&s%H_l?$WcBo%XctXRs7np*>~>9l9tsEFR>7Th>Ht?3}jZQ zf_=5!c+Zxjc<$^ASYBO0pWZsTMfo+HPMH$dRb4zY zGc7MKV|;x4H!2MImCnr#8WLkLF*=A(9zTGu+&Y4N^$k=5-wI-d5UlVu0MPp5*n}*Z zyIgukm_Bp9n;}Sp!>bQpcEX;v-q{9^4{{KJ(W;i(J%f;Se=W397>p0(EvP>2yTquc9ZvAu|u^%cB!^N?3?8P{Zpn@b+ofSx-y*vTEZAFDqbrXzd6vu_^L^>N1><7lk5i}_c zE&a2SJX>YNqtR(>L8{x_qhw_?>H8QkN<%m{a0uTWox)0c^}6mi*DJkc-pXJpQE-l% zE?v5WMx%jepMAD8!fQGcVsLN}?RFcrTCF_OQMnp^E5=MWIweVhnaL4+`aS#c*#05x zuC1YBJGn`Eu%r|dKp+xCIOqzi3`t_C$zn1nTOkxcsmqU?$uwgZK&Ai`V$uTSQjQ>u zCJN&&7}$yBSZ3{BHwNz+9zgGo!(aga^wKL>-`I$PhF-6SvzJceBz+T=Jxv@-K7~0WKCUgNPL#UnV%}cH-1@KZck@5QKfn1D&RjWz_C_0)dvW}Fof0$9?e(y-wt^Se zPvOj!H}KPmXYkPWd-3t{dvKt#11&VNW5Jae!1ZCrs0&P8A-|Y(A-0==M5llrPa+HM zQDFF@(v33k%?vF?n!#d38%4(!9m?;52M3Wf#5_<#75l3@aqHB6oVj!s>+2in({D!C zj2qI!BZ8K^a^(s+{(j`h5q7&I^kP2%40CgH{*v6ZrM7e~p2Gf!|0x;K0H) ziAmn2R7nzSpBlqwj_<`64-8^^wT;9XHv*x^-jQ1o>d7~FPT|ZEtTa$uw)p+kM#UFn z_&P%nkxM%UH}OQ&7H(1?k#C<@6Q<*hAjLQS9U_RvO*mPeETd@%_l*vrbM#iMu6OYB z*G^-j(}}i8x7)?(H($ozn?FTuXA{TFCoo_Kd=C9?3AHE-oMbBPikveUAuWUcF_eLa^vbZX#$pYtc&&39KUjJa ze|zyHetq#*SZ=R?*_LD18-SRB9;d+JxwFsX%)%S^)y|jk=$7~5y{%cy&=jg%Q+;0m zg$pzx8vaU86-&(`97s?w~JRVynvJE{$Knm`2kjv zHhS5D&2n}YgWw6?{j*d>i1}UT)Q4r!T%su;-(|mj+Tsck4^-G7ZWT`EkAir_SrP)M z<>ym``L$qlsf$bYGJf3t8UBwq{sjNe%YTBWUw;~lt4pvqI9QOxnIz@P@&dm9!jt%S z&;BX?xAT92r#mlT1#Nh#mTXMjPxbhv*iCFs3?dZ15)@bn8b~r?#qa}ZTsVaN1D~D9 z;)GQvm06cQUdUxeB_KPe<>G)q-uVa6#GS2!*fX{Bre0jW9m?&Cu0^6BtO{vxaL~Wm zxpOA~;N;1Zn4O(vweg`SjCRHj+UPOX<@^gV`4f{rQSWA^N+rQ9Gn4qz-TU$RTN;?D ztb)Af#%${(amYML3`ACgOil#u8&Y6F{sj|&^k^3mTWCvY7V(f#zqJzq1t|17J$M|M zFoS-gCSEV45Fm#lVMX3s#Q4DEFur=nQS9G3jY?%R(9pq4=by#jzVRRMg84DllJ%Sy zkYLQ}&og6<$zr6kDUVx-g=H3ig^Ro)Wac4oupE9v5c9bNH|(T51SV6cX9pZCS*)9N zywp8~|2F^E_}^dsKk+xG{s!kRzkzPAdzFIU*wpRzaOUD!{Q0l`JO14(-@sok{Ugrv zC9tc|0G+9oIjQjw8zQ!VI*RC%#dFsg1B#>>w5JTK0l%9=TxX$TXGJ7z6cKH*c;HyH z;Z~*!8|QPLl7_sAK zo{1uiGgz&QXdI`zCLkxJ8nL|SJafs!AV1UJifsb{V2ad1(0?SDiG;PlFaaN%nZ#G` zx*fZwCXtk^S{T6k#u|Qg?rHpB{!j60_2*biItW|fDi=g#e83?euT z@#X;vj*KzbHZh9NAKQaZ?W|+UtmfVuy_ioh!9ao_mw?ctEMu|)IOx|hoO~uHp`b~` zfY-^zC^jkibDlN#)PFJ_R&l6kV;NEN?q<)Z%NQrd$7Uw+h1nyRnHYyDv0P*Z+H0%$ z<(Vh(!-a3)Ozqd$NP6k&o$`gCUZ{K3fX%a^PjlW(P~<^}>;f|02*VFl7FvBF|7^Gj z_W4w*k37E=sw0fWGM4e9wSU5YeEm=G?bp7I)AOg%>BenB-tE-scJT6rQ~3X0_$&P1 z=l%jO;B{EjD-Nir-GS);CA_yt8jQ&2vJ)xvss9RbZZfa<$2x6s?~Ns0x<-H%xoC*Y zPrB?rt+W?bQNiBE4(uM@hDvfxw)lP8gybTh!iX=@)i83{UiM6(@)@+7k+`|wdI>i zN*JS_wKzNf2L5aJzhk+#imz_}1P+@WsGzDEh4RJ-tWU*nA2hOU*^gCeJu44}g6M6o zV
^!NxYWAh|Rfq98w!pG&~$P#m%-j^eWR;1-{EFDI|23so=xOHd`e$jXio#mSo zoc=b5nS9yxdbgUx11T@fB=tkk%TyF>b7M$A*cm8WE_bn9tTMJMt}KxE7ll!`?xa-@MI%Y@}O z>AO)3;PA*T7#|$H_AP>aD)sQF1q*&0i|5T|(|sK445^AlaaUFQ)P;kG03x&1ZXfJCo(bV7Qm56tJL;^{bZFeV_&O@FW-6)_wC(_ zfkvZrGP0I2zjP5lKK)ntY3B)Cte(R<*?jkeDvuW61Vt4^VU8Ou>hSK*x}u1Msta#b zHL?0#P;V$qX0x3Sxf+9EEu+glob8^)U(Wv(o_Oug@Z5#xu-0k!!Ga>oj4LaPIQjCA z@qfMkE&LoWV&wq?M)o`G-3p<8pko46OzXd9GK5Zt@ZnwRs$4i$k0RT2OHt3p+ z9%pA~dE2&aeAiuf@#)j2VT|F?(b2-z3i!T4>RBHaGBXxeR`LDkUd5mNdLFN=)zG6v zF|^34BH%JItjQT=%$YCecZH`R5^A2&7_N7@ghE4l8XnDLOyS_{g*?4?YT|3sb>dD zg>)x@8Q72})Th~P$>K_>cqd_aco@ZEk&Mx!tlQBr9653XQ8;S=h@(|@cX!)U&|0Y) z$hdw3XK#ZE$l#j5IdQgswa{_ST?Nbr$XVq#IwOTE81lyLF*#H~RTI1U60v>(oJid2k372X` zgfKn}Fp^O(+o z--#4?v?=j&S=slFP$7W2+&$%VsZ?RU-%|o zQU8VI!Xk_pjZkWQjl34w4#W#JDJXO}4Pk*$?r>SqjF(Ty06fBj&wqnzho1_Gu&9^t z+sZR|^y>F;cIGr%nXs^CAR;VPmhiJzp1`-R{S+5*4Pl_&dFhP?iDZ%h%x1?US;y%f zUarKAvBc$DBwPqLLW|Guf)dSJ^?HN`PKzL(TgnsRZzfRU9g}w}p@_XbJF&TUW9G!^ zRRWQA>=+ot1hl)mJ08@1`}Wc3=xBVbGS!B`Y&#gqBA?Hb)>`%T^{Jko9!r9s)Bpe= z07*naQ~*F%d;d3*MKj@GHPA%3HoJ&_d+7qce|8zy8eO2EC|n~m@F6Q-PC~4vy{i)> z`FyKy#eSGofRc53Rt~%Z&ggx@gLfH39)e;~72EL9c^__BC^)11E=pXDuoNnEk;3~o zZ^jo6-HF?_Z9_4izE>KCA;zc9;g^@cj#q-mQ7u%Um5MbDn)yPIS^%k8fVK@7AxS0| z0Qhr0G)f+aOorG92#K9S;>UsC$Jz!W)KJBXwWD}+`nxza^Gc>!xB(yn7FU+=lM_eq zgSjKP7R)8iolFK9P)@3ai1SV5GF?7VECC(KgZMNAYu6DnIAbTFnMj$)4n6SIYou7u z2U3E*@RK3D|IuHb@)*ulWm4=_{F5tA*2-M)AulU&ZPCuTaTV5h_@2q@{DEI8A65z{o9^b7UI- zYL;LiU3oA8gZMUt@F33nVg!gfnmE-wiN|KXix(z;hek6C`txdFdSMzrIPstO>B=)$ z$S*~a#4Jf50ZRoXg$U1f0cX(GDxV1sWMVuZVaOJJWGtVFW1YVD zjF}bxCJ;hTJFkMmCJbV4UuMVfnnE-dN`7!NI?)b8tJP8?BO|HRcq!%R=xF?VadDA1 z8B^of+R|CgWgvlwFflocuRV7jkB+Tix{(6~dB)KB{=bhYa*#%iCYhHHY=RN5Oek?3 z%a3|WLnOHcVg2T10^vFuEIoy}$L(^#AgUuUTNgQx8*27$K7l~qD)v5rBZ&1Vg^zCA ziodz*5N_JM1-T9eLakN{XD%PZjve^ip*u0WX){y@;#95I zaD3u99GUrNoX`ITwOqX|C@8m^B(@DKWe8KaSfAYU%I5R)2V8#O(;?O-c(e|d5TbxN zn!}TopW&&=UtoS^&izao+z^Ceh*Ou(;$JWP3@@uOgh6NrNCO{t4<2^}53`LI1Z?qU zO++S47y@D8B*bstCAlr=p*g+;DX1F(gWFA6pMZUb=)QN+mYk6ZOVhCtls}7qr$mcXbBeczy!E zxYWW@t7s!M7Y-m)ixzkAs1;c;%YVJ(T9zGvvb7tre!P>Az{)y6b~YvRrV%H>Ewu=g z5cf$C7yjMSrl1myu=iI)7zzUX$*!IF%$+0HxpAnYWp=e*!AlpP#(!P=KR6rw4)vg! zY)u&9fsKU}0?d(1$CWeJ42bOv_p8(7gOUhIkb`p)Ep0I%?iD%c8fT2tq!vOR{S@M>C8&GE zTVGpgAoE&uuf6BJ6@%E(y9I>~Hbxn&4Ty{_f;W0udt@UXKR!N=qeqXbrKKhH$Rm$9 zqw0(X4>~b5HKq6&&8Q7~rln}eGw?&J72@=jX?){o4&C|P_|WzOx>Yk`fKqpzvMP6; zGgYMK&R5u~9X=f9%UzG|Ted}lz?dboV>Ai74z4Ec$e%d3rE~#B!B(C6Udd$SD<BSoI0_~I*T zA*FLVY&0M7r{)J+WL~h(k0ihKNsK_jaP(aB41PZKZ#X}D8qF{>a(u0Us2#BC$eCxb zyL$)zYT#q&*X77PyudLZ^XAOcA*|#|q(W1bI0%tFb22gmMEM*{8^KRP(n)QOj(g|NbI!>!k9)92aISvp0@Ok2`Xy};Xp{|X?0!nR@wpWb^DK6UUQHVq7{ zqG?#ci{nq>iTSVLN^lA-(vAV7={^apf#@;6I<{~8xlokE^^369@#0n64QU0;(mZ}u z`59iCeioI+N{4Tj!K(qSHLlH1;wR^h;6*x%R!%3!7=8Qw7Fw$WSG{Ti@|TNoRH**B z4;P*BBjj#HoPaG-e}^bi&OZQqnGjQ zj6wr>uhp=vmL!puMpR5*5r&sDOGU}5hdULJD|?{`Xm-}wTpBy}h4ZXe5BX|6WfaTf}o}YLezh3zU zt_5RgQRw(QFl~69bdo))T&|H~5CNcojpiy2G>Lz?Xse_~4ZK+U9ezFebIes{*jB_k zz=yZseY4fVnW-^6I{r8&@{^z(!y^knq#cjc;<1sAe=E9B`Ol*#>U3f%F2rB>goz+XJ-SgbwEV9uCA_J5Kt}%DA&`~ z^(U>cHQZ{2DhL7(IdmauIAvx0HoR|zA*PpWm~90Z-q4TD3*YVQSZ&7d6yzi6Uzqa?yRul7$B@7L0#J;X! zlu!^`25E!L88_IVlY1%&;&`-S_VGMt_4%$=w{1Y2@>H6mt2AYOVTXt+furPzON}20;+! z^Z9UKV1WAj`|0@c%)P8~_wM-*E}0uHVh9UAu7k_|fn?J;SeiC8iLRxysmhWOBp7SjX>AcB&Hp|_!@ToxZWCVX6rB|tj(Z=sE zI{O?d^%cL?D!YHp?}-Rk7pCy|<=@~uE<*>x_^zM(&LACT8qup(tHr^m1_lN| zM2bhNJbd^tt;uoI=;$cM$H(L7RgusTlfXo9O!4mJg%rl{HotEhNmcRq$;UuSLFj%<3agvL{}$J z5L0;YCT?3ihg9JTq8)z|jes<6>+Z(q4~*bFH{FcxQdfuZBTUX;!!IZP6))0HuvD0D z`)3fRCVUQ>d?dhnrjl-f4H*{}Nc4;g8bm+~8kfS0cz*5)OjpdQi1jo7-|F|xW)sJ! z&f?eeFJURDwyAdjTPxthm$(XLPXv=jzLOA)ar@5IvTW@uFYGx+>Gh@JJKO7{8Vu3|BH=!~DnrRj_K`NY?8T>TuC{8Ib4 zC1>n9DGi^TP3)CS64{SqTI(+we?l`9S^-P6f)^^k#^~I0s5Po@_*{QG{>?1R;K{4c z;k>>QX&D?&Z-atsLtr_1V;LR)CS>Dh{8JuFrj&^&CYJf(XhnRTW_{pxO{s!OiUu?) zSEK@V6*i-{*qvxsvOmus`)p}L>9eGbT5tZT@;9=I*>|lS)sZ?Aq z>kGjze8e1!FLmXF5Pjmm<;e%x2ZdzXD)wAKycgq~{2o%c-~xr6Cl7^t`ZnMTcm4qm z4eySERr$wHYmKpMXYkWY|BMsC6R75@XhrJ3Fp6FohsI{_!#^jSGe{n{8T=En&%{yE z_=RX|7cSuWxhFBbbS;`fZ}dEW`~9`T5XUFa;5Q4$+FAxa=Y8ap#DMy?)#N1MzE{9B zek3Q6G^F-%6S8qs+CBJ45x54AEpn{BxlGQQ$inzqDPRi*FxcIXoU1%%wDuw*wY0PpmmV1zL0Wk0953|56HllkM~G{J+bYEcbKr?Qsoa$~kko4l0q%ru_gQ+jN*!*kV> z7@xm_Rv4~nf%PjobAdtMo9e>}p+!G%ilg;Ooy{z<*t;W4@UK5j#Z?|4FZm z(o>t*0+1ZW`VEoBqG`rljoVZ3KfYQ}qHl8b;@Ob*f$VE6FL?wOPCy-D!>0vFbBQg- zL&e{)R|R-r(>8qJ&^vJZ&SB(oc~AcKwb^Rol}ktQ^T{vcV(B?Ff>sg?N@xh;#g$4| zAo-kcYR?um|I=unjF<|q;^oC(VRm^cwZGZ*^|^*&3!_(0;<@TcRD)VO#zdQ%rfUy) zx-~x>PVa&bwUn4Bd}Z(J17PE>uRV{_z!BV?Kq|5$%1&e1dV?P9?AwN7p(N}Wva7io zrrsfxbwoqRq1gN|1BWkt=}YYyvYOE&05lp6H9S0QIzz&F1FgyM!P|(OeA(4^4Z{%U zug&1=FO1`t*IHQ7Ih%RLS9Zf0XZ(njkw_dr^Ds&4UI-6f9xuzu_cFJh3OM1ietI~l zC1fy;YLzqhp8Z*`b0~SF!AB4YeSyLUH*dq=jQj!iZQp@hE|)TXglesVW8=TYFQ&hY z@zM)u=2}UBDjBFs$axlzFzF=Hj8P@IT`+amsgASNmvMUGMHY#2ea!E->veW<7EjN; zjA>e6A+UYXTY0fGT;eyLvdWW}L>ftN!5-vRo(g<2iW0whRZ3_a%tW>pJKCP~5tMUX z81CJQa@7Rem1AR;B* zL;4JFJA(2tlkC3JeW*j6ygZGs9u3fY-(GxRa{*mw*{XMGOyv3LB`j96D&>z=#3g$r z+KrEY!hR-k+v<<(1N-fp_rC20t8e7K8;N;Gtgbjy#JyESw5%wf>?I<}d?3i-quX|& z61MQ=W)l}CuYpL5ezhB~)K~EQ*i*=>B0jO@OW0n$9nfvjIbc0DO$F>T24pu6Ib3ix z&cu{RqzH?80Vk@z!}Q9v4j(tWe?9M;&9;`|?AA-zncsv0-{MnZQt){kgESyaX-aPU z#q*oh!`t=98|`N#9`Hqm53w1(@qk$IJ4sj6@`c5FYM>YtuqD3%SD%D5j>S@XKHR(qZ!*gHHuP;1qx_ghdJ%`vq66 zh3tL}_l;%?qZ3p3$LB8M$w`fxCEp1b&fqvFuwM!gnw68b5J0kwOF+ zFTW5I1OLa(?qBcwYqOI$T0MGFCjB|Nd3{@h1_xw5gFi8@ME4!K zWz}QV$Bv7}fA;y~9CFyGdeKuX`+Y!U_pydSciNM1fe`suT3%jO(a}oE=ko~#_1M99 z{V*UpkBR8G#q#nps#Q?E&U@T(hP3T#qIq&%uaN-*Laoun3l}Hxx8jqx--XQ`<4zD3R~GQhg`eT6;yh) z(A(P^C-Y;K4?p~{^TAVf7_C-I8KcME-d>c;P^HqUGA!#n;(^aRfxnu2Lbcw&^B1n- zADJ#U z4h}Jq0+o0{;`w0rheVrXf2V+e;jSM1#myu5qy2}lv9CWSX0n@_H0GCP@zmI(cxvUF zn9g5Lga$TBT=p?ddgVB&Z4f8sv?9#wDV(kz#d39N9n9bCo`WWhbCVZvwsi^3T$pUP z`R2Ek=3SyExNXq`PYem`%AUt`noTUP08Tc&0IQ4F%_pQ%wvfOLrh}yGt^kv~p90XM zy3kkZL7>zdK7Q-*{?&%4H#UkxLqpE9HASo3vuBUmx^=7CxN)PkEm5o0kdXZwllFXM zJ-c7+o=~YZ@a))CeD&B>yu1K3D9?^WBEhtn_;@@jDz5$$D-)2r6`|7VRgUV=zoh3J z&$IOL9{rMSS`v%s7psr0wv+c0F0$kLOkT3n2!aFiXN+T$LS7SY>gvW{-FhcJbn6HP zdU~Ohixmp(-;Zp4a##c^5 z>u{aS-|U{>&o0j4*vffSRo!NyF}_L$z~?u6X4&W{kymcHNgNV_xgzl#Htrxrupx1c z9V|&fpV!R;%)#?+NxKR_Iq1S*S04futc&qm*Z0?_g&{$adDBly1F=xN(HU8)A3g)17!dZR%&(p_vs0gati7 zkV8I-A8#Me0tB^ShJ$1yswF@w#u#Njp93c2Ws(sH)0SfwVQ5BFw_^L3iaZ1_4LZ2e zm2LUzv4jm}zavB$^B%;sIE>Kdp>UvQ0ADz852}p@o;dpomMRtRQDY*FYqMAIc<@c+ zb{FvO(x)*PZbDA0*wwmXG+vXv2s3?i$bs<^9F?u<8pdmRl$>Mv- zWUsCqbYZA8fLxHv=ClWtT3Y}rR>HcgR4QZ)CXH+8EnBvDOIiZM!w)|k8$GsKEj2wo zt@``>ji*P816+?BLu>Uxoxv(VSgzJ^0h*szNYG zFB4{wCl&VxA%qDn>WB##Je)3#ILY@_DKjl4RHIK204JKV4#ieb5K%js7A1Z^Wxopn zIYk)h-GDFLelM!c2A)2D8kKs@E3FV|T%H=ok>Fb>?JnaF@}I;2Z2(Bcwqu+Sn`4tc zqj&q;nNLAj(M!0}IEPxZc3n7{!RrS^gp0G6Fmclq_69qUvkb%G&NE1+EEfPgj}&@E zon}7A47<}TVIi}*=0Rj}Ag-Pg8o-4ODIZuzyKQ_`3Mi=}HWmj_$QPjMX)A%ZFK9sr zwbmU@Oc1v!bOwL>_U&rdu3dQOp@-<9haRHTEeWL*9)9>?pncSW0AS#CA})buQ^DI z55eT`GfDk-MjXp zR4827; zu&XOT5a(v4;?Xm;2%87X=t?krv#&|4h?#4Ot-jHL2${V64V;g1vGkCK2 zZIrfk<6!V%^y=QW^FO8`Ci~5u*HLV-ND2r^W3D-ax%!lECdBP$_iyYyK&UoqIA6Jp zTB(jMRZ3zmm;#b{#}&vLBk)cXiT^U#0zvwfla%qRq=rl!<^0|&6Muz-K~hksDVj~{P)ZDjO2V1)nx z`}glxM~@y=KF3X^QYp&aL3~N+E3tV)+5M}&*F?BFH;?ZhJBJ@#Sj1#A2U6z9WspRg zH1`%2k}Ky9OrNh7`181K&$v^{pEFk^^G=&U5>5EIZsn#~^@#eUduje*<8LB_1z88d z^%_ZpZk59aHtoXaZo3z^ZrR>e3#N=;D{SJ-l~Fu#?Hf29JcUY7N6X~XMzz4`HYG!3 z4FfZ3*U(td(^#%8fQZ)Be9i9V_=mW>bPW~M-RWxaTO%E&ArVsMvxKy=9jcUC1m)2z zNaoKct8ANC8ONB|#wGqP0TjAXLOv20*2DO%r+Y74hYf)7<{Sh;?64644j(@3)b3P! z>eMMJ7K;QomIP|Gno5eLOEE#G-mbel_>0)N`Mq`9#SNX^DN;M;~bf;}|qwIc=AY7z8Wj*E7esfhWufuVXE&A*%;mH0* zq@Xm=r}FslmOc3F!Fw^hX$zDL2*bKxZ`5$&$_qF$`E{JlKaFaxj+O#Kc5(vj6Pi%j zCQX~yh^`?*EMgMXX2oeQyI)`Tnlz@DXR(s6MXo)?gpL(~(K%kju;b|&l`-{8?jiAp zKek+0SBK?(uye9z) zgpK(UKC$f<{N?TMz>bZZ68bK#Z66yIj9&UJ9>4Y#jOCw2O*L)11)zU&j$nW>Lj5IR)Z=qq76-G-vhwZDQm-DZhhf%y!CO1O-L`V=(j4Byr{Xb>v(DlXTj z5h{%UdE2p?62d_|o?;Hmqm+(OWXkbrzBR|wali&=EQxtpuzYr4%hLE}~d00ss#_g~Nvr!)x@&!PqcNO-;o)?YP;UZ5X^D zc~18Cn*I@hTBC^Uyx7F`px^NCn)!y7AYR9^_LWJ<&QFp6)1uKo^_L1jxFekIW4u1fe zVH17RT?;Q9}MzXWZ=UO5=`1f2MdQ}WJ#XKfQiixAsnl;f+U`^d+#zwbXHLZ#lo@6KPs|9Rm&o||u>fgB$ldzz548KX-1ZOWQkizy4C!FNWR@0$ub z=5CR&Jx#AcmFd6O;J36B>^C9V#|5(#glEgedsX5)rJb@sLfuR`t&k&NU)Kiw?f!f5 zz|FUzw_I*-*?GoKYmM2(Y5eNqkMUgNN0={OMk^qM#Ec->=?U;HY9iFBf_kea_ARo% z_4*fTjoFoXG*wFwf5uq(Tvc#=9FY9&If~3P`8)#3Br^C#Ng1E9u$=o=MJgqaNfULY z^(BI~h9PIynf;}HuQj@eR_)3w56#y(QE;kJl+U4X=N{bEn?q5BNT?25QFES8QsKn?5>PUTJYbb#KV-fb z81b@J9PBxsXJkJ!6gTfts zoAAZk--+dV4bNOWgG#;bb$+HvV`}aio+|wi<=uU_r|>BZVhak$3K}X*1O#p)VBx62pH&<$ahz0Q|H?uWW|I)(u#e}HU55A5p#$j* z%t=>BaGpdPd@D3c50paA#FEJ7_N#!-A8&koJVi;+2Co+;;pxc$lV|*UBOTpYcY2n= zYYGHlrB=g}r!Jrr1o&Tf?8fcAITTFH28*Mxl`~%*b0#SR)mV+C`9F|MRoX*%@>t9? zT~l;qU6_q++qP}nHam95w(X8>b=Fq^In$cu~RV_tzZ%g^}5>u0W~acM-l`Qh)<>rL)4EDrC2w z!NO)u>MjBvl!jFr|Md&MXdP6HG*)j(7| zjK&$!uI#Ztkp@|oisXn6PrGZp+B@uS?s6jsyP(?-pFF$aJstOUJV+TW(Npta&{MJR zhfkc2Fu%akzt9FrTreH#WrlH73U@$6H{Aakfwl}{iH${VE5KDjrFpA4=9LUc%~Q7J zU9(3eyG!24r8PldBHQfyyUa(~u^ppY9YAu`D~pPXLI!uOPSg{cXimt1ssLN1;Z$j0 zZaZN6FAwU7eXm&|e+(6-72n=ELW& zMU#@>NC-b<7HFiId5FKJAR( zNJ>zF1ywg_&2Tz{8(CrReD_qBNxP2@LE~k(5JgzVJJgJ{f%a8Q)qOQ4%?_`tq zu1W2^*ME9}d2L$jAzE?KZb?fR$I{4GyQ$J`cLMj@bT+x;_t|TAEMB2!1aG=0O2+&o zIlo;LT?l6CYZj}n5ZvQQU}y^F)GO{+Gy0tY_okOuSL6}_I10fudX!5nrLs^pG6+sB z6t7&}XsG4DWuj!k4RG6OV^F8=D__9wnyv-g{%th}BUX2T%0LhT+9gEKj7*jeCPX!Z z$iR5~0K>G4OtF+Fm0FO2P1%HYD3!eHg>|iOQ;5&&=e*?j^>XuekiocxS_-fZ0>i6= zQZnR?7;6YXJcCy*Nw%X96MuXu0)hCEh<)*5x#s>e-d>BtZ?q=`-&x=qWYJrXEN@uM zPWm2p+CV3&0W1;Leu}vc(aciI7d66;bpn-@`u7!G<0f1$VzL+raDNi{BMY{_#A3hO zoeg5*<;CNHcr%)EAKHwg*nB=y-*BZF`G?T+@Pys#rytf5Vvt!my`hL3l)^P~$ohD< zNp+yqw#;#S&C86(NdxxjI0dyqaWA0VUiya$Z69Tkc?D^%ckMbis-{lE(UbZDlI2dr zBVc`1|GqQX)AVc}t4p8{O~pyW-z>#{dJJi-|UGqaKPN(VbF4}LpoTso%NgpS?L>jU{7c~>tU z2}q>|9Rvt4Pq?X=1d(BFK2hK?imeyB-k?+LKV6K1>2G((y#T)+x@3faz(UT0$7_OK zmuHIazl&g4gZ)M;`oj_`a4B)=zB0%3#3yRF1=NzpQTDJY_-K1FColJdYWiTR5j%Q= zu+e_`>A9HpF~j`QzzE{`7QW5E7!0mcIl%GjUqDT=r}^i6xrQGpSamC$(Juhvx837Z z)-@j}VP4a|1^?Rah2hj9d8j*B@Fb~70;?HUd)@m?Jw;^JQ40ITwmpF~%9-=T(uHZV4n9iIc zvS58?h=t@~N-B$d>=rE}qJMB1Nl8>1&SJ2EyICEs#TD01=4>83PW2%6Ku@OC5cGqv zV<0sbGJ*#R9*lgtq=4sxtUwdMUBR=!?$cT&8du+hz`X}bJ`o|{Utyuj^jUJVv)p9k zLbHVpv|Vu1jhv{l?3~GhpW$*iml1xH0`L z7_zFDt%GJ0fRoD@4OEA@KcA~w(wQWl`_QUVvD6A%hm+14WDjZ^3xpdhHWU^^s(WVQ z?Uv$nBg~FjOtkqn!ldsdCqHFQp6d!4n49q?ldU?&pd4D0S>SD4^j^$_LptURv{UN{ zr-QX&{&~n2jJ%Kj`(`5UWGr1|>SBqcYz&~yH~7H%A%_kFjz|cPn5R^0(YPx@8}3>J z4|$ABe#$z7n-mpkrgaC!99KAAQLUkZa}WX#DKeN_#sc;`96ohT!ycAI&2Bsl>`E|9 zCE1IpxuDt8UU+pP`2c}{MW1U8{={|T4>3OeRn}g#*2dZzc4Rx&7@boT8tMXKj|@~F zHA&$vkd~WD1xz-%0bYJWYKq6zIzYiVfDOk;C?QtOru9eRxeV@4TPJ)%e!xroeDZLcChQMZYyA9W*C?8Ab?fLt@Z9JsY_$0lyOQh#*$s)a+< z!7jn816D?ek33(9O?tf$`LG?7&)e4b-C)uOK0--U&KchdgL1nt&f?PS;-_=r{Sxx{ zc-_sOvfu|Fu<-3c#X_EUP}U|M^#@(k_M7AP-T4%0-zvabCfg|Zg4Jx@+oAH!L|oCx zV8HP3@zs4_uT|ycOjyT>eO-mY8>Lu;ycJLKl zhm!BuWBw~93)Ni`HUu3ACj;Mra5C5v*l_72?WE0XxKzklKWj9|Jo=3}*A@^~c8D>U zE2Yj|By05%&JBAULcrzWB$DiE#yN}Ico&AI|BN3WlqRpZn;;!jCMDK6*bxdot=y>{ zs^DS7;OLToQ| z;RXsn3T?Oh3QvxxT~e>;9W5?P65#$rn#Cv(X%&d1!c*mD%hd<|vSRf?iaX%rS3!9i zC?3qaw8Jgn`Qd%^D4yqGop_Al>|=skkaFw9I@WY;oGs^(%_s9V^;CPJ;w6%%R7^i1 z!bwodK?osW$}lu*G}*e1?dszGm9^ps>XBQ8s5qY=Uo2#}dPUjo)y|n1f`F#$5h@oD z4rwdL9ju!XBKF>pSVDJ##XNb1K^pJ!$f5|Kg-y|A7R$NsN=C1v3z?RLf|z+WhGLPG zeS7_S@+=u9TR6*+4$wzD=5$uRvO3yE;#LiHm zIcB%_MGp!QBh4I(5EBMtI@VLzEUAl4g>5s8>waW}p6kx^%AmVvM=Wq&Bk&v_8(}oJ z`rQiGy`y8zf>hz>Phzd&TFV9wziC=qA_9NV@QQxW7n{C7jSa|@Sq_ZP*5D}IkJ{pU1moz!>&fnzMWUEWfh0-mb zfg(B{dSCx-Xiek;qDXjnKCHWpkLZ+YigS1#ZIz5HH?IAm>Y(}MKV`Bbs$CR@D9W6M zH2ex~A3-_F)jn}d_)bB|$v zOy>nJQHAmPV?FhNBFm6>?I+`n9by>Sz?@4ng_+rGmKp<_Pi-=+N?_Bfm5L_`c1w&i zy0`NHO0en84)?CHK_ovV5148CH`$F8$ zFLUe`cGdbb;v`dQz{N9c>cVUDk*1l*pcMlj%o7zBF?iVAsJusWshDc8v2_&N$2WML zpb=1);ubBw_R@Y5MFhM_P1K*)qwmy2MfTqmTU-cM0jf_GK_tRD%Pha1k9qyhwk-{+ z?W`wsWOY~nW?b%U>Y>n$djZ1VB+T5i{HpYE?Q=wACr`Q_^(WFgS%#DZOS8}KF;h8) zIr`6f)?&*jzP6neTI3zB%9zvu{SiBWuW?@&lTXLv?RhuWS`96hcAikF=H5S_dkDME zDsn}AHOQfLuKFfPUB*OZ`1@O{WN$)DR=Lp=lYUOQLKeLyNUs*Cwjp}L4A6`8(oC}t6+yv1tL-qLeXndH z$z2tq_kR7skD}qGe62s>fl1!I?GZW!pP(2jl{k42itjYI7vD|%>CxdKxq9aM8qKcL zkOU8Af3+7Uboqj!NczR+wk{o5rZqS%eloC!R46b$?V=>ApteA3{0_jqqnncdEil&i zddJ7Pu$bN7s712alsg|x-R>@K4^3Jy_n$zJ$nReCZZ@dd;$Res3I`Ik%ChuhmlvY?jEr?ucJ=m{c64B9R)TYU*aHBkR30kBq<{GZ zv}SG-3dORFwUn~uUL8Zt5|095`y!RPyS+Jm-y8ZqfDU;ha*~&6Z}#f(pp} z{SY$0SSUHm{SgLLy@Z~^wSCP&9ju;RoU-!K7IQ&=pi%ySeXJdxr3x)9?H^5fb=t23 zdS%tv23K;iM-*+OYu#VOP-po%Mhnt4p*1i9S}%St6fKM>ukb>O;5FK)jifY(|26|a z3Ix4`+Z<&Q`I84epvy40o?nkd<{Z;1P1O8xZ>;1FVVdYSY+MNa%4WqEeQ|m$*0J)Z zeBKf5_E66S^|<86t=zp@9OXb6TN))aTLu+|oDESnpohgWrs}uYL$e99hLEIOk}e|$ zf+nnI&0WtgFU5S**c0`g+<|cRDODYC+LQ_yY2{_GWxwg@37Okht!9QaWQ$X)Ph+5F zZj6?_zEE=HcOD$-)(mk79v9SP%5x6xS8H{>w;`c$!G@vjQ~m`-j(Dg|mLaija6Ve$ zu@fyUbdO|zjXxe1!A%PhJXo*D->B^%y36ALwr-Gm>DzJPsx3lSUn)}1^DU!X=?v65 z)PdC~lpSD(m4_Tq-^s^iN|BlTjj{Zc5FsPus0t51g%jJE#8_VgeYj`mJ3#-86Em^4 zrtzp~tR{xK6W`+exm}L6MBfBG1+%UX`>PJ6g2{MnN60&DS2?OfzsF zt&Bt7nzD_6fwO!WK_vIr86GbtR^; zQ!>C_#LjEPDpi90+TOH+Pe*5WPiLx3^kR zgZhbyiAVXqw?&-L1#Bh+JUAERuA~#`!w76mcXeM^gnk zK@^fqW~bJk;!j#JC3Htxg#BjjKJdE@fBeaj`sKAL6aT@8V9{+sXOJFIX7k$K^J+p4 z7&hXDAs9#jvhG^={3Xmqc=K9C45%0-1ehZC#x^#Sqp-{Q`n$gvDl6{OE14)i1}f@_ zhq>Lsa?q-PuDQ_AP>K*mA5x+1x->AtZYvPn-OVy0Gy3C=R zC@WVl0Xy%k&uKB|LSFc{*YqV8N(?%95hSE+4{{N8`Nsj38oIV-(;LSJbP7#iXMBwG$I(c#mH-n1#*vQEGeOT$ipfX5 zvOnvS)dHKGMJ_C2K^Nk2+GkMqo+HN zS~0i3Wi@+b-x`cX!!}Kx^FCPzGxBOummXGSz>rWXT1HEsXy#H)DLA9M2{llujwPJm zj`a$YTR7PrqVmXb)fL4d?SJ)o18b@9AO8uC?=)ac`5m?6E~2Khvh z8NDY9S;0=<#%*-a`w8aP^)Rj9+cpl>AJ zU^@7-$@i#j9RK(ui+Q8RpBMtvaj%oO{nVof=d@TRfr7)9Hu#s!v@vW#&^3BvIBA3S zCuQ8P9VrR4w+WP$D}GYQhk#z6+Ba)sJs8%NU(#i&v2ky!b6!9v0Fue!1IlN&hop*} zYG7dCwdaJF&vS6enBR5N7zPno} zu3?Jr#4|-7jzL|TyK+*!Vq@vY9Rnw=#5zveL&esu1iAfz{(*W{Ru>duB&Lz^)7g#R z-ricGrxWk85aEIX?6XCT&fNG@?omuu7sM7l-5sZ$YcQ!IR32VRozl9R$Cj<)`85!w#)T>(!K6EFG=&rdEC7Zf6p6OY|%e1n3*fAe_ zI4`5mvawO=kBT4p;$v}nTKC*$i)TkKu1qwU_D=r+m>kY7pZrrA^496Pw}yrVaH1`& zgxDYqsY>x=-y18nvn-$i1;sG4>xKSjezpU6{`NGV>X&-u-2=R*?6iv`?fv#=-c{XA z%-6!kcRWZSsI7z~fG$lgViehQe|$X6t{{x{j_uV6lp-hNBqi#C5{k4G$Kr$e;(CLt zJjY{dP$=H5j=gK?9eqRW=|h5!@v8!g%c~5S^uyzcBa{OkQ=k8XIww8(MAFjItXy1B zAnU-eQ=sGuB>JcvKa2zH*G?bq-H?j8*$=2a-dDH)zYDq_IY5WV5`M-W3LZ1f!`8NM z6>d!`yIs{H_6yA}@!DFJT~wy2|3OGN+TRwVxhEo_UqutP>Zqprz1YY% zf1m?B_666M`$)a-+*yowZ{KY`n{K=DJLI=(5IY;8h>C9St@A$$VQF;HrQTW_8wgf_s1B~OSkCN zg+yVXRt*e@asnNZ@YqZ!^B#zdq$@2xce_12K&$-e*%>DP>|vg$9j{vUJ4oP_C_RG9 z>!qe2In2B^&0)zFSBY@`qyeQZOtJF^nKn@jDhiTTsm!_ytwL_J(h_}qr}(p^k}16+ z?BHk=kKYzbF`K;Q^e01!$D`|H@8b$~hhDp(v`Bxw7_m_E6LRCC?fyb)-@x{x*y-S3 z#0U|{^)3hQ-L3-^sG(brVqAVJ`nVawr|n4eeRa}7!l6P$@iS^Cz%cim-;2*l7*a^+ zN`B|sD=Zaty_^NgL{Haas#@uh<4i#D9+)KfJLpQnfamBA3p@CCj0L#w$cOmX)A zYXQdYkB<>DqSs#`$h~qqDA379I^f!lYts}#IzO%Uc-+%hFdQ;86uv5@ruR0@8-K3F1-B@3E}4(naTjZkn(P? zc6jfu(01Pu(YDccZ1-$*)g`~$xc0li3by#LRsEAMu@8o>6^_^7SFVZPn39zJ=Z>}p#*CDdl&t@@gqM<*PPeyM(Ls}=HIrsi zhxoNZXj=;{%h2`xO|k6*B-@z`hSz{u;R_>_9E5KRU}l384RJohdJv-`vSnUM&j$&S zo%#;VeLRAb)SAN)vix@>5Ck;(g5%kLwzUp;lzV?hyDoy4SNyX#?gR->u4e?~P!ngn!26B7`i+m)8z!&U!|3 zn%t~$o*b3KvEb+NDr zJNEcdjrd>C0FaL90DkDJGlA+R8OaCU^l#&(&bw~e4luLPd`^qC;Oh(lJ!Lo^YL97M ztE$3<{!&+bNWZ6~V%DoFmQ{P}Rcb3feb^m*)2d3!s>1=>yXW#GAPR>cLt5<({rfYA zgN|ueLTfs;2a=)=mSEEkLv@2Ut4&U$^lE{qg;_i$iT0zdh&rx{@%q-uYyL#nK3v*t;yY|Dk&Dsc8QtlK zeUy1bL&egQ@AxecUhXKRSfA)(7`V35e@FDks9_8)7|5S$R%xU~lcqyyF#^*95=u0( zk1*wE+2~@g&Wo@Yb;LaWt#&}8W>jke+o?EuJw7;;)~;Ye`}?X_UFlfmWa2K++PO_a zB4*n?a=k8Yv$t?H#gdsVp7x`(2jcB+62FS0`etIz3zg!w(rw;;vR|r%%@L z+0Lj-E8bzr3x9p^_FmlglE*59&ZwY(2(zhTOsXVV&$N2s=>N**70e1)>u%Be)?>71A^50EoxSE} zz!pG(`!n);>i4cfNY<1XtEuMqD+6iBKdu)xP7c%$)qd#+$02d(-N=J@{p7imZb2Xj z$oT}G-SfghiQBJ2-F<#AWj;lWBsuS8OK|cBmRG>Y}6E` z3ni2+IC~4p#1T9dRgGFT*?Udjw6QAL!4QggOR?~PMD2v5F7q>%1>4{d0&=_%`mt19 zU5TLxq}yC`Q;1@r?+)-ID$(iV3k1r5P$zyb9B;gFKL}st9CWpS6!G_ZKh3c=TLM3d zAP%l7HlfxdBfpP+-zEoVc2`j>&%-xRI5@*HrtYVVu7^OUPY^Ec4>ZsLz0RQ$#48qQ zM(NHxs$bG(`;Q@T2BPUY|8g&B%WSFMheP7+^{hwwmvqY}9cs$2c+_#n#DKdI--}+5 zB9_MBm}z)83qSmi3eioLQd=C4n@va%90CH4MHqK?cik!B;{FR+C|nScN+6psb0A$Z zc3<)kn}q<2!SW)=8iC8M!X$IQA~P&fcDWc*DOL~>(lCCoA$>X==NAHPbx!-VLtQ#t zBZAu^#{w-M6x5?xG~F|&92%83kf*D=MRsGLuZc{w`GEAb@%`D<83-Pd_OyY!&2#+U zk?arr=AX;*&)CldKcdt7uY8d%v(3IYni4xpk;?fp3y64s76FL91brv&mhJCgX}cM+Wo9x zPmTBE*ZyIRn5~T3p}N;x+Yr@x!ahkl7m;$-a$DuD?)jK8!d|5EZ67i4yk$c?u!9MP zYqUK2;dfatJlN$1t!j_8#l^F2Gy)Sh`<%YXH7B>twEs;(EPDDR1xIf)mVj#pNWez_ z`h~W;ro*BH{$p&QWP=V;Elif-@bM8tukJ@AADa%lN+~0W4l1cv#>R%OvvQ)4OuSYn zFlk7~aNw0Es)lV7Hv11v=uaS%$YhW+%$?X1R$$l_;a&Xt3W4lD6`j;9NE%1vpG8wdFQ~CnqE}iTXqO_5o zJ8BN855Hjj9}&XqbKSeM7Su&yAkn;A6sbBG30D{JpJ%M1&+d2&PE4!-Q=OHSR zA0C}o*kK0}sdKpvB_JdCFrrTk7}l}=Yxt)F6PMTY z{tBqBShar|r7OJR=s9rC3}2m~_U@}g{b!NhOYV~SEg(3GW+7$Ic8)O97`~)kzfaHH z7geCFWG)L{3MOSeU0_DGcpdF0b*i911RY?y6{AUq9|$&BXq^(#}QO8 zN5UeHc2qbw|GqT5miWYq~#JKvkDAES{`vDPmV&uqz~`$P}oNoCi>Tx2`isHRlq80 z-_+|12OtBC_vuz%wRDTU-gMg$>fvBSG@?|gKCQq0+%)^Oydzm5_ z8W5}EYkvPNB8=vs+UYeYx%Mu1o0gw@ncNt0>2ekngk1^^M5K1~d?yO`? zh}%5s(S53so^YkkrUJL9F)BPdyAjOS-YCQyp2Qzr?21D#VpTeW{I7eVeS-J2aU5^O z>*JKtG@zbf_f1?C`iD1^V8v$Y7L|sH#br6Q<)3X*Vsnp_g+|*C=j4GJ6+n?v64WR^y%~`1Qh!2 zrk9_dj!uwTO!W#~(E4f-;TH$`H(Q5NB{!be_m{Wd&9O^&V@K4V*3CCq#70~Tyb=$M z;$8=k5j1`qI-Vh=8ubmB^PP%U?VMw5RLDF}4Ud2t;ab5d6^)MHZ46J6)Ep|MAmlsz z_apj3amYK5{{ekc;B7FcD64TlA@@!K^Y*)y7xin2!5n)aJcgu0ng=f`;52gCKsQx% z<4JoK^6(}mRodppGrzD_pveJT9kU?tx035pnit{Br4>L+oUnqnA5R#t2*Ie!W~|z@)CNt!@9DRTab5q59vWeN5ZT|p7{n_TVu9OGQh7Sziyg}2#hLA72LtLVij@0+G*(Gi|O z63*Gm8~Zz8Px@iO|IM_KnqRO9591M%VA~C(K=|3pi}+T=lM*>>*pKOcrS10_uxEz` zx}bkD_tKa5qX-kzJwkAuzK3C!RyT2`Tb6@(P-63tWGVX z)fQ?WG|C=FcA4D5@^YG(#ZVGdLVtfeA(!JekPQYd=OUMZh@ulvoS|2cU`1**2UYA9 z53Nho4|1(B^D*e8+G0Zc-krUvI7^oLFobV+xn)La_Au=YB-#T$I9(KlLhgl$MV@}A zTlql_G8q}%4h<0)g|Lu_+p62a%-dh4en0p4o0^rObAe1^)O9kS&$nYG^!)uwXka^!G8gD z>FJmiCO>+90i$im1`j9M0$dJxdILTnW>@iH2&Jgosl0p)QY&%dc%S@Nk?<`K|f#o%oC^7neJRXjA^ezNG$f*ZIwR-J5!c$e`1UTJUTdqey+Pqi`iltw>A zm)$eHI`OypI<#3PJsl1)zg-lD08vF6y@DRw#pVQ0&$LEenytgsnOdb31*Etz6(}fb zIyBK-o0m=?7yw@X0*44IJ3G0)c}YPP1G|@dVKhruOISgkK!Q`gV04odI3J8bF?cD% zi7C5`6(?oZ54>S|4!5~>6h4R`ws7!;#16FtqhM#wnFQC#CA`z!RH0Zuf$_ilF}n;DhoMAQTtq(SGTFgOzd{)wC(9!Wb(a1o^yz&OIr(vFHS! zUyWe7gf%w$`9!w-m-lcqS`Gf;dbQi~Tz3N_0jA8s>Y$ciz+L3SMzZj*qJ9L>3by^` zn-io4_qXRSV4m=9?4R$L)x*JH&pG!m$Qg2Ry-@7<3g>=HqWc3+KlC#D0&fqtLyzwL zbUO7g$92GHjg0corP4VVv%t~*A#w_vGM7%?Q0)xnLcNCa9u=qt(0f$6%&C|tGkwWU z$_3Vp;e(;b;B%dm-5y^>(2-DOT}0!#`mo&d4bCnpZD1(V?98F`nDOWvbN-k{%|(4V z;!g~EpocM}S2Ygsz~mBmKEg~Z99_eWrYb__UEO2&Nm~^uT5uC`Ja#<;9)q_# zvtCsdusaXR$d)UE)#t;d$q}kx(N`Y()zR63fq0^TEik{irVXX~R#x#l|ti<79NJHRbCo*hw%G1~IlEhvu zTemOWf?SeVA*{XzvyjkFWREni!$|+W(d4H&Gh5R(#pQ?1xzHC^#1Ig}GBij0Ud#fa zdsV;Ex4iY;?PZV2(uvlu%)Ld~q$86>!6(IucM1q8r{fhRBdHM!w^OQ(9g+;?ht8^0 zp?g;~B~mS?!s}ia1FlY(tRhGPL!tPM6Yuta8}2VxzXs-d($z44=awg&jZ~s{_B`-# zS+V83h4RGB*2v#=9t)_x{$;q-z({!bbxhIg{U!PHEEWJ*H9SXtRLP*rXO)D9*0Gdo zj7pZ{NeCt#q+K5^d*kVogXv6!rFSb4c=27N0DXBCrIbU@9@{rz2&$wgK`1`yrhB8J znY|vnTR26A3lq{D_80tYe99ob-eZZAo)Zjb*JdhIYoIEMTpRfEW~`T^1&$_r-0d*r z?N_F+iC5(P`t5+{wJvneIfyy#liUnswX{>~3=1uxaUoL)k7WQ`)Z$@DN6mtzR=eAw z=mY)&bbclfWa#{QaoD7GzJ7D=0>;qIYE$1o9?CA`adzEY|M__N(_ij=;)?s?Lnu)S zeB*()PCzxc>@7!$bX5ut5z*-Uyvo_?ci`(T$9T#S5BitDo@T@BZGEp32Odc{mDg2& z5+0XAng<2@bP66L?=Mv8UpuWkfp%>_KKmB_t=R|EX4|)pF31!|pwUKSd!-h_k%%0U z&DKMGfc*JWbJcsb(q$ZRmzbG6H^ly^$vLmV-T$+Y&*;bK0V*!;cX(vv7!r*UxT?7o z){i3Q>o7ut?Eft!fXmm@7sK3U{~|99h5S^&XP`pB)C}(3;2(}0SFx-AXeU5P|1{7| z02hNGo(=Gs2|d#gpD<=HZsQ$}dPW9CKyz2tdrLJ<6C0e^<`L@qhYsiydiMU>f+ik~ z_LpW+Avi~(^OXJP-9?H@S}^ zZ{b;#9xji`-~OZC!79IJk<>#53CTe#PCNy1G9vcsN5*JUIWSK*U z9oMU&n%|(oqLsh!jH(O<;#)TqjJkJJCO3PJN1No)q67qIXJ%N3Q^IE1S6L)H;J$$A zZTBUKLNON?7wbPvfoxq)P7c4x=nxUmpDdc>FgIy!we0A5zZri8$T5QzN5;C>H}_>V zX@zR)e?e&5^z7S-E-bM%9~>?`6=)%^_($(PsSfUfH(^DwvgI>+mOVk`p#TGVQmUvB z47pxp!AE|W#Dg$>Y9166yfZ)&(DfD2eYZOVi1)u6dn*U#i(4_7*ZoQGsCc^Fa#R!% z${ZWtXHg;+h~De@*Zy!JNIW+23YvB)sS>Ht^^O!BL$g5X;Fm0oaN9xxwT)EDrZ}wL z$7s!h;!i#U6_I-J5~sOFd281jfSHb3`H4rej*xvQUZ>EX9UELczux6|SC#nQ5EtCzd`i-VT9W{}3%^dN%* z?A8ree&7{cgd8P;@V$$lwHE^9o(OJ5vzQ93hMXUTe^?g=%(3hl`snr+n9Y(6_iS#4 zRxs|K$pxWEc+x!>d^XKZrBia|GZuQ*a89{$VB5n zqRh|UDz=A zg$(^d__~AJ*-6tS|MnF0`4J3Uy_SsB?>qfnjCaty#x6bu6vG*UxyXo@q#8LZ;89D$E{rX6Tc6l9dI1256CU0d!f$B*mc7VCj+diev@VK7dwY4H3y}qb1BBB2Tfmi%> zohsKcwj-Y}UmVt>E<~M4V)hBHn{ht(M>)3k5CC->tcBt?@exA_4P{Qb-474^2idrt z)SnaIO{yfZ{;1ge@W zYDXPTfnX;uP+ph4&AmmF$OyknK@lm_8#;0_=r<{f`scS7>HLQU!mO!a=8Su9wlY_g zH^#~VY8eM_Yz5rjEL)svUTnaqxg+sd(Dmw^jSSlQ;ebaEG&vfA_7S(Ha=uxw!+k#9 z^lD<%a4`BQesdQGp)d;hB;ly{FZBJzL*ik2UHkpwA$~`P58)F2(|V<2@rJzzBE_9b zAl)%M4iUlN_s*yD9st(Q;@{_ejxX_W4^PN~6z+0D5E%YShN`s$|EBNni`xElBVk-a z*=j`l8|9(;RT1GtW*tG4!oiEsU4)cj=kTs;E52gRSIdP+cY(xxS1&i6s~tNReC=v= zz{n)Uue#GbVyE4@qNVPwZr?fm)Yn*GHG^@mD$W%<5>iB{A&jfX zp&92G$J5uAL4qNRMTEMaB>i59FHU{v)5YUh)Ihj5YGM+DNvr(f^c3O88g`?Ru5{0W zNY@h77&X>mTO!TflbL9nWsx6$KHFQ1qvqv`dm_(Kb!+AP5XOBB(sb zWHIpt62)W+NQy-cZBkWp(i&PR-+RnnuTbuKFMU{7sM}65)|H{k$(K783((fRjohOAp=o(I!!C>S( z1EtLs;`tiMIjnR{zEnK{=Zhy`zdAK9Zi10q)aPdgIJ5U^mU^!0$lP-4(ZK?Ef(0Ro zcbW%@SPC!L?9WWCbqO#A5m4UiF`8G%5NP&@SoFeBhbK@Nl%BZ1+%I}PLIb5w zd3@Q)^hs6SaBxhcP;B_@yVQ3?2nN?Z;xE?|xbenQW^7%QgX6Js3(x!c_HHw;&qQb< z_TBN@=uz+0ig>We+m-~)jxGp=)RDvL;cJtk4R4}3hRx@5I6`z2q!n2facHGR+XfgO zNtX^M_;Fqmolon4bAMivczC_h47k+p!|RHw)u4NovCG)$A+|IjE!k2W#bKyzIJ9f% z4H7`@b$$dTDD`u?;i00Om$gGHwVxMLL#nhnV;dJ0f&?v{+10IBnOk8{FMqP(){&l{ zLIN}3sdi0|#PC337SlhRwhph}%nnX1i6?=YEDv+#2?8I$5mFI~_)vjP@8PVC(APPD z%b3B+*u2WJt2O!Ih8l}M1$>7KS1XHlY=$JdYDL0=D(ym(rb;yEOgjX^cF4P2yxv5C zkswjvWrFMRsBsS@qc$jAtRV-DVQLjY2At=xPJ0N7U?S2W@+&@Z&US65$Cj-4`1Pn+aX@I`@&Q<^O_ye?FAG_@;Dm;vY1P(ajlERIGJ!@)6wKsABMQV}5% z7ljQS0FipMjKhdfMS@ZlLw!$5f)6ePSHbzoiB&bEJPA(wcCxCrIKi=>wuL*vS-B#@ zq;dyY-9Xh?dALHoo%fbo{-@Dp<7DMc34Kc@9cy3=yy|s92)~jZxqR!%%l6&UewmBy z-8m=PRD|k27vlt&SnJc108ISDm;0|+`xKZ$%*3f`rf>O0QeYL!LslZqgca*_HS=RL zBF+&zdw&08k?cF*5fb494iM@;#)@{lQ+DPBg0wBl)U-=Xa}l(A=LMoM8u=H>QJRrn z@G^Q#3XUu}*iC|q67f(6c^G9h3azp6Oo6w`GRf{nPZJ2h=oTTJt>QLK)0z_;0^xeJ{pSU{$C5=jo?gFg3~V)H;6KH3`%ubk0Y`A?2?Rt0wVzmh9p8LHh;kf z0#;%bYr=_MyD7}Nbuv6hG8IwD@`?+4il{P&lGmp9uhdvVF!?+G}Qd48TJG0m|5eN5)pu{>u5 zzPWjgq4aLefG&CFgNb-ajqHJF-OkrrnsSkceM)G9j-8yB!l--{7Uvr!=k)vY(4$rk3Nfhfhh!t z_Pybi41J|8l6yTXEc94rld?7>CGCF}E#{XY=H_wdO#B6<$Uv`k@CiqW=oida5GgEx?s3ydrRb5f= z9o;Ja4x76~=Yld=2#+aO|FgFV>TjKJ64x*dk`|)2>waWg3*77XM>7^uh%|5}3!`AW z);rFiJRBTnM+i}r20EP-A-w$s z!%+)=Ieq+yydX$Lf+|XOMscY=1lv}9uZK;|uagt(`^8l{y?H&zaGe*I6;|4!Tl@*a zmli9QxRt-9VX+h^_=Bh%`MSU82I2M4Ugm9Wl{;B=R6l%ZkI};I2Cl%li)+2Qh`QW0 z>^lefKW>7cix3yz;;hB1SQix!zdT9}mDNiTMe~G8=V(;jZ}bZrh%330`WKDhw^Mb> zleiB(%e=@R6zt$QDkHq=e^qEZAwp@2CLksYBMJ^v&OKaq<&9C}2#ij#Ix|IQ!f+8LW<78ItqSYW5N0b|J( z^uH_V2YSKK;u^dQTEC;}?ak0C4(+uP!@_Ngk z$vb}9IhFK&=!=km7G`?Fdr+t(fk=Wf!1m^<2*rLk^;3Zcz>p%;x6~g^yq`5{8P6RL zI+WF;vJ78sjP5sOswAELyd3s@w8as6pHLocqDze{e({LBb-cy$HBJLb@~OHP4+ z3(c>WbZnQ_CP?xD5iw`E#eOk_N}+i7pWOhI3ewqWY zJp{eKt5@&QZ7AOI=8E!0x~0MKQMHh*Z~4c_Js)1xXD{yk)ry2h>0BbG2RJ!U{vVO` zT|bx8ifLUyVBano-N1@WdtvY zpt8TKpHHwkPH`P6?t8nnf-DRUgg1OwR)Xfc5^bRtqp%1*~QrYZDi2GmgtwGzP^41uC zXAcA)YFZL-eQo>B%9}FFszn5Gn|8Xhw60yiI#`bm@!3W}1?Mh}2uoPF<>-6YMk1Do z6Ci|(gkfJuUwFXP8u#huP`?qu>S;f26CD4fN%swya%2q*k`=ksx`D z!77WN;|DeJ_-phs)5`}*LqdG2O)&0ndP_?DL4^ju^jhUa`b_g3IbOauiODEeg9h|* zgkUD==@i*G```N5Pp@x_{rXGM2~}AOn}r(-Qd-(PLH=pEV7m#;tJw;e=)5SAaQ~b< z`Vm>i&<+O1!?pC!be=L@5_xQ&U)Ky&vp3;1(d>8HrNAR&ZL?W8a`?-U-3rd$4UC3?IFAjr`TMQIh9Se}23j ze1*+acW9lanBZK zYy%C{1_J}L{-b#}ozj;TvZj0+^0pP(gl_aJJG&SX8hPZkIcxh2jkZxx9j^%A8H+8t zlv8QsHBwGh6hldQnk%U_j#jWhI>P$TW?f`GjPKsPjm@3F7+6}$6~@-t5>qQL9Ny;x zmAB$A;&y<1Nv%XQG1R}olYDz`WZ7G?nFovQEcFX>-z!`)VRB8triI{{lTbKUwWVjw z97*E@cxlT9h38|yX|6McK%>59aP|*301)pu@2U_Z7a3LYavv%80{U}`Xk68}L@svw z3xML4Rx1`esriZa_4htoi>y&<`?)2dBg2T|D%7uwN`u}au-QadU#9lR9^=e*`_R&? z6%Pl&HH&y@o_9&adiJ_;a>53Xk5Z&F1`PV%=-aVWlo;0}f?aUd8)r=5Lidr#uX0Fx#D(ma; z*HQiJKG?p~Gn?J`IPxnoNV#jZ=EJLqa! zB=lfh&UVC&Cx-E=nKc%b=--pQp#jx1UiBSqo*NW|QZSv(hx2Nj(6rGaw^yEh4!VP| z#*$Xf`8zic36H=0#G2i(ob+_`78zdk4|p9G3BJ(}$AWDKJ-dnrPu%g`lzf}nJ4)r_ z>=lA?7(*`B3iIrRw)uxR|C)n$y9Nw@cEgsj$Zm>K3{nxQ49taw!W;ArvxJ|pCoXpj z9G$?LjIv(Kb+(j2wJ1KbQBQkI7Nx&HJPl!0?T_n@T(`?B?#uIXh+|Tpt|@j@I3J$1 zld)gpdr$)mZOYuk`v2t@;6bPcR1wz(_SUWpo zLj+dl)jCK%;{`4FvGSsU#05%n<~pc|)_i?!f$dPjqoi8-+vFW1-l_v-~rHVS+ zGo&xz{qop*{R6&btIX&!=vlO@ynEV+_uyo2x3olvwye61^;970o(C)0M~UTTc*yzU z97H`49cA>#`&B2!Opj;^ceKgoI9^UNvqK}wiEP1i7hhVlFruZ^>% zcpr?k%+4j){7m`b`N8)m>w)(@hg5O%Yzb2laN4L^_}YJNoeJ3i*y(m5UNpDe-p)r# zOuXOR%yozFe}f-6iNj|AdAotiUpN`8DR2i3&rNLo+T?0fHY_A{Y&<*XzsT&PeF4yi z2S5Wn9p7Qm;r&Av5d0AaBsxtMEv=uMSMA>3#?QbL-)44V58?TpaO01}U(*j&MgPTx z@>XJKUGKn<=p2t`(5E2lTQXag&(m;;F{{gn!E@c2(aE@%Q?FaWjG4o%kSeVro{+A# zv?@#}JpzC0pKF<%_5J=(pn;8dQr^|}`7V>NKjPGP;f*!U-1svAuid(2k2cJ)+O}C= zu96zA`|o-Jli?GA;a3;3`gmNC4ub5TyEI^m)Y>;m@3N$@KYb;`xFEiNxE4!?Mdj`b z9=8Tvi~F5)WbRwzy}bc<&EMeq=I60JFf0ZGf@8V91LTI;B@I6Y>#CC&@uixU$c3TW>f^qUl z6>G*PQZJ@0kNws+9x?zKD zM!;EGrtIje{0g55nJG8Tsyq!un5XOONJF)s2De#m&p7@oXrxb81i6gtQ8DDIVD;`AXGy=kfTnT5_b^zE8# zw?_0uC8|y++WZ;b)6~FqJ?oTu9q(XMaQ2xB3Vz>L<~6 zUMMOLn7RS28oMrubz_vx9ZXBjKzUZamq?e(B>ZJTj5df)W5~PMfDm(DDp{egFgE~u za9*swE*5zde3RPam-V&e!rY0enEzEp@O>tQIMm3zqVA;}T;&5Ry0$?mwa zPCc5*L!dOAha8SeOG_(X)JJI|0b<9dZm&gDmz>xW{qCB}7j^o4qC!(1vv(n=&_=iP z+`>W0B_cx*aV=CF^oPfAAZF-6{cXTTWMt{kV1$r=WBP3L>t~?Q6M*YlZf8YNWvt2h ztO!A#y6Oe49+vG#PS#gXr=pY6?}<9F_+3g(>R;+=%CwuyHZ1VpEmQ`Ok#Y;Sq}Xsq zo%fJmvc4aoY)IuMs&IM#D5VC=1n|)XMNqki%e0(xI6$5Hj_Sh;2TKts+P^o?q|By! zmL?8Zu1a`*dvsXwLG9hPutYb^dPg$Q?+URfDWRAvqIIYqG<2>4>OJt_kYUn(alh5xG#Lk<@r)p?*8Hdu4ux1hYbv1d8}^jS2#>+=(@g0Z z56<-}AxhvLqDZl=^gUDaXkgg(ZHg6x`5-Xem`J3UMYD}XakK&ca%y!=P zav;a(5q4)73Gx8uQrh8liKbr^Syfjkvim%OqfjUn8!r)!R$wl?sGpxk8|^KQXT5F= zktQW=Y_4Pws9$~BIrSZ;(yF_n2Z7Vt&y1u9#gco~(i*PtGSkv6S{CxvIh#;3l5MHN zd4&2Si{f+w^b!h05nnf>VKIZCU1z@F^IepW-$4;+5F(YymlYO9t-oHtShrNQDM~>{ z#Ad&-Ou7|<8w(7 zam(S8vgY(x2@!kwBq?k88ZDB-+Xda&7SLFdT6AJ zL62}Yc!Br_cQn$dIsZHOpdcctntl6vi*&Kw`y_plZs~GFo;N$@rKG%lW0Ua{I2ED* zZH@SLegF|3*Vo)VgQ&>RSiTz$ZRvT!*Dj{b-IBoW11XXi9g%7r<7AQfeKkUTY4=`c zgXF22;VBKR1JXyu2W6Qek725)$(3AXie*Q? zZm_?ZO|GeuZT^Nw5HE>!NT!KOY4kM;gu#+2bo>5hN2C7=l2zO04qTuHbyT`j)j|Z{ zRkc=i-0(4@p{l*t%9-t(m7}`LWo9!MO`M6Vjy0HSpY$~b#?&Z$UTVO=;2)fp$jh94!D(J30-bO7<%E|zl_nfK4Uq3+HP#68oIM3k2`PTRj{ z;1k_s@R|+Fww$-VM=&l`=i@1Tpty-Q#h>yT3&>8;;F5pv8Zdt1%atN|dQNHRf??z> zlOf$f*bzvq#eE7of`5Y!xZ@87JW9tF}Hr9}~k2()-vUaSP zv8_sa@OnS%E^*vQSo_c4s(2>3MAwMMDgga;^<@Xl>Ou)~Yr2AJx4@Q@RZ|1M?o~}W zIyjnC0h(XZ#U#7h+mX)PE3}wy|AQz`^?HN^6Z7-Ja0!%G8Dbp-C3H`Dlh8H@Ybbnt_>ZGjDKI1 zL{ay}Z98hm9Y%j0o*HmU*!Jn<6CdH;wnSKbNE34|J|OO3l5 z0C2;`<} z&-OEJ1sav}LAfHP*ZN$|ibq;)J}y252|IPeJrFG2v#a;;uFZ4j(A3-J z?+OU>@Y0AhAN<)&Hr{=AsR+e0sO<@5nR&xxnKqPc+*lRMVeh~(`woMBiOp%$(*1RX zvv?-}^b+v?`qao3COY%f^mMi}dQ9JFJbL_?>|~x2-=yaRi%2mO?$ib*bMkt_sJGcS za*0squZ9TASq_jb>XThT8Fk21a5Sp!7E_>RpOTJ6n8skQ6j2w8e{zn)j|ea2){(_8 zNVeK(<9TCu`1j%!B{Iq}<#Lq`LwAFdfA>uL=+0!!YwrpMF(}N`1!w`0AJuo4RHHb; z2oT%$M};ic>Z%x4#}##yx{;}X5AN49B?Qf^1@P^9{PjYHAw*xcn^BZKp9(Z9PR>j$(i~C%;A4^ z8pV*6>gF{nN}DtJKxM@asCblI-`|KR72mo4d`oDx+o~Aa?UAlQI4M?XZ`z2$u z+2pbc;9$PjIDms8(?GgnEk6l(R$m#KX1?YOtnfwJmZ4TC5 zV4AWhhLep0mB?M?B#Rnp@2*W#Rq=3z2#!Ba0>(ec`%y5cKGAnq>ztZ^`G1GepO;mA*$#ZId(z-rBk zd?Gxm>dHaY|NX<)lO~PX$NZ%0+~J?{k~{@ozqyaE6EvjIQEOD%tUQjnLuu!WR`{aW z@^C{?%yb6jg3UTf?&*@<23Kw(J(>M8VkxRE)QNL;bk*PUH@gS9U>)lURpozVz~G+n zqGPQ*d0b0)3-IZ;Cn5+TBSNB)|y?ahX6M!q%#}@gL#Y5Br4Qy9~xrV zUrLk|(UTePE6Uj7n-Q-^mDq*_5Hu;mDRcV!0!4;}_Tr6}jz2*81sf;ZtMg2t`_*Ld z;wnv*Dp7WFen2ve5TiD6Fd`lz;+FxWJ{rsIecS_Rs619YP-DSAvo|X>Hc~)RN7ZL! zjwm`6LcBbs?^zFnEPR*`$x>eDV-r+b5A5X_X3K)I8%uVXR??ri3O42lGdP347a%4P z3_nMPMK>didnV)iBzQ}(@X>H0JCB4+4FVAB?YVE>n=P*~mi$6aV)KGNsu|LXbt_<^jes|)FODt@BKF2YkHHmFC$*mGb>)6vqJlS;%C z6(bmD86c@eiNb6JOThetsG9>>_pVhAOvTgrIv3nElUu!prqGQvHADaJ1$f3dxN&gX zim%THu#bOlNWqhGXkM@nX^zvHF_Rsl*%4o%>M}DRWa2H;mh+Af<+H-J;aBLiHV`zA zdURc-Mq~20N{%YUST*Srh;DO!E#8+1;)SxP!lPo-u&&K1>qKY^ zKXZ{a5JObbPc({p`f0HaJrrcT)F`Z|3>GNy4xj**?gtV*gADP?#m6F0Q{0+LZO&Nk8s?DN9`i*lwW@Vsn1} z-cF^vATFSESS&wY1kCOayd~Sqz4?b_N`>(HVr|v3)+Xo=7I4FK|qMNPfdYS(ev{?dt4zCH zpa+Fy*^(vPCJH8eyP-l87J4#<9Fe_e7t(A*dG$1{$XWRpUWV2u@N^Y}nXt)F;y>tW0yThQl zIB)Jw;e4D<*}8anBBd&Kc36ts5gu+haL{c2PgSXFZvF}xf&`OqLz?AkjcDP=`gl(Y z>ECF5>ct@yUorM+nAdDT%bwri|{S$QPZDzZlV0agx2d^(fr*SP?ymM<8G8_MeX#qovUu z&;-tf0z&eF=FJd_NZ*s@7vof-#7259*Tx@)e4otPl*`2~^1q)9>NXkl9OPGrv$7EkS6ill3>7w*03IhsFbAwBlJ zvq?%sS^V51RFyED@ymD`T)prv(QXXtihtXg4^y0}(pR*ZMS}tSGEktUrQvjMzjve$ zHbg<)X&Yleo~MTrfdCAb29~h2fP{qNkZSHXJsH{9^!hU$a>ON+mnA(i_py7P<8CL0 z>L@VQj%=I(zIGslhkxLfq5I(Nb;eP(;>=#3#$U&lplGqX*5MIjpIC`ymwH}T^yG96 zx>s{yS{H?E_RGp}2Pqp3c${wUDW{jf6~OrTd?^%KLbqyoN|he{RR&vldkxDI3u~s5 zytnYjqYo4I$Ag+kJ(E!$ieE|fkXtykcQfV>y0E*r7rTLT(E9hyejHtv-G7~rT!I{T z?59&+Nn0_Su9A}aPfrE`SrHSarlx=ZiE#9}xcF9K{|~_&zMo;mXfTu`=#Ufco#5UH z`{(gRd5QR0mMUE@3c*yRLa_?*ZHwSx$p$=jISi9ct>C3FGt$7d=jFA4UV zHZi}9Kzx1U2hQgwb3h3(Ojdy4Nd0Nc1+|K&5LH`VTn)G+iW^RwdPGp;)G_S zHX}%CWF~E=9&`?Hl3LAyb8nHXP)aJuOQMnnPdN86W~GsRS-4yCeq!CNlHQD@X2Q2p zg$B97eY>DQtt?~cVfnU@+A6`ge_jV!ZEY^iXO=rP;LXNsyYQ%&XVgZOo)ueXvmcmQ zWW)k)sF30%!{H^rL1P@5Vf}x}9f-$vEe6{6Sb?gJ$p=3SH@>?L+HhQohzoPCD6>xB zmYuS*5>@2`S^MkpxJwlB!~*F#>6Wo`=5zk!K9E`QL|1 zSr`)}K%rRTdDnFpk49#keHXf`V>d^1kKr2|skaSuV^*|PxSfB7Huw@*Xdetr*5`Wp zkSoFF=H_M<6hs9e1_c!9W7n5ScMq^_O?0)=+*TUCGt6=Y3?3eq?uGB9Db%GHPB0gb z(-(bVTdp%*2L=O(g7pa?ptUaY>_IYV@{nXtap>rPguRVr^$($aXBfmF%F-i4(QeSe z29%k2@Ifq>&(njYk`2#IsP{iEVKx2`v2m1(c5ZQb?X4xU?ng1q&im9aDJ83ejm#W) zv|@_esy*1oVGBzjr9wi+vVpfhB4d`?y%k!}|FrsSx8alPNapt8lBb8&F zzMF!l#!UFjFzMFGvEe!f2kG~eOn3$nMoa8l-9k2^@K*d3SPT|O;$X{7e&w5G&BK>npqm;S;xg4gD4FwvRC9r znlh*CH05=}OW5V3=>&HbqH>}&9Srr7`C@p{kBOT^-{<#=_LYO^ANLut>1% zo;34@L==SLc+yK}FX_EQWBj=2{kCeDS_t78XGTUwl&dvfE&eWXxwtH+sJg7SjJqiC zHN;;B?EY_vNG6Np!lGArVbyK!eYapGZp*FfQ*bFP@~UJn?e|r@!vshI$YbVTl%73M zwK3k<&JI4OZm&ArczCj(_@m=lXq~q?!r%R#!l&4W*p$8lu0h5erKJZ)7;n}T^OlFk zKe+*!rrI|^C;Y~Dg1s9zOy%27A0ztcEVf#DHCd$xw|@o6?88%YbS+r&T@ud6b68hQ zdnlHj2l={0W927qt1q2`cgaOq07~6%9SR;p`R>8$Cm&xwXvIlTKQW47z0UUe}L0KI1N5orU+!FD|A%+#i=6%Vw_qILxj8if6II z9E$788m~yHA^fT9BfgL`k~wX+RR~i_z%>a(6tkR3aFmFWFtHW=Zt5SUI`Sd(c+rgz zDqi5=tHG^tv$2%d@1OAo|6zUNDeulrnG7)Y>HEW&0JGD{?-<(UvTSxG7KoCs>CxXN z!6g~<`_E6$988ts8ujuhC(jhm4j9$!a7k|sE&dZp9p-%;(cc)#*yGVw9kkGn2=Wa*oEJOeo3$R=T}J~$>N?Z zh>uF4GwhRw7%FhrNndsKSJgo(fXMB0KiyH+37l2}J(=X_9>5L5AHIE{GhyQ0eUiB= z!lLrBmJB9G0bzl$5$x3+l=au#=WtL0{Acu)EsjE&P7WGI>Nb~3(8mq7qrSMW$T4J} zc$xyPnduwi=%53^2(l$x^lUFp09msbp>ZiO!NptLe8aj}z5(I3c4H7qfD6}diyUqA zM5^`P(hkC3azOw>^U`BMRrG`wfs`1!32%gzo zUTLZFMPK%#JxxMmyfQ48R$O0P9VV}k0zw}3V;d86|5j%wv4?x@H40v69nQf(3md?a z{f^PI$CnEC!!JX>60f-CX=8g;{X?X#NjrW@IPB$$qX>GStf`*bjrI0N@psv#$R3ZS z!q^JbjM9E)7BDZiq5=xRNZasMtg+zT?;F^lg?-V)KSPxG#5bKMNK|PH)A-Bo8=%lB zaq>4paAw|QFV)kpBd^V>?NW^(!LGhP+=Wds4 zNhTi_ErQAesqI7ayNJ(e{;;J`sHi?bY4n)FUt7^c?GC1i}5+_S7{8&dRV0_bp$S} zU$MSIh3%m!cag7XAtA^Vo&y7xIf!7%out&=0s~^nk0i~`$XmZewONx)FQIqn<4}XY zQ!AfD^s!nw;w%k#`ZydMd7K|6x3%!cN>!c!%QjA~xKaL@59HwRo$P->0%&P#_d)18 zRQ#$xAPwcwbk0xb2u&9|N*j{M(PJl5(*eWZ;d|tES(22-5O=nN|3*od_Q@^0V30a^3LtDjU{z``xy@V1*w{E zyw|fz-tfb-TAlf-^rB&_py0&e-dgw0)Iw|AXU^}}T0V(?;t(-+-^l4?JaLe)_*;q?oKUEn2zV6T2TE&RT=hB9=^B26DJ?}p- zsP*#Kf$*n^M%A}W|t|o_-X6y+I9em6V?b8OUx$`_S_kZAc`i${T9u0 zHv-=#x?2#u#yX4>=ux&Q{8%y)rjBX3;j$D>oRwQ1E`3!M{Bir!!{_kmmqE_g&V?{# zl1Byq+Lec#?!}Zh>g3Pk2kbi48a}=cr|N_xBo_zuIS?+Tcba5~AP|uGJzwkmJGoiu zM?!XwC(H+g9&DoZrFRaS?Vn`_p5@&v~w zzjDGO;~w)m(Irp7?qBNv6ioqro+(gz+G7`dqE2eIgJi^9ln(eyb$)u7?3uqg?htf= zJU;0@oW{{v5tzerkunrQtaIeYFDmJ|r0!kSx9jac1qB2qMBa8V0z=Rwk^@X^gIkyf zBMA<3Dizts=_xHxfNe*5W5Ow&)0BMH+t8tdW~vHxE2$a61k~o4q)#~S+TSr{#{lH< zf%Cz+e6M7)Pe(eczE^Q$$$I`dfi;WmI%uWN8#SR_+(_ z!=s+?gTE-tzcpT35I7*%#oej)&y&?GyF)?_+dPjV0gbOBF&JqICWfq0dOlG!*^kj! ziA&q!35spH#yJtSX*jr|cjIzLq2O_ghale=q~g-Mzn$#!4GAn0C`^L3w5O#3(U&Y0 zzp3K35D-XgGx%#-4{s)i;RL(i*uPYDM?zME>s&nQU%#90Y>++DtsZ(gIwqXAD??}v zUG?=)-d)XZmD{>Wy?Oth^G22+%_en=Itb<#%|!cG=(_~vDTJsJ02juaA~%74dN8<) z;Y=V%Nd@b@HP#4=W?jbdO^UNeLqmylDA2pUvyLoS;%a1cw3W3747<2^L}@4C)d?Jc z+`Lo0AAu?(&&_&2wcp(~!gVc%5AeUc7Kx?I<9#FyqKJ=&)eaNZ3{neTV^t!AQh7d> zqJ0m#Kgs4NGYl?#N?NW~VX-6o{`C#J$@|Aq|AMSqPPrnSY$^T);vjm(FVq%!GzTt= zoApI%zm99jjT;QzE;6jf*-dQRkXY<&kd~@mO~?+?0M!0Bq@$ywQ;6Yr9jv9NcV1#n zi$sVWumh2m>ImV#&n1P_5vicwAH3U(nm|TYD4l_gB}w{r!5n^TDZ8!kDBbZCFBFOy zEni<{e2NIWJVd@~9BCqgm>lDm03&gSJB`04I8m4L=g_$+b?j?6K0V^_^hc!kfioU-XW}8Go+hLFNAb zDLsqldjEwHywcCu*5Cwl7K_%jT0NS7V-LP;xZc2dEHj9I7};1|Ev&C+Lk|k5HRzVZ z5W2^7>!ODGUuDf9k1Q;A*umQ(+1An+Z&PmheQfbEV9*{O+n+s>TMa*1&QdVl`T!jX zoPJ@a*Dawe)yPg??aRA_m;hBVv$$uUt`D#Dw8?Pl!-AG`n8SgrQcj)Ud% zCJd|(fGQDbo&AB^3+%;Da~IjO19Zd;GC~}>MX0a!z#Whv8@|-v>c5||RI09~L={+r zb}362N1w;=R=~OaeKlA1S9~}D9O;IQenyM=85SoL7$MOd# zPD{huA1MuL4Ehu`4f<^+H0zc0#hTS6Mr{8naEu?5B!XiEFVT{I(FXj#7a*HR40AAN z?&tt3QL*#abgs}hh{>XOY)tk?>spihmBH%r@+jNS-pO{zEewz3p~wX$qB_lF3=JOuWa1xaVGVUH)CYeRn}qK1^W$} z0fl9;YWf>YUZdsAf5Nqs9}-%yD;f!(J*DJ`VN?l{-0S8-Z;+7) zO5-)2xQj?sFaH8ozl1z0PPf7Y7Z=o@d{O`K)wmg_Rq9EBJ}d|B7~Hiw^6Ei4-Q5BB#6}= zIw@Sy6(#ZyQLFs~rvD1$GXjWnTz?Ao*+y>x^jYG<@p&hj8RPMPonF2%Nb=sUN<$kHT>iZ3#}nLH@KZX+rh>DJH+Mje%MIb+HA`I^!1B z4Xxh&MXoN5oc@FAvtI^zLl)IRZuA>G6X+ggJ(Wy84xuNwN|*wMQFQmpv$ou95PT9u z;g=kQq@oI?iUJ`hrES%`7u;Nr-AG+`H0D@RDkAu0;{~7;=DnVTgCgV!^Y}&~ol9Dc z8rfOPF6U0$6~PVVc(oT`$pdF*{a65vKaE){3Jr1TeNprsj{Bb1(mvbbYWB%vzE26j zaM>?V8z%Q+IYE7!x!bR)Tf1Lo*SQ&Pv;~= zBd?FS{lTVByG!u#J7y>3j|XnXu)*~3aQg``1kOYRO24t4@|q?r6^n-B_Z3i1hun7) zUsXX(;KV;c9ttzf2ZQDhV}=0~@WJgiZCcVKl^1ACO=&k4zVOMqOHRgn%<|PUMvb6I zw-Niu``B>z5AX5*CzItoFQKd)MSK9|(yWmML_oYLqRaK@&(dTtvf|FVJdztMQHd`$UYH;;F3?a8aC`(5UUe>(1+2pkSmDlDs1Ir)xm7`a+qL z%rzYf?z1}!3~UJukm&;|E=?rr9l>Dm<#a(y#}CWqjAyo7lZq%j2aOspMx97qjR;b= zAjrsxo?h^=Ju#6$$ZJ^K?)^4aHWS%k!7lHk5$pg^G*NC;70RsDLavx5QN0k#yc-sm z>Zac;hYJYxM@&;8tPm@eTf9&*jGs)LvJLS!TucJ$>bg{N)-t;*Q~24hnweb{b7TkG zjoyb5CR#sN}yxgCFJUtaFv$L}YAxSYZ zewPS{SaK;yM`>}$0EmN<5Y#aHk8&i>w4Z3{sk;gf%z*z)Xu-T*BDKzQ;$l(WZCZWt z)04c2qx~?~Kb)84J|H*;mWXD?OnW}NcjHi7w8jVZU|uXG+z;m!y({Rsoy^$cu}sS_ zFA(XqGee+z4dxSd`Z$js{%B1~W z8rJ+si??R;%kGOw4JamK7~7sZ&GDxV)WlzP2)MFIAcq8|F^0XPaS(JB4;hKUiHT0i zLuRB9y@XRpC>GM-n>afs^}PJ8y>0(_^pZ!z#>N&nH1ze)53WCFuB}>bVMg9ngDn$S zE7qw5-5e&G9^Z!2GWEuf=0Rc#oT`>D`^dN`OeXEcx3SuH0q~Y5V&Coew!BXCQdypp zjHuI!)Bpze{v&G-F>F?xM375MPj@(VJqsf70!e{`TGqI) z6W)$>f^kI>2#&VLfH>645f9d|`urFuT;+YiC^b=1zWvYP04T)3GZob@bffqsONn~T z64=(f2%56_v)vZ(s01OCR#cKBF0;GbnO3IJL|W3HP^#4@)sCD@ZAdx(er4j+s9Rkh z)ToS->I`%%t4{M}A3xrZnoa@nsA1i_yzqaD{8r!4+Pbd~aOgwVp;NkBB&DP!l`cULB$V!u zPU(~emG15?5l}!tI;FeeTio~eJ&%7~AMZYU?X~6{YmPC;+_Ak_ClxdiL^J&<6)Ffe z4e`JE9?RF=-@lpEYIeSROR!U_Qc}Lo8B@ z(|tPnV4AkxRl2b(2`~iV`fEIcv%<>NW|r&z^g97=zGTHG^&^=MvECm^TMfhW*`-PA zm83Y5CJ553S+av@re^J*Hd?sgSpP~x5}S)b_%wDa$z{DI>f!d}C?hBzT*fH}O27G{s=QXo={_8#mQ#A7e zJg_3%2F&K%5}}=5=txrNNLrEz?u4=O(H{mXe=9-FuCkk>c-C+!v4KfNtaMFdAWFUZ z&acYf-^{CPgGP0T(o0!cM_F0-$iDB1{L4g{Eex#Nrs1b_iuC6(toZy?eP~Ne{>xw4 zah7dDN{hV=lJRXPv~k7mx_~imAwC;2=eEe{p`)5LfO#X0Hd1fA9RV{8Dd!ho>eU3hl;aP3V zu#@^=u$j7akrl6-EcZ$Xt%^1dMTIjkE^zCm)l=A?>dH{(^yMQNTNqWRcbfN~BGVr6 z%fT3|7JJ*>S+-!aX+HA0ega^jM9L+0{vt_bpzw(8Bwyu{0AA*{Qr`jSj_%`eQs_PQg!{(oXvOBT$PCmWj+4B}r2;wLuFV@KN-M|GVrEdUbX6je3-=yrm0N zebe=fb#*wR%|8@|jc7@YC}Z*WkzY#91T`1lzDB+vhGC|s=03ft(-#n&ZobD)>f6a? z6q#%|bZ?897U}Go8;e>Ns7EA<`P{DaC9%8c2mezNdETLjvmf;zp1HCgGZfZ;>>u`R zTuW3bRNJw4*nPF!WyUuw$tX7MKRS0D`%=_`Pt8~Z1B;b zS=I?=*|*w|C4ykkOY2qq%GkU1!_=3w^;bGN6)i21#jnZ(LT9u+P7UxIN%_mWQ2qAA zg;*Oy(8Ups2gh~s=JWS=3gooz*CZ^690;2ET$BIdByu2Fe9&N|2`Z2wTPoe$Ez)Ep z-`B&KUJph7UhjzRQ*yhCZitHpCHQI^ULLw>@g|Y#E?YiX2OY8wL)XF!jv(PO^Y*43 z6Fq?m3JE=}=7y~Pi&;ge8VFI)i~psEJ5OD~mTd6ljki$XF{4eEuv^uV&%gkrroY8` zyyYOAQM-|(F!Xs?O@cz-FT|Jzw|+Jt==2{54IT^)IE&ua=lqn42}Pt9^lU2s?y>Xp z;G%!oP_YtI7UBoQBx)-EZUnPH1td*|nS1hRwI8!L!%OH>P^O`cRKusG_>L@tWr26c z3!Ft{B80rew{)M3HoCOP3g>=&MtSBQ!NZCE5}wX9x8az;DLk&febM~&R)skxNO(H% z!s#Uq*}{1=8+U$1tRzheO*^&wMZKljF0m?)Uh*hioy zDh1{=2Az3&dajaiZjDpFYrjdD?}ldKB2OcJUxgQb`NxI`D>|316)A?$nKQIO;(Ny8jyIo91DO^L)ed44VkSqdUC zTGA;N`0z0`rd+a!K<6~R!Y_uy0zL_xg!Ukwo1IS7N1j68fm_z00)@@ivO;}5urWX~NNgQq02K221}i6DhF8nNDL$r2ws zH_g`ih2Py(o;Z7~EHK9gYlzCxCUwSWGiPQUJg;1@876g+_m@0$@4fVSInMONm`6xR zUZw{u>FF;`H3Z1i)Re<=7c%RC5bztwJn%xbZ@+U{E?b@8Bl`(3q)HYb%dtBJr4CaR#H5TP=HuO|uixT2r$YK>1fywpjZ7fcvWlgplQ!Ce`N8t2ujIZ5m8w z)%(bQ!Xe)j{>%v`8xhHJ3Vf;>VjJE?W+0y6E}o!L7a=C<=WL0=A3Q7@WkN>&kU;$< zre~88JQ$S;2hn|BRjJpoIyVy8tfHza?%-c}IRmVFIX3opqRS4I=WZpsqeD=-m4=7L z=mwSK_FxEY(^kl&|L%>nxvp*9nzlJR^q#1GG!V}Aj_vX$0SQ}OiVnhc8OzF!qKTCg z-hUc{JhCulD19}H@ussK4>xdt_&!*E`GmmGY5btPO@dLV=I&k7-rgP_q~+oM<`X-= zDHv$R`ufA-2PF_cMhx-FFtqAO5PAoc^f^bC0wXRuj>XiS#xExSMpPAN&*OV+c-Z^8 z{g0V=P#5|z-Ebz?A(>id^1Hq@ z16dj`%vV<=sP?cC8l?5X=2JF~tVJy^WW`Ml=lyj{jl;fUcCsHF8jMd@r>3l@aQBye z?WzXoh68oQ5&B%Qxx~i{w2fNaDnEn_*(H`?cZ2I>hJ7Bz>DI*bvEA#CB@qi928}iU ziQ1PJjQw4jPs0gHIX-{-PMtVcG{MTfBd@!B%p8w;-rxVGIpdSCSo~D+w+kC13R!($0%E8)7{%<{d@dZx7n;0bH2$( zby{BKyYlQ``OPyAqL(HX2lu358&(=A%b{LAbh6E9=66w??v1)}fTlF00sv{E4R}72-Mv_!=}~LY2vZgh~jJ_cnbszdP|wzO!Q# zOt(dJFtOg~Qr}YVm$;!Nj8)pA=WJKr@(h=IPlsvyJ;AI~pe@^C_VUS%;JgkTzvy4v ze?DnH(&KNPSl)L1@0U9e0!M=Caw8nYhJ&DLNIm3z(ax91*G}U&1)xrPaRO(_)*p1%B6^Ko13JA4vnhMhv1sGia|&%ajs zbvo6zF*T=gSzpMte|84z*YAmt1Pux(!c8gdP!5_VCpxtvi`>-xM2aKSrPb)Ixw3@X zu^s&-5C(z)A198C&!!0`;R-C8@>wu9 z%n>+Y$*6xiJ97q1eAR~p#77R^LPBIhZ$~wR$J$=3O(k*PL-E^PDb{_|v=ms4iPq`p z9ldt^tNf2P(ch-|-BlLyzt~InN~@_f+<)4;qZ`=H&=qm(6E9F=b30a?!+%Q*<<#YR zNx|m37eF(K5VtHilQ!rd-L=Wow3RCX_eNp2O&T4bp|kAhCFX{ldWcQvnRCN`KJEj; zd`UQ%<<4E}xX~>f+fOm$^^TYx-|+PAbXR|riii1D^%gymsrb7Ge{8)sEqr{gPV`%R z5s7M4b-1-C>GN-c=t(igG_3bQKi67sOOI7LS~pA3?OuH`h={s@pVfERMlfAhNJ#we zkZV``z^Q!b`;q78J;bKf#E_Jnd^DwRFU8W^D7y@yn9*FpRenM96*2H*GL+l>xNyb5 zxCW-|!l~TnUgD?5j@H|Gi!eBc(;K$%e)H{{wHQw&luB zJ_G~oc-9kA{PTfl956)xrH?qsi2{!BMR=jGJn@WG>67-Rk7uumUK<?e|~*Kqw9wVyqd40%%Hg#TrbHc>QI&#mJx3=|5WSeMvL(c}>SXwr?z819Kk z{J7zwlD#yzgwk^-)^^oq7M}AlZh0Y2PZD^lqO_bi?6BVGU9KUZ7TFOunI&O7CE^vY zD!@HVjd^dnO3C2p>!s;7la>79GaYqCi{?w7o6c4p#Ut>)uLRiMu3l+pXGiOtVuT&b zu#OuR((UEtTi=}&?83yVv6iVAyczt}O@m8INo!JumI*&);9J6rc0=dJ+1%NFvX=|( zz!R7QY5(&6JSYvTz~-!#j-Qg8!|#+#8=-JIUn5jV zhKO_c)bupyTXJ)EPaO_}Y4X5+5UN*k$MPAHh(t8V!pwfpZtMDq_n7Pd+1 zol^<7ajhR1ZOMpYZYm^%KGVrA__{+1S1||QaH3OThlol@j4}6ek6?IY@Zww+S#al>e%26~4sB+A4rSRvO6)s)^BYn5VC+e;%u~j$y+GXv`__)r#;zFc zfmrG}@^q#C4>u`aBh)V#OB86q#fFFmg@8}L<9t=P4&Kildl2_xGQoj~2L{mCCyZn$ zMLudu~NjB0LExLcuU-e)j-_#x&S7dnmVmpVHGDu?KWx;0(0j>*+%SN^3fbA~{{l3MVN0g7(K<3JTZwrbKO-V&f9RlJ{fb*0~0hqP1u>mI+BoK+C z9s(eM6Q=k;C>vQ)xtO_X%E$dVOZBObSmKlABBG=TlD{|iG6pmV1xwN$p1I|US*KxP z^`&Qh6^U=f?wY@ZyMCSNi_)c0YRXkbLU3`z{5y)3ub?G@1a_~F&)Raw$OueY1~lxS zJj+hs9M;80t*b}zBQf^EgE;I=mHx|%YpbrNH~=WbP(e=CMdn*s=Pw4BJ)HG3>X=4H z%0j(ujzfD~RWVIHqKQjwKcc@nQSX=A6ZzWTd0t}i`xz{@u1JBcF(${bu#gA$#{?xc z{AWqSD*mlwN?QMcu+j>U0W~;nYivWzlg6$1{T%m#?xlEeh>AEO*j-!J9=^UHlbqa6 zIGnnHn(Ck+TQ)Kn>>-WC#rD%|jr8bz@7gjT@QM8N?9~oIY`8fQaYC7Yi}5%5r)9Rz zyplC{1PpS8t5?+d*8yT((!bnGy0mr%qjN+pamJ(kXE&u-g`&(yG zlXh8oIZ4r#LIr)Z2u$Y9FpfAXJ$0cIdTxZcQc+l%O2<_a|D8Tdq?X`C@-i!Pa+Aq5 z5>XZXJgs%^$Mak-G|oL~=<9OIx@XR22MueP@y$?H%IO<@KM0kbS%o_?BkACQlGC_E z{WZb>m2jUY9>M3{1~hY{>p!HBT;^Qq0_~(_Wr8nH{HtDbRZWq}e)rly^?TbwYejcw%RHKbjyL5i@>l!Gdw5_jKW_+<93R*rnai06LvV2m4*{)J6F~uH> zI8eyFcfm7r53!CL_`e6+HmKGoh$TiIaAe?qE}h;9U4=s`8X7|9>g^{@xR=U(&WdmU z6_-z}4<{E<4P$VI{r;^j?z&F_Spub5>cvgQPyXaleU}weh33cE`@6e$O!A-UaOm&u z@q9W=p1M`gJsIcnOCXVb-s_@m9r@$7<_9m0%)W?M>WYO6A^dG69|h~^;bWW5E93LmfaZU?Ow zRY)6sKPi$1c&pW2f4Z_h1ON8m1->V&kuExC{-~0o!%7VO&5cPKO@gMt-?a?t>Ajs2 zi1uGr>#C^s_iett+PsA}GMB4b1OzA-5^@)PF?cvl1u`~|C!%c)!QrH46bqtGDBIG| z@It#XbiLx!_Z*DFK&onlzZ{r()tGfsy`aakg**+=h+s=iY&#t zsv902=Idt>%IX3|OQeBGHX%X5pYLiVWke~k(IKSL+YMO18~8S~n&0~`8PVPpZW6e5 zN^QLFo80+;&tp!WoVe7-q`Yu381xKBE-dAZ$HMJUbwAHrV#I_{8u1CSKYVtX{ zQs^xF_SSRjyHwcr!*6>!L=JINFG%{m%11pstLAq=F#bRGY;p;@-vGiTqf0y&)j zICj+4g?N2;G^w07?pNywJCtN$wTQ-qUclFxPQynK+B?)~-EfK2{u!0{*^8xYi+mk; z$$a6$+^>E42S<6*A~Q#c6UWdIw%D}HpfS^03^%y(gx&n@MioPcB6eQ(b&XKGWy5%1 znw*q$IKnrU0Dgi{YJgHeXhmI}TzUJwi1$&1F%)8JZ?9Q2={OR|Q#NiA%3P?>6+GVv zy}-GG4oy0u`5fi~tjt^$E~?c4!C=Tcb&z1=jvL-9R@&@-!izvyO4gCjB>S{GZ>!FP z=AX&wa{AU^53b@}uoa;ph|+jGAK#U#u2ejc=0GaJjH5D95NgUPA%VAxkppW3EHLb_O&cP>TP|$#|XWuoSB; ztleY8nncbYnlNo~_!p|JgAu&>#X%~e07c8du`L5H==l>xy^9X=^V+{iPhTUb@Yeqj8`9g;al88%Bs+Z$Lcez$99Otn&|%_NPFZJ?6}3 zS=CABBneiQrU-OrGPClk@853C-(TIUFhUXiv;77Mvx0D8dCcKEXCjG#R0p;->|1!c z9nuv2kEK0uA8OO@()M{HH?~uw!hnL(>D~3FtMFZXTb5YPTeU6ZMU=1G~T=if~}^H(RyyJ(AQEl!SQ9Phqoe*C}~?q)&>8pM+J{JAr}lX$45 z&iD#U^W^R_V%zynsNQvp#qy;sQJVuF|PBj9uGc#)WUv^`Vu=Y01BIgHRf zQyNUV8Y9_0bp11U{f_Nm{F(TU#n5c4<=onDxOLUTuX2CJ)vAl6v19ajjOcrT z1Yd&PJ!Kz~(OXwRpDdL3G6y~cdl$ZbPW%HL95^>8xGWlL<8dJY8qkU-xne>gH}wo} zc(6}SPHx%SkJ&_RwiJ_l%J2V`cOi?3g8@%%N^}y_{3>(#T8jB5rDEI)0W#q&nA;u9 zy6~@;O}vK=IvwVTY+c@0-WS1H8rwVTHL4Pa6UN3OA*>NEmOZL2w8*+`y+}L{Zdv3! zsRRFrpN>fZEG+-($MbVSwRc{=)qN>;_X`YR{vf(Zg6kw-grI3s&~jH0<|BilZ{He} znVHEVh%bv*QtK&WKG|m~vO$@Kjt&*?qx^vp-*j_cePJ`$Zk&o7P(8hmbso%Cy%_Mk z_x+H$S}7Y$T;SIm0(lHY3FyX3Ba4k>`a#akId$I2IFYq62QJz^88I=&JFhv0D#&c! zI9ilko&%GJ;|kP3=wD)DVvDQ{X(BNS#9hp~fG|tgu?zpRvt8JKcNP@AVr-VtkUjCU z3f+_ewIZj<@(2TX~DI$SWEj<=6t$}Ar8afaY6KuL1=>rz37 z6J*2RVl_GaKGezlxqGRYDYN16b;x!AiDDU<_xnm^sr?^jyid>1rGspcdX^TjMeS~rIMs_6JCZ&qqL=Fp@ zFeIiqp8N7OBa?yY(?hhd2ZDSB2@Eo46CV$}Or;0(z*6!GofTqmX>+fb#~JaXyvRhv z!z!)4pY-+rm{3iJV{S_G=4lGHn&{D|_Plr*8FZfatOX^MvV7gI9&jEv?F;5s~uUNvn6g@}>SQKDd7UERS8eIuhX3Li^YVE1Uc z5EE)v54S@cLzwBubje1g09p=L_B&UiqnU&#z<^p)iyBOEi31aP`I6!RR}uiEj6)2!PX%2;g2hIrlLniANcZw( zl1SOH6_*icFRUIcZ#fQMMbISn11EQOmQ1gdm>$!^>vUYcF+lk>@-F`8!I6@X%2+h0 zEA&U(Yj;}&(dQM$7yTbhXj#!@zFo%AlTJlwGxG=L{tIg#5>qEqQg?}eNfs!s*T2-< z9`ZNqUMz0>aQVIxkZ^CYR`szzn;xnZXf21mF*T*ln$A=*d;cCwcl8?!QWv4=A)8>^ zVHc+6Gh94*^&Ut<~AdtO6W1LP3pb;hap6 zIDVv~qQ!FGY6wGu`qS>4XQF4nG-u}K%poaRSz`xd>V)bP{pm6_#e_#QlkB+jp4@JA zXW2s>FIk(k>g2L_%f8Z)wbgbq;Z~PmGP{hHuybW*q89M{ipny%bZw6*b#03>t><_n z1s3lr^O-x`K%kc43PS}#r;6p{(cDQ^oLU%ch4Tew$(J$t50 z@)Q90hWddGb4CrAY_lVUy_|Y}F7t{!l{*yjbK7ajsNYd}rs#<9ytv!1gt+^$+*xiW zp@|q;%Cqfh!Z4DQFl1ke*eQk-7_pakm-|B74h<{zhszf!3XCK4Ha3I;Ta5bBAH)Z6 z)v@~DlQIE>*`YZhVqdd-aPI8y1O>UgG4uAnye0-9!#hx8buM*k=v`@DF7xd7-|u8( zTwGm~GYfJiw_g_!B1zWI6|ApYlzs2?3pc{2q05l){qorB4cM)^`udy%06m$qyyAe8 z4}0^UN?ebgjf93`sv`lbc*SU~qyrPP@^}6t_p4MKzv-Nb13sw*M!U=`?zO0p5>JNY zzK{KmMV~KH5BpupLQ8He#J?aW)c(xmIJ_p`@;Z<(yJ)S)!$DnXCIDO{(Flzt3f_~E z2GhtRJ_a`*pD#AGWH=~DG#?ef45ssFL;T2+&~9L{HdB6|@cRvOzJ9*7M<8J@>&{29 zn_V2=97O-X)humCoi6;(5cNQfX(MNvO=7 zVu5^D%|Tjy)QY3&#|izm5``-_9sK?#2Q+PeN@9(|RxY199uA;d>?9!avv>Vq?4tI; z?0&fRHNCm<4PPh)MJYrZL~w%2xow&#pP41n;eLHv+DasgcU4~>6ci+?lQS=GMr?^6 z3^W`k@oM6aOVi-IL)+>mnc%zWnhL)*QiN9$)^%(Ss@CS(Z! z#?{BU%d0UGKh&l_s?hLkqbkzUzMRw>{_P*5g-a((CC5rTyH4+&QdkG~Cw=X`Qx6xuOXmgcT_&67J;+BD50CWX?d}jM&?m>@PTn|D zkVC#s@9f4S7Z5HsIY-#k&LYr9SC$7YgCff1L~>h?ed`&qpF*sROB1R8S6T&+`t&FQ zp@iJ{sUIui|1Fg2HQ$|6FjA~Hxi!1D4MbE4NwK@h7}etDWiJZnLH{#RW_k<{{!a@{ z*d7lz@Y}=kijV7*u!}k-ndO{^zmJvV)a2?;MHUU2JmDzcq&?GW2SlNeO;UW+=p<7{ z(?i}T%xH*HdVF|~RfM;#Pv)Pizq$5`oUWZJif8y{!5Oylq>=yEXWL( zq;ZR#*-Vm_NlIuEBa8CE?vc^jjO1TC3I+HO4nqMT`UjiH*idYT6fsJOUTGir&%if% zu-<;r@{Jw3@#wJ3EeA^hDx1q!Pe#vsdDwFtX*{L-k6s2At@CG#{nC35F7 z$TM@?xL(zLjy0Yx^cv017^(dN3AT8r@8olCep+WotFoft$a3X_2@OCE3%7RJt+l{* zitRcEx#Gf)jM2z{&ZT`U%Xfx*X7TpShI0 ztl6$Wh!JKteH?n#Fm5%oxA%S>yQZ~uG;e$W4Ct`5teZOTY$!>%ehb-ge5c=QC=g=- z$TNrnln!|U0W#EfCTrt2hWlX}S*=yu+FP=&QPJ$H5$d~5#$Tma`P4>zz{HOGddnMD zXHQQW)nQA0zbO3}2tGbVf?5?|`QbGG-5*4lcHFsHqE z&O@T=G>-X%2%$j0DG%W*P%a#7SbTZ9=ykggnJtf)ElCsqTwZ!>f$DTY<*=U|ZfGcf zuqh$+;f5^k9D79y$2!deiPFD4WD5uYnkLycUZM0QX%v{5UDNW_+X(o5wQKe3e~uLl znDCa{<6)TJh0Xh@Kr?tsD&T>yKFd=r1LS6FYr8ZqPrW{F)l(+M2$|eD6OJ|~k{$ou z*l0dotAW{&t~7HnbUzzBGtT> z4BS&ofmz3$@Xt*%>|Q#Thws_Z?eEfTJIBh=r!e@}79Ktm<(=jNTs|N{ z%HP0D3Xm9A$Q?yz0d=4o8IY9^v1BY2K$YqMIT~yM9GF{=)Thp|gbrckZcx8>HF+CU zA@hd7QZB8pZwdd!T?~jvj*Z`r&$QYI4Nt3nz)mk*D)0WbcXT;?(wUKb2NMo6l|!1b zf{@2_9HDJzqw;Ohk)6k4U%!wS%kM^*7>6*Db@k!drggxP>Rd7~bg{`q%>M89X=b7D z@uBK5L45ehqUwO!wJ|`Yd-*3PC+F<4gH`R+6povLp`q9>b?h4M21M1rcFB+qB8Q<{ znjc*zkk=c+aBRa_YPZGXbpRBxZ#?u;3jsRB|pp0f*{^IYh)VNalV+&HcRA*~Aj z>-cB|Svv(`vT6FqZ+9Q&d{G4jcgDjgqw))S$cwlh(2XGv|FGf!n1%b}7}FP;c3I1f8*qen&YIA>U!L9EWf4s3o5K4@rE$|h z5_<&p$Tp=pp>-&Eo%#xK9e5})!iRv#VJmpe(#zFyh*+=3(dKo8Ppk~%T8uuFCi9_bYVW3TU4IX^F8O_9TNe)>im(4Yfsmz2Plp!Mg(9Wr)-bIQ z9r6ls)1T6o(h6Gj>j4ohG1Y!B0{@L6Pgb*(k^hmeB)aisvqJup1+>x-CQ{8Up`%369~iqv`11H?Wo)U)*qU|gqMIVG z&QaIF2E%_l_ApI zIanpj$YE5pwW$txSb3YCG6KC zoy>@qBZ-;x)teCOWr0vC}o-%swhNByM{Vo*O&xAtP5N5EErQ-B=m4uS`e#Af;4 zyHDwTYz)vxqQzMeF)agAx2Jvfrhz~;!1%hrIM=0F zWz>=Y__Ozn5JLSC{XAOBCis7o(yFTyelGi6w_|#j#dm^kiFy2<_7UZS?*sONn#dbF zZ;WoeMZJ5_=zOONHZy~QqD+_u>yun9mPAGcGiu*k$LfX#E4e(pM-@ih;=##u+qpnn z{0wr)vnp;}m2g2I-2^fTVCmAJF%D)rB!vox=gxOQIt0^I!chWudTvL#VZks?OJxVC z(EpzLnGTbyj|LZ2aRi`*nqzgAV=e=OM7ud*vYWlDr`t9i@cLQ73(gz{^QsVa0 z38nMPqt)|4rmPWi4VHpP>dP%N((Ai>`Keh6?0||a!Tnays5o%gJ}8d!XClMC0cpm#`ME#>;qeVJMcj$Ybj8 z2OqM;Dmywhb}}`kLv_2w@na|!@kKmCj_TV36*}jqu;)t5*Drg9{ukaxW{{Z+TyvT4 zCz*KzxnZP!+ZQ*2(dK+)Q6RiHH5&pT-XIUrnCPmj%2ZbQm6t~~;nL=)@9{fIzXWMaj#2vC`ctZ7< z641n@53vsaZab`Om0E-dF$Omw97AzN1;B`Uf1{SNjlGy+4(a z&C#ZkNoMZnySm^qLjm>Y^IfwG>!C`>WSufpN?OR0e0__B*6GQ#ku-W&~@8|Y;j*s$>m z@ROhCFm>35gPh&c*7gH(IHAP#hZ|OE^Wyi;+3t@Y(HywcTT|<31h4te_ve^g>%i7UkCm|*-T!9<>*`h(SDt~s}!TnIg4ZDU8 zA<=~OfF1w%D5l%1m`)gCh-nJ`xPGSUrWxAHDZJSpN84OxUT|$`BA)7xp?>?S#M;qu zyzak*bxfJ;U)II+0i1-=(&eEy6IXTmO+OzsOGk_a+xj|z9(6~HuklIny2ZR?rU60O#oRBJ=;-loY z(UG zmz#9J$CRP9bLZ;UOr2vIUj~fpeZ+-&tq&!N+L|~!pOpbY=}{QE^c4db4AnhdZv3`A zHlAcS)}s=J;-@nC3!oW$|1H#7J&q@4!x_E&p<$r(4O+aAUXBxiLWdQlmna$5y#qIV z7g=h_0MEzr6D4*?aHwtlTrFrYs?#a{Lt^CSk6>bL9VTJTS`g!DX6gWRua70gPF+$e z5MqmKUEFiNz3LhK9KwKx2tx_{Va0!o1evbIMq3h|S z4e}3t{C59AMEB!-Ln9+OT*c~tRG&?REYbk(x$Qd_H`J(75P9MjcnAN-ljee#`PLQ|>tFggh36;XD0D-* zD#gE7fKP%$-gt$Y#9fWOMFr^l;?o`7`SoB9MlJ_-nz;U=zH19^`(FFQkif*6?-BV1 zj8Ube*6I*Kn`}z1F2LTfN0pLn)AkRYkjwl0V{~+#$6wEeAUMa-KN{d|HDC&J(cR=% z!r3L(OK#udZ|}8AzIAca;Ic;s^0BiB<(ni#GfTxdfRVoQtFY{d$?E#E6(ne=Q|tws z-mP-Oj3L}(wyA!%?T=v`nq|3G7J9@GO7j&9;dZmNwN;|hJY@twi$Ng{MJkree8Qvk z%WE6M>^y+Z3c-1E5MEon9bJ5!j_b8&W8BPSonSGqi5d9V^!iary86!=4H`Jg&CSg= z;A+5P0p8)GJcGp|4EJSu{YUgA3ABLh(geEXH!QjY{{;g6ZhA}_x=*GY2wTtgTs%2c zCVP~yUxYD(=QSpp@{_G&6~3!Yv*ssjbOuhjSe$$-K1*K+P+qN&>SAv_V$y$q@k4aykt8)>|7Eu<>`O;XJyf)SrMz+G`$dt=zxCCqmkiaM zJu-v@>MO*h&bbMS;FlktPO7DY3fc{M`w{sDNHZ-pH9h66=V`s(Xild`VQFfVD7xmX zAfXQ^N@;>i49HVOqoXR!1!xdibr~7Jc+pwv=oYYH1kfnQ?W-1bKiHX?E`O$h-On*7 zIH{6d`b_*Eo}g`EZ|Bkdi56%w{QAWHS>|7A%Qv){um7-|?GRs;g#reOx4d!bBEk(f z*>TYTKYCqwx(9gj0s?nzbX0dU?a+p=!7qA5VEIhT}e_&r#AEidzq9@yz=;yMYrIsOVy0Nig3$Wp%X=P>E zM%P^p=aLUTO2Uh7pz=Ne6F#d4P2scs)V}kHQG$vr@$0E+;D}7^oOMxip&|Y|^PmQi z8Wc&4vAZMrxs^o!`|i3biIiFqQd8Z$i!$q#V7ji?@?Z-aNuXM7MZ0w_pPyx!|I@W2& zK6X+`NQAl3H|~aw0D_4o8DHpKMcJ0eYFM7yy7f*uxKhSng7Gz zu~L6(`Xdo_flu(F6b6ckk|U;FYPddH_fP(G6+R)Mw`yNRQ(bdUu`eX4QmNNY6~Vw= zCWx^2HNPPkzHQ{WCm;Za{Q_-``)3}VzElZ5@z z9HP&BORnr^j+0mUu?=V#B(~T9yNKvd6DUtyGL;rUGgCF?<85QJ^Xv~J*eZ<{{-JTg z(W@X*We7Xcsl+jmM#(A25rfEQM@&o%&f!}(SJ!Dozv1u>q)@|wm=hZ8l_d=hW1lOF z+Qvo&&=cpjS39j$G&!zLxXqw|XjA&nNn{zg=XZ6Q;BtS22b;oW)v+YeB>6r9hVDH- z*`L*Z64g;5{f7wuyG@0-Un!)DEL8)P^6|qA|EuB1w)={75|J_#*FJ}%P%|l9Hv>>; zU!8(1Ad+r)U} zcF$^(HLCy`Zg98RU^Bi7|MvUcV=V%n%RMg;Z`?4=(zEqths$SR&HBOn(D*56k`t(ZuT>3Y2JDR^PQT)} zo&vRC)0D@Qah~bAPzh+A^ijqv&@JP8mF$~Jt%YH+zIK<56M94~u=y6W9GpJNzJW8N z$IV{7wVfSjgX3y&T6#Jr;L&Sq1uLeSQi4V6K*0#WJt*lrpo9i-U=LgvA2e+4$|w27 z>>^2h(_~H^%C!E=xz=xFQ)hVNLDqXO^GOIm59-sKJK%KobwuRLB|>zn1+AT6x-~9z z(28HtK(0qqO)L?}$!Fy9Ow}?$<0CK&XluKd{Qh)51U2r7y4(~2U7q#oH?Q~aN54FC zRef(~mjHt~G+giZ z^_|gsmr>R1!7_Plv0?$?1ae z=k`fsoS@yOh9xyFb^?%(5e|kEb^P61I17c?^o<5|F7fi{!!c4X`6j_#fn_k5iFHL^N^rjEaT9KE;Im+oUps3;FhZJ?GWUy}SEsdN4@X(iG386yX7cNFfk z4;&Y5kBSc;8#xH|rHg1!FyR6j*n|M#bsA21I#v!3aAfj$TIKvB9{_OmKR>VnjlWh& z2HBDGOop{Cn3iWltM@)j^8z23L9d=A;i-`&=B7Y|jS+BpvfXJ^R?#4Dki*PQm>tgS z`bFO1Zu&rV<<`ZoU%xbsw%%4WB+yxU7^p?(*5*7}-{kMJy*$wmqOHy4`(M zeBH*X9;*jS7x#QXT|f1@K@=~flO2EX>dGI8$VpfTK;k$7Q3h~^xX?@3;?kO0=Vx}{ z`1~jAtOtqZU%GXp2j#dPzy;3$CLQZT1OUtGf^(y1n<)uSXfWe6=@&P8s6?>tRVDsg zvhI-!@En_c{ISW8ai!UpUL;5jQA9DF{15G>T2iHcS10`g5I~NXL{9cVl*kp3%JjJ7<)=+`Prhhg!2*30HoMl&QN_bUzr0IRV!QT%viZs|s} z<9zKMgv{|-qXCpE(wdeK8<;|(0O6m$L8L&F(4*C=GLZ*% zq)g!ArIv{ToHdUnue4z+G9>wU%DzE_P;n~-3)&m(*2R?mOHmTyV&}SA<}%+TA9Ot( zQ~{(p%De5Cm7;wm<)>lR)~i(BLn}1t;%dpPxIH?4ab+UHIDH6f>$aw*CcvQFPzB#) z)L1VXZ8bZ04GO%dwV6& z7qwmPv>bsM;H4xoXJB{^mu0LBD2&_PR#XN?SuMPy zn|K-q;MQ3h)}1P}(Npfi??8<91$d6#L6d7@!vma+SAZmY4xJsF-Fo_^E|AK^Q=1Ra z2CUjEYlU*}fNWACd$p%15qQQfyQI!t#tKFN6b8;hB@c4=Ng2I^sxh zGHTRzUexO6A18C&Sz@L$EurURkI@SDKQ3|E0v;v1#mLq1bB(j2HSDLCCh@%Fq zzc4lOc>nG^<4l2K^|+iGj6S-{hnc4X9?+p7^Lq1Hhdr?6oc;TN0~W`%5(GKXoT~%a z(h}YQ?5m&VKUH{PukFjbI zSSQ)Z>YP^ex@yU{9c?Zf6)OYZuO2D=UXdBpeEmUvpvZhip-~#kBaT{_2!WC3Raatl z&VJM#l>7Gn?duD&UMpVf6&P-;%>;^x68pd7l6l&)f;264*4@xnA7NpkQ63f+m-&~; z$&Q{4PuF0q)+&7~N-r11%-*~IQaV3&6m4;c6(2Vu2qF%fYSz=xhsoK7L>QIHDfx=g zZ}JS+>kR>$&a;*M89;G1FI4*Mp<%ZZvezlIb8}@~-9htFtuk%LwAhbjs#7{{K?%CC zRn)%w@Bpqo0NEUM+e7iUPgFFeeuKIt!Wx`xMC zW#0Q@93reO<;rWIhP0Adg|sIY03ukDJ3572GKUKK5M-I$XT0_&DPYG ztc1yF1smh+ylvzez7>D>^#&Q6As(rMPfx3u>zZwlhkr#SLZ+`bw7L1C%v$uFe&F0o z`hIRnX7m-+Vw&r>Dn*wpR|gD2uq|MYR6;QjD4#t}cT9fH&r=o`7hA~W4EI{(v8BBJ z^Qy%{B1?r>YO;lc-Y`*@k`vVNX?TUH_O|o`%#ZICJ{3wczJ7EoOTc_XN48CCDX|kv z;62dUG%5As`+bw|_pb{%=Ba^%NsbAoi^usN#2@u%XHfm56Cpfp6vL_x<=Trq zpv589vW> zWeA-xW-$pMS1`#43`rO5>Ya~pXM!>9EVem-Ay#C{WC{J2K+4NA{KZx5i=*hu2aeX1 z*KU?bz>{QXQ!10A>@qn^OUd;#@H$6q4%yG8f@u5qZ+D2WgYv`9`1OXq4PBrC{g;x0KJ7-6*|S?`3H*rtFo^UJp;zJM+eW zREC7}DjY6igbg`miJ0c2Q4049%L`K3)RTv>%u6ApjZI`iLc;8B80wA9t@+CFlZ~up zDX|~5*rZO991zpIa?R(@obmDTPoINY2wyxyOR4GjJL2A*m|mYEJhCs&iBQ;th!|t! z`!{+#g-_LG&zatA6tk`_k)2_q+6CE!`Z%iH6Fk-p#8!G+@C5n)MSJp1XvzJiWRg*} zm-#|zBLlEj=q#sUDhNdAt$l2UeMJ)M>ypwTF;$fnRIr_(?9;p;gsRH zrM|8H{F&*>ZW`^}$lWj%cv+~Hti(%AFuQyD!%;NFv_~hc(1Q*CyV0csOm09)gGWv$ zx3rW{I3>0A-K&W#k&P>OXHas8vp~M(%oj&PiNK7mYPlz*b;3vizEC9)V&D~C4LOor zJkQ?Ju_04H*su*`?1yCBKGxsx1JQh|m$phqX7|-dO%2n?isFnTogfW)JqxYS#2as-I87}7FhyWp5XSQnysZ`^coU8ZwXi(7q z!cCaP{qXNgoyPxl`|XUu)31NL&(Mdi@?@YOV(2X)weWN*{LN}5GL9s-6xVpn!F(P zJQ%IZvwb`}A?2K4r{)wZBp3lD3X&t3EiqxhcTrD-rSb#0;5O zY%}td4X5>Nb^QA*nwo^ksFama7={HEjF z|0XQTdUQn2dD$ACsN+DDs;5t>%r-1EAt0R|f%gHMR3U2f=%}8SIPwi?H!ialrScC| z#(*wG_+L=nZymBPf^eIKWuo16B%Kq5#W=UeX^ zZqU&gd|h4|9sMB@tda}KP^J(Qc|gR#p`=@&!H4yhXMy>?o?;B<>&bHE@MwDPJsevQ zB^pUWdPC_M6JqfXQ&>M&ruycD%~-9S!eSkDIP=q)Gnf%70>U$>*PD0|c0c@zIQ6SN zXq*RwRdya;-9OumeJCKBoleVPsQnscn1S35+p@Xc!wUC>7K zanv6?VcC(xgUb(wSH}AK8G>w~6{<~K+C9HXP3gRLFmPzY1#l@Yd6NUZ!lv28#=yn> zM;{7jXmLSNE9o6)zX<9&IuZbFyf`~eXvMFe8~bhykHEb3Dd8YW4)_4mWh~XxdRO`&H@=-h9jvhSRsV$B6Qh^vxtm5*{9``xSCAjZrsQ8Rs=^Hy@G9Qs}X? zoto>iHQB>?huB5FT)i^PHa7OCd_xx`t_OB?_q$lqSI5q=f|y)1=^E6Q_l}-e?%7lv zcTg$sw{k?+OfcCRe&jDmRZGV7$rdK7nfl35XaI#wWtw=XR5_J+$(-qYQ+f&H9*|b{ zdS7rv>C)~yo?-jqJ}}%WW8eES`1TX8DS}lR?HfqCjqhikB`2_a`-+MEEyCU3A z_5XMoi=dz!m&H~)25H|gR`s)%-F9I&`b&-^e}8|iK19;`XEFsf>&k-EYQd}BLZ^YmEu6v}_Y3(GO}WWMRtf#7iFq+dC_hEb^u9>B2~VXdj)wR|s1rFj z9{TzJYXK|?!$=?fG3;{iw&UCLsR*@BTvM5Fz)?_TEmOwS5{NWz>Mrq@DJonGo@qwm zzx&q2KFP*1yUD4&^4k1~@E0ZMF#1FGdxM{^mQK=U!~eX<44f|@WK^|O7Pj!7edv1E zA>Z1;$NA?$kSt5YAQ8L@jU>iI-6eQuJ^#yAeDTMS0S}wxn)7sA*>u}I>*9!zw!T`$ z<4gR-6cPjbIcuE9Qf772H$Bh8>>Gwi*c?;`sXeB7~FD846zf`Qawrz4z=DY%`sk^D>8SRR)t!(jBvmizuc~@IbNC;1<_IMb zN_YUP1c z?}^B_U-&tLj6sYQ^JR*6l;3zW^7N~J)oAy5FQ4x~m!&b|Y0ycH7svX$o;?LMyV@rGSAU;d%X zzOK6731oGfd4-F3k1yjt8uy<8bU`YF+LsMzB(m(fIwYIX>@Cf#aYCASCaFC+t>-7Nm?u%as@OpBpts2 zyKD7hqY8P_b7SMOM~@!GK9p7CjFS~81zOD+weCI#N(f!`qh_DQw*{scs({na7`m1z z$$4^m+6(R}F4TU$MyGJERYZ8gRg5w+GO`XIG^v=Ho-U<~ z34lt^1!1|wUP=+M_UK&s*BVNd?(f*%#u!Ji#?;FD5SOsR4(P?@L&p zn+}D@)k-*`e`&<1DYFQT2vIA@b0{mlPNfuf9~w!bWHGl)CFKeh2{A1ATd#vjMnSX6 z10NaDlPjoL(PDyoejCs0;m3ZY4^xzNCjQE!>>_gKR*?dxi$IcjuUTb{KQSWcW~ywljlQ%UD^a9F!!_pTPLf6zEzC09kNQmM9a z!Ru3m0o9ExL~!)9YNkCq>?n^}&+9)V{c68>SgiqR3?QD6kNPQ}Rl= zG?K$iUSOVOSt)U1_)s7OpjT|zF81iLBlHzHA&M*B@=2OiiGE2ktDv&(WIMj|v?4CT z8!Y1EC>(hyB*^H$7c36yFAdK4m2}12F)5MF^;~`2jVw5!OUTc9qH1>J)N)NRRH+h&PCD-FLqj~p^B&_I7&Pvs?%|{G7I1DL$(B$Zt2L z7>v$U$rg6PE*d!Ww%2xMRK`p^WcD3F zw{=^D9A_D`Cp$*to2pw4&e^*sPeVgRw0&v}yAu-FH z&#Fuxqzo2Jac~r#0jBW2toI)3dM9$}ddG`Ce&QR^zq2s_Vf3fUBkdQ#Gi)o71%%1gpr{*h@&(b z_d7&Y`hf`#GNSmKKtzuBbo!OqGl)F#`-wyn-oa4bYlNJ6_{U13iy9mxgiRK1JP($eCn7!?EZZZeR(W&_jK6{Kicq? z1iTVx!&_333YCt6qh1`8bN&8|otwxih#FE5z{@RFTc_3Fj5vPq9KRv$)qigjsZZ}Kx*Gh3@%I(KGIoA5~n@h{^_i!q|rC_hTq1l2@cU<=r8x5 zN#$u%-_cOHpZ5#Dxtc(qN^`UfUtLE{Q%?Ux@`;djE~@hRchpnVq>hd!;%bh*|zw&o~6#7$On1rKKpMw7;Qs0oO>f^Tt9s`*J7U#(R% z?4qL94?n9XhxLSh07b}XXcq)J()WWv{$x12b_@@FVNcoWzB0zuN?^TPv5ZKW49?{^0FxO5-PtfwBxGfp-@kb>a{S3$q{ym6MPw^ z?;;)j*5$y8Tj-vOInd`3B5cJmRR1dEnRp!PM25t${o5N6wJPctgA@LzrUNK)9(HGJ zwZX#biQ#f)?>&9PIEB@)F6G}t_g!b?TO9axSW8MphTXTG<11Co?}>X7ke^(uZ`NuW z;aiGeo|gK48IMLcI*IQa=&RZ1u5|Z_lkN+7Vk6~gJ-)siYs^)BgTb?{q`Az=8)f%u z#lM!q7mEWAoBR(~#?nbu2o^DJ#{>5C<*<5g6)HhZ zHe1xwY7|7F|HbCQ7^bK3-KZy=q^Pvi)UMr?%fq&ht&?46=bEO97{MZ&ze* z?k#l$<-jK8U}sy=lV^Y%f)m~{OnzW^fhT;8?g};1U&5xRM>1K)0?}7U#$ZnT;D`s< zUKE0Z@6S*kYDwIs>(oxlQ63T8^riNmamIth>sTfvVuCw8t}Jjx68O zg7H*;k!{aP4erI?HP0~~k1s15fA&x%yJO1D@Ke6K9B)z-)U2Q}%*H!%JpVw(i@%&}#Nz)u01gunviu@07HSIHn2BtDx zOOR%x^FsH{jZC(*9~+PjZ2ZfdPGDG-E@i4!#u?}n*~f*(tjZD7=T2-4fIk+rdut?+ zEJr9^@gYHG^*#9AFa*o5D2>!G@~96{(G%Sv5x8L-|1sr-VIiU=P(PG%!}RXL zQRLMdkWQK$?t|Q?w3Pz(6=8bF3V98fFHDXX%3{%$C*U!32!G1S zO=(&z+TTB3@025*#=_fS_#d}p{MLTH7<5pchvVCoMRdnu*x?wxS7U|V zv-H9VYON-RqGt}@!ds!-I|L;n;qZaOl{>?<$hpykgA}oe+rF9XJjzZB&N_9N${cZu z-;g1sgRkS;%dgBS$<`h&qHR|*Mp%(_^5px^ll#Zl_VThu{JE*CwGov&Lv~LLw1_$N zjKHdi)K_A`+vTEn{I|KVe^`hV1;N74&nzm16{(Qf$W?SqptxXyZHJ(z-{65;>7hGubYn+mJ(dPRmTP8pw(4h#2hzGHs=Vvc z%;W(Rz@(!#^j=pX$BRs%+h;TR%S z1-iC{gi#W5cuXM*8wFXTLM4xI?sB~3&CVEbTtWTkb2q(oHEY|`#HRm^UHMy20|n0y zdv4lf5*$g)wdk)W&p3zbtt*5%e(YOT>z%yFHtsKeDS2jV&WDi13gLq({YBu6$*Tqn zEg)8W9U<9TUXsy7#u(wJ)|L1T<$5^!Zl8ieUOx)f}HY|ZGn*yIl4MK)Uh>WibJbRNC} zR-?RzqFSEbi;HG4DJjrGpahTn%UCiX68Hz%M00Vf-OydZc=RFPb-9E_2P$g+mU6lU z5-q;yVp_jcp%hckhc0$}@mT1y;D4CmC9czaSty2~50H)?D3N02WT4UFuB1D?zPff;t;|2dG9AbyWri=>93^1(@iPH( z@g#QW^9m>2YrJ=Um7v75O*xH@3)a_)*{thMpIP?ZU4N;)0;y%x)P}NOCde)C!aA2v zV8Pt2W9aamA3CSkeMl*`)6A1Kg&)RYgvEpk10k_>jH+{DLeS|p_U>fqz+0zEnU1JYVVw6~F3&^L zzx^x(fSyOyj0H_zyA0qwKXDBB4j4yU z>X<^EglHKmcJ`>tfYbUCFT@u&EoEH+(kJw@Ca2*T+-`(?(N=A4^ER%Jl*KmshLO=- zbWEwv<@cE26MEKUs$@@IqXYWMbW-JfLO3>c@p8qamFKsZH;;9*vnORJxjn-@G25vH zStvPl9juKG(Djfn8Smkp;HrqaL%()^ReB_su23|E!u&cenJ)NS`-m_&{Z$2HpQ}`^0Ee6#JHO6J?7@n4Aw^F2v$^8P2`EQifXCQ34S4^$ett%@hwti z_g664NyZ>X$FJt~+=bCqkUz)Xbo9U-=zLEmpwK)TW;q6zYbHh#^7IjCOp$NJr^C-# zyjs~BQht%<;z3CBuBbTemf9GWnIJj7qNmcQ9aNVJX*5m*l^n26SKMqq?gCeE1>cGzPrHN?o4o9o9Fkcb&ujSa)jVpwi9rLp z#qN>X)!FLuD=G!&j@OuY{|(U)=p^&prF-_CKGca1k9=r3?1?GCy?VSKK&m&fQUCc@ zl`0)X6sdS7WoJL`rNfwc9_nx=#24iKcqcRTVl=;cl!_^NUA$#GjXMAs4|`q;*`+xh zxPHp(8?EiN&^?_!%qZIMk(B>gj|URfd#mRZPs7mAg7cl{X#jdfMO|LY5HNd-zWZUP z^aa$o>?wGRjEskUeb|eByVCC7-UE6Xz~0l>)dj=owmN6qg>niAVX5Z8TQtGxO`5LxLZH+12L-zr4Dkg=>yP*r-1sZz zp+204-+iQOo*8Lc*3|OHVpNOwmE9($smE-_4PV9fU5~`iN2Azoulxy-n2_3&VfQo` zfwg@^q?Y8TuUJA%7#Aara5)cJ`@M!MLpw$eM;c)Kau@9PWWK*;PElo%v+r z`};HuJ+1NqVlpz$nhp=%Oj_EXOL@^}G8eQg@U0!5(`+juBbb7u-+lE)qna^nABdqQ z7|sL_WpG{h8Nx_qn(w9RT>&2^`f<<&#mzF~P1igqm`+bm-GCT?X=W9IfJo@1_`-Ci zO4HZVcO42Xez@E-mUdbUPgvt4c*_I0OE=)MXWH{?0tVn(o_ifDaA=P?w_^g_eMb!a z=i^iX;o17%aG|L(Pl;}_8G*QY!tw@c3M~NvjDxi}&LU(F9FxH!YQsZg{xGE7C5x{6 zY-qkNlkoIU0X9}~C4uzOyh-D*h-@!S?e1?ZR2izFY=Rz%jCZagcxG*d^DV(*<2O&UN`O3MJX3;V_j2 zz?&C{1#s4QD>I)#^b9{^xFKS?tFYfbe$1UF({DfdLt|9Z**V$pbP8XS7LB@d!nCF;=l2eeOS+^+@&XWNT++oe=f&r-Zb$ za@Dl)a{k1|*#(MV?L)5ClNGl`|3GHkKgYgeVq$U~qKcJiz|ksJBU%F7dbxS(V!INU zIN7c0=I-tkEBj5N4?1BOB;>6bT@GYmmfY*h(_MF4`?H1JzZ0H z%E$jXl~ybjO^=CAZz&UCFK~oYo^?J3>%^hQPSV1VB1^W#4-tVsvk0nU_b$gGC5wT! zN@mH^D+t~8Ha4N5R^CTCM z6w_4{xzp|e;?ED_Zw@XSR>rChG1zBlh|f0$35B76iF;^FMfup9&Ok5TzrGfhwqlfy zhf=WW(2E73lt%Q3wJ@PI^a{JvF`^5J%4pn`f_?J(v`-1PUSTxZ2-{%ePrRVOIPIJk z?1cId5>&-folxDZy99p1fvm6=e+3M(6lAnOU1}10S#e;z0nwzZgfHT}X4B&2?NG2cGRQ-%*zDxLW1^ zmp0C>4!_YrtrNdMVSY83=+r`oig}>?_Gn_G3RHNMOnXHQ#7-N**l?M}p2j7>GhhUx zb;>QKC475HEEfUXkX?Q}mhr&OKZ*nfEv@*KWz7hAP&{-h_#yQl&X}L%-4{yH)C>&>?q z3@{E(d+g;pF`q0sTm4bwL>TtFc`7+TMZ#TD0wT#F3EYYfs8B;^+~3%Y&s4z=q#YJX z_pi_V`~}WXMd1Ceq-9>*l3GGNLu0?cb^gS8^}*D*ZkrG%qDc5*M)PQ8m2q*(C&B#{ zF$VsA7Jr8LuVaWz;PM;garJi`J}Y9ISiRi0QoRTDqn_gzHY$wA=pkZvA^#YaQBm! zhlf)Bc*%~}%p#}_H+>cUo5MHOt_Il%Y#s3chJ>4)mfdPFj!8&`j*bp@IO5pZ(Gdxv z2TasH1CGKwqwWe(7Yh*zvS9OhTU%UDkK*BSr1PVTo6F`a;8TeLBNsA0aB$48c^|H6 z|NZ-S4@3_D7C?M|1L%30F40$FiT|W�jg!OW%C_&Az|O_aYGx`TMcTZ_?9nM@nwb za?AhCCt9Vi2}?LJ_zk50xS^D7c8~SZyM#L=0RE6U!<#T(GS04imhG`=^7~a!ev8o= z)Oc+2t+J|hW!F5YbM9PJy8E6~pXHVG4TG|7q6vmf?~ZEA)tdYm&OQP!V;XKc)Uo!CO=B3m=pZ>j{I6g|CEr57?h8=VZos&ms+j917* zmo}VMvHJ6DnJLy(lO)Hs#_&)^;_Bl?YAF)PRXX~trbTq|&hHCPnX?{7WaSIy7Z{%` zdz;4!Eau{8$LjIW0i=lk@dTuWopS%^<^AGTPn^p^Xx7g@15dkJr)szAQ+RnlKfNoStsbRiBHa2Rpa}qRdl3Pb1X~X ze>gLrH-2L7v6SF=Z^~^@SE}+i@l+){&3$SP=WUHL-J_7|B7SB6H9eNq#qy&MgeqIr zm*|AKLIYa{xK5UIk8^%X0e2d3ol*PrHx@t6nF;}(pcrCeVs9{7Vb_((Y*ccP#?sc$ zuVs;FZ*N(VTwxDL<=jAYNQjA{fnbzzS@_$#JE`UYG68;mbgrd`stF7~&f8E_L`;nh z4f=;`TZaMr$I<~8lye4eqQv6Gf3IJkW)+Pm@i(@#4Cg&*=s0zPmz)#(90dd({n2%3 zvc=3qC1%3V| part.trim()); + return { + r: Number(parts[0]) / 255, + g: Number(parts[1]) / 255, + b: Number(parts[2]) / 255, + a: parts[3] == null ? 1 : Number(parts[3]) + }; + } + + const hex = String(value).trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i); + if (!hex) return null; + + let body = hex[1]; + if (body.length === 3) { + body = body.split("").map(char => char + char).join(""); + } + + return { + r: parseInt(body.slice(0, 2), 16) / 255, + g: parseInt(body.slice(2, 4), 16) / 255, + b: parseInt(body.slice(4, 6), 16) / 255, + a: body.length === 8 ? parseInt(body.slice(6, 8), 16) / 255 : 1 + }; +} + +function clamp01(value) { + return Math.max(0, Math.min(1, Number.isFinite(value) ? value : 1)); +} + +function parsePixels(value, fallback = 0) { + const parsed = parseFloat(value); + return Number.isFinite(parsed) ? parsed : fallback; +} + +function clampNumber(value, min, max, fallback = 0) { + const number = Number(value); + if (!Number.isFinite(number)) return fallback; + return Math.max(min, Math.min(max, number)); +} + +function parseZIndex(value) { + const parsed = parseInt(value, 10); + return Number.isFinite(parsed) ? parsed : 0; +} + +function intersectRects(a, b) { + if (!a || !b) return null; + const x1 = Math.max(a.x || 0, b.x || 0); + const y1 = Math.max(a.y || 0, b.y || 0); + const x2 = Math.min((a.x || 0) + (a.width || 0), (b.x || 0) + (b.width || 0)); + const y2 = Math.min((a.y || 0) + (a.height || 0), (b.y || 0) + (b.height || 0)); + if (x2 <= x1 || y2 <= y1) return null; + return { x: x1, y: y1, width: x2 - x1, height: y2 - y1 }; +} + +function overlapRatio(a, b) { + const intersection = intersectRects(a, b); + if (!intersection) return 0; + const area = Math.max(1, Math.min( + (a.width || 1) * (a.height || 1), + (b.width || 1) * (b.height || 1) + )); + return (intersection.width * intersection.height) / area; +} + +function clipsChildren(styles = {}) { + const overflow = `${styles.overflow || ""} ${styles.overflowX || ""} ${styles.overflowY || ""}`; + return /(hidden|clip|scroll|auto)/i.test(overflow); +} + +function getRenderRect(captureNode) { + const rect = captureNode?.rect; + const visible = captureNode?.visibleRect; + if (!rect) return null; + if (!visible) return rect; + + const rectArea = Math.max(1, (rect.width || 1) * (rect.height || 1)); + const visibleArea = Math.max(1, (visible.width || 1) * (visible.height || 1)); + const isHugeOverflow = rect.width > visible.width * 1.5 || rect.height > visible.height * 1.5 || rectArea > visibleArea * 2; + return captureNode.clipped && isHugeOverflow ? visible : rect; +} + +function rectsDiffer(a, b, tolerance = 0.5) { + if (!a || !b) return false; + return Math.abs((a.x || 0) - (b.x || 0)) > tolerance || + Math.abs((a.y || 0) - (b.y || 0)) > tolerance || + Math.abs((a.width || 0) - (b.width || 0)) > tolerance || + Math.abs((a.height || 0) - (b.height || 0)) > tolerance; +} + +function shouldUseClipWrapper(captureNode) { + if (!captureNode || captureNode.type === "TEXT") return false; + if (!captureNode.rect || !captureNode.visibleRect) return false; + if (!rectsDiffer(captureNode.rect, captureNode.visibleRect)) return false; + return Boolean(captureNode.clipped || hasImageFill(captureNode) || captureNode.backgroundImages?.length || captureNode.type === "RECTANGLE"); +} + +function paintFromBackgroundImage(value) { + if (!value || !String(value).includes("gradient")) return null; + const colors = String(value).match(/rgba?\([^)]+\)|#[0-9a-f]{3,8}/gi); + if (!colors?.length) return null; + const stops = colors.map((color, index) => { + const paint = rgbToPaint(color, null); + if (!paint) return null; + return { + position: colors.length === 1 ? 0 : index / (colors.length - 1), + color: { + ...paint.color, + a: paint.opacity == null ? 1 : paint.opacity + } + }; + }).filter(Boolean); + + if (stops.length < 2) { + return rgbToPaint(colors[0], null); + } + + return { + type: "GRADIENT_LINEAR", + gradientStops: stops, + gradientTransform: [ + [1, 0, 0], + [0, 1, 0] + ] + }; +} + +function parseBoxShadow(value, scale) { + if (!value || value === "none") return null; + const colorMatch = String(value).match(/rgba?\([^)]+\)|#[0-9a-f]{3,8}/i); + const color = rgbToPaint(colorMatch?.[0] || "rgba(0,0,0,.18)", { r: 0, g: 0, b: 0, a: 0.18 }); + const numericPart = String(value).replace(/rgba?\([^)]+\)|#[0-9a-f]{3,8}/ig, ""); + const numbers = numericPart.match(/-?\d*\.?\d+px/g)?.map(parseFloat) || []; + if (!numbers.length) return null; + + return { + type: "DROP_SHADOW", + color: { + ...color.color, + a: color.opacity == null ? 1 : color.opacity + }, + offset: { + x: (numbers[0] || 0) * scale, + y: (numbers[1] || 0) * scale + }, + radius: Math.max(0, (numbers[2] || 0) * scale), + spread: (numbers[3] || 0) * scale, + visible: true, + blendMode: "NORMAL" + }; +} + +function parseDropShadowFilter(value, scale) { + if (!value || value === "none") return null; + const match = String(value).match(/drop-shadow\(([^)]+)\)/i); + if (!match) return null; + return parseBoxShadow(match[1], scale); +} + +function setSize(node, width, height) { + const safeWidth = Math.max(1, Math.round(width || 1)); + const safeHeight = Math.max(1, Math.round(height || 1)); + if (typeof node.resize === "function") { + node.resize(safeWidth, safeHeight); + } else { + node.width = safeWidth; + node.height = safeHeight; + } +} + +function setPosition(node, rect, parentRect, scale) { + node.x = Math.round(((rect?.x || 0) - (parentRect?.x || 0)) * scale); + node.y = Math.round(((rect?.y || 0) - (parentRect?.y || 0)) * scale); + setSize(node, (rect?.width || 1) * scale, (rect?.height || 1) * scale); +} + +function applyTransform(node, captureNode) { + const transform = String(captureNode.styles?.transform || ""); + if (!transform || transform === "none" || !("rotation" in node)) return; + + const rotate = transform.match(/rotate\((-?\d*\.?\d+)deg\)/i); + if (rotate) { + node.rotation = Number(rotate[1]) || 0; + return; + } + + const matrix = transform.match(/matrix\(([^)]+)\)/i); + if (!matrix) return; + const parts = matrix[1].split(",").map(part => Number(part.trim())); + if (parts.length < 4 || parts.some(value => !Number.isFinite(value))) return; + const angle = Math.atan2(parts[1], parts[0]) * 180 / Math.PI; + const hasRotation = Math.abs(angle) > 0.1 && Math.abs(angle) < 89.9; + const hasSkew = Math.abs(parts[1]) > 0.001 || Math.abs(parts[2]) > 0.001; + if (hasRotation && hasSkew) { + node.rotation = angle; + } +} + +function mapPrimaryAxisAlign(value) { + const normalized = String(value || "").toLowerCase(); + if (normalized.includes("space-between")) return "SPACE_BETWEEN"; + if (normalized.includes("center")) return "CENTER"; + if (normalized.includes("end") || normalized.includes("right") || normalized.includes("bottom")) return "MAX"; + return "MIN"; +} + +function mapCounterAxisAlign(value) { + const normalized = String(value || "").toLowerCase(); + if (normalized.includes("center")) return "CENTER"; + if (normalized.includes("end") || normalized.includes("right") || normalized.includes("bottom")) return "MAX"; + if (normalized.includes("stretch")) return "MIN"; + return "MIN"; +} + +function trySetLayoutProperty(node, key, value) { + try { + if (key in node) { + node[key] = value; + return true; + } + } catch { + // Pixso/Figma API compatibility differs between editor versions. + } + return false; +} + +function applyAutoLayout(node, captureNode, scale) { + const layout = captureNode?.layout; + if (!layout || captureNode.type === "TEXT") return false; + if (layout.type !== "flex" && layout.type !== "inferred" && layout.type !== "grid") return false; + + const direction = String(layout.direction || "").toLowerCase(); + const isGrid = layout.type === "grid"; + const isColumn = !isGrid && direction.includes("column"); + let applied = false; + + applied = trySetLayoutProperty(node, "layoutMode", isColumn ? "VERTICAL" : "HORIZONTAL") || applied; + applied = trySetLayoutProperty(node, "primaryAxisAlignItems", mapPrimaryAxisAlign(layout.justifyContent)) || applied; + applied = trySetLayoutProperty(node, "counterAxisAlignItems", mapCounterAxisAlign(layout.alignItems)) || applied; + applied = trySetLayoutProperty(node, "primaryAxisSizingMode", "FIXED") || applied; + applied = trySetLayoutProperty(node, "counterAxisSizingMode", "FIXED") || applied; + + const itemSpacing = isColumn + ? layout.rowGap || layout.gap + : layout.columnGap || layout.gap; + applied = trySetLayoutProperty(node, "itemSpacing", Math.round(clampNumber(itemSpacing, 0, 400, 0) * scale)) || applied; + + const padding = layout.padding || {}; + applied = trySetLayoutProperty(node, "paddingTop", Math.round(clampNumber(padding.top, 0, 400, 0) * scale)) || applied; + applied = trySetLayoutProperty(node, "paddingRight", Math.round(clampNumber(padding.right, 0, 400, 0) * scale)) || applied; + applied = trySetLayoutProperty(node, "paddingBottom", Math.round(clampNumber(padding.bottom, 0, 400, 0) * scale)) || applied; + applied = trySetLayoutProperty(node, "paddingLeft", Math.round(clampNumber(padding.left, 0, 400, 0) * scale)) || applied; + + if (isGrid || String(layout.wrap || "").toLowerCase().includes("wrap")) { + applied = trySetLayoutProperty(node, "layoutWrap", "WRAP") || applied; + applied = trySetLayoutProperty(node, "counterAxisSpacing", Math.round(clampNumber(layout.rowGap || layout.gap, 0, 400, 0) * scale)) || applied; + } + + if (typeof node.setPluginData === "function") { + try { + node.setPluginData("webToPixsoLayout", JSON.stringify(layout)); + if (captureNode.section) { + node.setPluginData("webToPixsoSection", String(captureNode.section)); + } + } catch { + // Layout metadata is a bonus; failing to store it should not block import. + } + } + + return applied; +} + +function getPage() { + return app.currentPage || app.state?.currentPage; +} + +async function loadDefaultFont() { + if (typeof app.loadFontAsync !== "function") return; + try { + await app.loadFontAsync(DEFAULT_FONT); + } catch { + try { + await app.loadFontAsync({ family: "Arial", style: "Regular" }); + } catch { + // Pixso may already have a default font loaded. + } + } +} + +function hasVisualStyle(captureNode) { + if (!captureNode || captureNode.type === "TEXT") return true; + const styles = captureNode.styles || {}; + const hasImage = Boolean(hasImageFill(captureNode) || captureNode.backgroundImages?.length); + const hasFill = Boolean( + shouldRenderBackgroundFill(captureNode) && + (hasVisibleColor(styles.backgroundColor) || hasCssBackgroundImage(styles)) + ); + const borderWidth = getBorderWidth(styles); + const meaningfulRadius = hasRadius(styles) && !isLargePlainLayoutWrapper(captureNode); + return hasImage || hasFill || borderWidth > 0 || hasShadow(styles) || meaningfulRadius; +} + +function shouldSkipImportNode(captureNode) { + const styles = captureNode?.styles || {}; + if ((captureNode?.tag === "::before" || captureNode?.tag === "::after") && + !captureNode.text && + !captureNode.src && + !captureNode.backgroundImages?.length) { + return true; + } + if ((captureNode?.tag === "::before" || captureNode?.tag === "::after") && + captureNode?.backgroundImages?.length && + styles.backgroundRepeat && + styles.backgroundRepeat !== "no-repeat") { + return true; + } + if (captureNode?.tag === "PICTURE" && + captureNode.src && + captureNode.children?.some(child => child.tag === "IMG" && child.src)) { + return true; + } + return false; +} + +function isRasterFallbackNode(captureNode) { + return captureNode?.tag === "RASTER_FALLBACK" || captureNode?.attributes?.["data-raster-fallback"] === "true"; +} + +function getRasterMode(captureNode) { + return captureNode?.rasterMode || captureNode?.attributes?.["data-raster-mode"] || ""; +} + +function getLayerGroup(captureNode) { + const explicit = captureNode?.layerGroup || captureNode?.attributes?.["data-layer-group"]; + const normalized = String(explicit || "").toLowerCase(); + if (normalized === "comparison" || normalized === "fallback") return "comparison"; + if (normalized === "text") return "text"; + if (normalized === "editable" || normalized === "element") return "editable"; + if (isRasterFallbackNode(captureNode)) return "comparison"; + if (captureNode?.type === "TEXT") return "text"; + return "editable"; +} + +function getLayerPriority(captureNode) { + const explicit = Number(captureNode?.layerPriority); + if (Number.isFinite(explicit)) return explicit; + const group = getLayerGroup(captureNode); + if (group === "comparison") return 0; + if (group === "text") return 200; + return 100; +} + +function hasImageFill(captureNode) { + if (!captureNode?.src) return false; + if (isRasterFallbackNode(captureNode)) return true; + return /^(IMG|PICTURE|VIDEO|CANVAS|SOURCE)$/i.test(captureNode.tag || ""); +} + +function hasVisibleColor(value) { + return Boolean(parseCssColor(value)); +} + +function isLightOpaqueColor(value) { + const color = parseCssColor(value); + return Boolean(color && color.a > 0.92 && color.r > 0.92 && color.g > 0.92 && color.b > 0.92); +} + +function getBorderWidth(styles = {}) { + return Math.max( + parsePixels(styles.borderTopWidth), + parsePixels(styles.borderRightWidth), + parsePixels(styles.borderBottomWidth), + parsePixels(styles.borderLeftWidth) + ); +} + +function hasRadius(styles = {}) { + return Boolean( + parsePixels(styles.borderTopLeftRadius) || + parsePixels(styles.borderTopRightRadius) || + parsePixels(styles.borderBottomRightRadius) || + parsePixels(styles.borderBottomLeftRadius) + ); +} + +function hasShadow(styles = {}) { + return Boolean(styles.boxShadow && styles.boxShadow !== "none") || + Boolean(styles.filter && /drop-shadow/i.test(styles.filter)); +} + +function hasCssBackgroundImage(styles = {}) { + return Boolean(styles.backgroundImage && styles.backgroundImage !== "none"); +} + +function isContainerTag(captureNode) { + return /^(HTML|BODY|DIV|SECTION|MAIN|ARTICLE|HEADER|NAV|FOOTER|ASIDE|UL|OL|LI|FORM)$/i.test(captureNode?.tag || ""); +} + +function getNodeArea(captureNode) { + const rect = getRenderRect(captureNode) || captureNode?.rect || {}; + return Math.max(0, rect.width || 0) * Math.max(0, rect.height || 0); +} + +function isLargePlainLayoutWrapper(captureNode) { + if (!captureNode || captureNode.type === "TEXT" || isRasterFallbackNode(captureNode)) return false; + if (!captureNode.children?.length || !isContainerTag(captureNode)) return false; + + const styles = captureNode.styles || {}; + if (hasImageFill(captureNode) || captureNode.backgroundImages?.length || hasCssBackgroundImage(styles)) return false; + if (!isLightOpaqueColor(styles.backgroundColor)) return false; + + const rect = getRenderRect(captureNode) || captureNode.rect || {}; + const clipWidth = captureNode.clipRect?.width || captureNode.visibleRect?.width || rect.width || 0; + const area = getNodeArea(captureNode); + const isWideSection = clipWidth > 0 && (rect.width || 0) >= clipWidth * 0.55 && (rect.height || 0) >= 96; + const isHugeContainer = area >= 180000; + if (!isWideSection && !isHugeContainer) return false; + + const hasDecor = getBorderWidth(styles) > 0 || hasShadow(styles) || hasRadius(styles); + return !hasDecor || area >= 300000; +} + +function shouldRenderBackgroundFill(captureNode) { + if (!captureNode || isRasterFallbackNode(captureNode)) return true; + if (captureNode.visualRole === "layout-wrapper" && isLargePlainLayoutWrapper(captureNode)) return false; + return !isLargePlainLayoutWrapper(captureNode); +} + +function createNodeForCapture(captureNode) { + if (captureNode.type === "TEXT") { + return app.createText(); + } + if (captureNode.type === "RECTANGLE" || hasImageFill(captureNode) || captureNode.backgroundImages?.length) { + return app.createRectangle(); + } + return app.createFrame(); +} + +function createNodeForGroupedCapture(captureNode) { + if (captureNode.type === "TEXT") { + return app.createText(); + } + const hasChildren = Boolean(captureNode.children?.length); + const isLeafMedia = hasImageFill(captureNode) && !hasChildren; + const isLeafImageBackground = captureNode.backgroundImages?.length && !hasChildren; + if (captureNode.type === "RECTANGLE" && (isLeafMedia || isLeafImageBackground)) { + return app.createRectangle(); + } + return app.createFrame(); +} + +function dataUrlToBytes(dataUrl) { + const value = String(dataUrl || ""); + const base64 = value.includes(",") ? value.split(",")[1] : value; + if (!base64) return null; + + if (typeof app.base64Decode === "function") { + return app.base64Decode(base64); + } + + if (typeof atob !== "function") { + return decodeBase64(base64); + } + + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let index = 0; index < binary.length; index += 1) { + bytes[index] = binary.charCodeAt(index); + } + return bytes; +} + +function decodeBase64(base64) { + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + const clean = String(base64).replace(/[\r\n\s=]/g, ""); + const bytes = []; + let buffer = 0; + let bits = 0; + + for (let index = 0; index < clean.length; index += 1) { + const value = chars.indexOf(clean[index]); + if (value < 0) continue; + buffer = (buffer << 6) | value; + bits += 6; + if (bits >= 8) { + bits -= 8; + bytes.push((buffer >> bits) & 0xff); + } + } + + return new Uint8Array(bytes); +} + +function normalizeUrl(url) { + if (!url) return ""; + try { + const parsed = new URL(url); + parsed.hash = ""; + return parsed.href; + } catch { + return String(url).split("#")[0]; + } +} + +function resolveAsset(assets, url) { + if (!assets || !url) return null; + if (assets[url]) return assets[url]; + + const normalized = normalizeUrl(url); + for (const [assetUrl, asset] of Object.entries(assets)) { + if (normalizeUrl(assetUrl) === normalized) { + return asset; + } + } + + return null; +} + +function createImagePaint(asset, stats, scaleMode = "FILL") { + if (!asset?.data || typeof app.createImage !== "function") return null; + try { + const bytes = dataUrlToBytes(asset.data); + if (!bytes) return null; + const image = app.createImage(bytes); + const imageHash = image.hash || image.imageHash || image; + if (!imageHash || typeof imageHash !== "string") { + throw new Error("Pixso 没有返回有效的 imageHash"); + } + if (stats) stats.imagesImported += 1; + return { type: "IMAGE", scaleMode, imageHash, opacity: 1 }; + } catch (error) { + console.warn("[Web to Pixso] Image fill failed", error); + if (stats) stats.imageFailures += 1; + return null; + } +} + +function getImageCandidates(captureNode) { + const styles = captureNode.styles || {}; + return [ + hasImageFill(captureNode) ? captureNode.src : null, + ...(captureNode.backgroundImages || []), + ...[ + styles.maskImage, + styles.webkitMaskImage + ].flatMap(value => { + if (!value || value === "none") return []; + const urls = []; + const re = /url\((["']?)(.*?)\1\)/g; + let match; + while ((match = re.exec(value))) { + if (match[2]) urls.push(match[2]); + } + return urls; + }) + ].filter(Boolean); +} + +function applyVisualStyles(node, captureNode, assets, stats, scale) { + const styles = captureNode.styles || {}; + const fills = []; + const background = rgbToPaint(styles.backgroundColor, null) || paintFromBackgroundImage(styles.backgroundImage); + if (background && shouldRenderBackgroundFill(captureNode)) { + fills.push(background); + } else if (background && stats) { + stats.transparentWrappers += 1; + } + + const imageUrls = getImageCandidates(captureNode); + if (imageUrls.length && stats) stats.imageCandidates += 1; + const imageScaleMode = /contain/i.test(styles.backgroundSize || styles.objectFit || "") ? "FIT" : "FILL"; + const imagePaint = imageUrls + .map(url => createImagePaint(resolveAsset(assets, url), stats, imageScaleMode)) + .find(Boolean); + if (imagePaint) { + fills.push(imagePaint); + } + + if (fills.length) { + node.fills = fills; + } else if ("fills" in node && captureNode.type !== "TEXT") { + node.fills = []; + } + + const borderWidth = Math.max( + parsePixels(styles.borderTopWidth), + parsePixels(styles.borderRightWidth), + parsePixels(styles.borderBottomWidth), + parsePixels(styles.borderLeftWidth) + ); + + if (borderWidth > 0 && styles.borderTopStyle !== "none") { + node.strokes = [rgbToPaint(styles.borderTopColor, { r: 0, g: 0, b: 0, a: 1 })]; + node.strokeWeight = Math.max(1, borderWidth * scale); + } + + const radius = Math.max( + parsePixels(styles.borderTopLeftRadius), + parsePixels(styles.borderTopRightRadius), + parsePixels(styles.borderBottomRightRadius), + parsePixels(styles.borderBottomLeftRadius) + ); + if ("cornerRadius" in node) { + node.cornerRadius = radius * scale; + } + + if ("opacity" in node) { + node.opacity = clamp01(Number(styles.opacity || 1)); + } + + const shadow = parseBoxShadow(styles.boxShadow, scale) || parseDropShadowFilter(styles.filter, scale); + if (shadow && "effects" in node) { + node.effects = [shadow]; + } + + if ("clipsContent" in node) { + node.clipsContent = clipsChildren(styles); + } +} + +function applyTextStyles(node, captureNode, scale) { + const styles = captureNode.styles || {}; + const color = rgbToPaint(styles.color, { r: 0, g: 0, b: 0, a: 1 }); + if ("textAutoResize" in node) { + node.textAutoResize = "NONE"; + } + node.characters = captureNode.text || ""; + node.fontSize = Math.max(1, parsePixels(styles.fontSize, 14) * scale); + node.fills = [color]; + if ("fontWeight" in node) { + node.fontWeight = styles.fontWeight || "normal"; + } + + if ("textAlignHorizontal" in node) { + const align = String(styles.textAlign || "left").toUpperCase(); + node.textAlignHorizontal = align === "CENTER" || align === "RIGHT" || align === "JUSTIFY" + ? (align === "JUSTIFY" ? "JUSTIFIED" : align) + : "LEFT"; + } + + if ("lineHeight" in node) { + const lineHeight = parsePixels(styles.lineHeight); + if (lineHeight > 0) { + node.lineHeight = { value: lineHeight * scale, unit: "PIXELS" }; + } + } + + if ("letterSpacing" in node) { + const letterSpacing = parsePixels(styles.letterSpacing); + if (letterSpacing) { + node.letterSpacing = { value: letterSpacing * scale, unit: "PIXELS" }; + } + } + + const decoration = String(styles.textDecorationLine || styles.textDecoration || ""); + if ("textDecoration" in node) { + if (/line-through/i.test(decoration)) { + node.textDecoration = "STRIKETHROUGH"; + } else if (/underline/i.test(decoration)) { + node.textDecoration = "UNDERLINE"; + } + } +} + +function expandTextBounds(node, captureNode, rect, scale) { + if (!rect || typeof node.resize !== "function") return; + const fontSize = parsePixels(captureNode.styles?.fontSize, 14) * scale; + const widthPadding = Math.max(4, Math.min(14, fontSize * 0.45)); + const heightPadding = Math.max(2, Math.min(8, fontSize * 0.25)); + setSize(node, rect.width * scale + widthPadding, rect.height * scale + heightPadding); +} + +function getNodeIdentityText(captureNode) { + return [ + captureNode?.tag, + captureNode?.name, + captureNode?.attributes?.id, + captureNode?.attributes?.class, + captureNode?.attributes?.role + ].filter(Boolean).join(" "); +} + +function hasLayoutSignal(captureNode) { + const layout = captureNode?.layout; + if (!layout) return false; + if (layout.type === "flex" || layout.type === "grid") return true; + if (layout.type === "inferred" && layout.confidence >= 0.7) return true; + return false; +} + +function isHighValueLayoutContainer(captureNode) { + if (!captureNode || captureNode.type === "TEXT") return false; + if (isRasterFallbackNode(captureNode)) return false; + if (!captureNode.rect || !captureNode.children?.length) return false; + if (!hasLayoutSignal(captureNode)) return false; + if (/^(HTML|BODY)$/i.test(captureNode.tag || "")) return false; + + const rect = getRenderRect(captureNode) || captureNode.rect; + if (!rect || rect.width < 24 || rect.height < 16) return false; + + const identity = getNodeIdentityText(captureNode); + const semanticMatch = /header|nav|navigation|navbar|menu|toolbar|tabs|actions|buttons|button-group|btns|grid|cards|card-list|product|goods|footer|links|columns|list|row|form|search/i.test(identity); + const tagMatch = /^(HEADER|NAV|FOOTER|UL|OL|FORM)$/i.test(captureNode.tag || ""); + const layout = captureNode.layout || {}; + const childCount = layout.childCount || captureNode.children.length; + const isReasonableFlex = layout.type === "flex" && childCount >= 2 && childCount <= 18 && rect.height <= 480; + const isReasonableGrid = layout.type === "grid" && childCount >= 2 && childCount <= 60; + const isFooterColumns = /footer/i.test(identity) && childCount >= 2; + + return tagMatch || semanticMatch || isReasonableFlex || isReasonableGrid || isFooterColumns; +} + +function markSubtreeIds(captureNode, ids, options = {}) { + if (!captureNode) return ids; + const includeText = options.includeText === true; + if (captureNode.id && (includeText || getLayerGroup(captureNode) !== "text")) { + ids.add(captureNode.id); + } + for (const child of captureNode.children || []) { + markSubtreeIds(child, ids, options); + } + return ids; +} + +function collectLayoutRoots(captureNode, output = [], state = { order: 0 }, insideLayout = false) { + if (!captureNode) return output; + captureNode.__layoutOrder = state.order; + state.order += 1; + + const isCandidate = isHighValueLayoutContainer(captureNode); + if (isCandidate && !insideLayout) { + output.push(captureNode); + return output; + } + + for (const child of captureNode.children || []) { + collectLayoutRoots(child, output, state, insideLayout || isCandidate); + } + return output; +} + +function sortLayoutRoots(nodes) { + return nodes.sort((a, b) => { + const ar = getRenderRect(a) || a.rect || {}; + const br = getRenderRect(b) || b.rect || {}; + const ya = ar.y || 0; + const yb = br.y || 0; + if (Math.abs(ya - yb) > 8) return ya - yb; + const xa = ar.x || 0; + const xb = br.x || 0; + if (Math.abs(xa - xb) > 8) return xa - xb; + return (a.__layoutOrder || 0) - (b.__layoutOrder || 0); + }); +} + +function shouldRenderGroupedNode(captureNode) { + if (!captureNode) return false; + if (shouldSkipImportNode(captureNode)) return false; + if (captureNode.type === "TEXT") return true; + if (isRasterFallbackNode(captureNode)) return false; + if (hasVisualStyle(captureNode)) return true; + if (captureNode.children?.length) return true; + return false; +} + +function getLayoutGroupName(captureNode, depth) { + const base = captureNode.name || captureNode.tag || "Group"; + if (depth !== 0) return base; + const section = String(captureNode.section || "").toLowerCase(); + const sectionLabel = section + ? section.charAt(0).toUpperCase() + section.slice(1) + : "Module"; + const layoutType = captureNode.layout?.type ? ` ${captureNode.layout.type}` : ""; + return `Layout - ${sectionLabel}${layoutType} - ${base}`; +} + +function compareVisualRowMajor(a, b) { + const ar = getRenderRect(a) || a.rect || {}; + const br = getRenderRect(b) || b.rect || {}; + const ay = ar.y || 0; + const by = br.y || 0; + if (Math.abs(ay - by) > 8) return ay - by; + const ax = ar.x || 0; + const bx = br.x || 0; + if (Math.abs(ax - bx) > 8) return ax - bx; + return 0; +} + +function compareVisualColumnMajor(a, b) { + const ar = getRenderRect(a) || a.rect || {}; + const br = getRenderRect(b) || b.rect || {}; + const ax = ar.x || 0; + const bx = br.x || 0; + if (Math.abs(ax - bx) > 8) return ax - bx; + const ay = ar.y || 0; + const by = br.y || 0; + if (Math.abs(ay - by) > 8) return ay - by; + return 0; +} + +function getOrderedLayoutChildren(captureNode) { + const children = [...(captureNode.children || [])]; + const layout = captureNode.layout || {}; + if (!children.length || !layout.type) return children; + if (layout.type === "grid") return children.sort(compareVisualRowMajor); + const direction = String(layout.direction || "").toLowerCase(); + if (direction.includes("column")) { + return children.sort((a, b) => compareVisualColumnMajor(a, b) || compareVisualRowMajor(a, b)); + } + return children.sort((a, b) => compareVisualRowMajor(a, b) || compareVisualColumnMajor(a, b)); +} + +async function renderGroupedSubtree(captureNode, parent, parentRect, assets, stats, scale, depth = 0) { + if (!shouldRenderGroupedNode(captureNode)) return null; + if (getLayerGroup(captureNode) === "text") return null; + const renderRect = getRenderRect(captureNode); + if (!renderRect || renderRect.width <= 0 || renderRect.height <= 0) return null; + + const node = createNodeForGroupedCapture(captureNode); + node.name = getLayoutGroupName(captureNode, depth); + setPosition(node, renderRect, parentRect, scale); + + if (captureNode.type === "TEXT") { + applyTextStyles(node, captureNode, scale); + expandTextBounds(node, captureNode, renderRect, scale); + } else { + applyVisualStyles(node, captureNode, assets, stats, scale); + if (applyAutoLayout(node, captureNode, scale) && stats) { + stats.layoutFrames += 1; + } + } + applyTransform(node, captureNode); + + parent.appendChild(node); + stats.nodesCreated += 1; + if (depth === 0) { + stats.layoutGroups += 1; + } + + const canContainChildren = typeof node.appendChild === "function" && captureNode.children?.length; + if (!canContainChildren) return node; + + for (const child of getOrderedLayoutChildren(captureNode)) { + try { + await renderGroupedSubtree(child, node, renderRect, assets, stats, scale, depth + 1); + } catch (error) { + console.warn("[Web to Pixso] Grouped layer import skipped", error); + stats.nodesSkipped += 1; + } + } + + return node; +} + +function collectRenderableNodes(captureNode, output = [], state = { order: 0 }) { + if (!captureNode) return output; + if ( + captureNode.tag !== "BODY" && + captureNode.tag !== "HTML" && + !shouldSkipImportNode(captureNode) && + hasVisualStyle(captureNode) + ) { + captureNode.__importOrder = state.order; + output.push(captureNode); + } + state.order += 1; + for (const child of captureNode.children || []) { + collectRenderableNodes(child, output, state); + } + return output; +} + +function sortRenderableNodes(nodes) { + return nodes.sort((a, b) => { + const pa = getLayerPriority(a); + const pb = getLayerPriority(b); + if (pa !== pb) return pa - pb; + + const za = parseZIndex(a.styles?.zIndex); + const zb = parseZIndex(b.styles?.zIndex); + if (za !== zb) return za - zb; + const ya = a.rect?.y || 0; + const yb = b.rect?.y || 0; + if (Math.abs(ya - yb) > 2000) return ya - yb; + return (a.__importOrder || 0) - (b.__importOrder || 0); + }); +} + +function createLayerFrame(name, width, height) { + const layer = app.createFrame(); + layer.name = name; + layer.x = 0; + layer.y = 0; + setSize(layer, width, height); + layer.fills = []; + if ("clipsContent" in layer) { + layer.clipsContent = true; + } + return layer; +} + +async function renderCaptureNode(captureNode, parent, rootRect, assets, stats, scale) { + const renderRect = getRenderRect(captureNode); + if (!renderRect) return null; + if (renderRect.width <= 0 || renderRect.height <= 0) return null; + + if (shouldUseClipWrapper(captureNode)) { + const wrapper = app.createFrame(); + wrapper.name = `${captureNode.name || captureNode.tag || "Layer"} clip`; + setPosition(wrapper, captureNode.visibleRect, rootRect, scale); + wrapper.fills = []; + if ("clipsContent" in wrapper) { + wrapper.clipsContent = true; + } + + const node = createNodeForCapture(captureNode); + node.name = captureNode.name || captureNode.tag || "Layer"; + setPosition(node, captureNode.rect, captureNode.visibleRect, scale); + applyVisualStyles(node, captureNode, assets, stats, scale); + if (applyAutoLayout(node, captureNode, scale) && stats) { + stats.layoutFrames += 1; + } + applyTransform(node, captureNode); + wrapper.appendChild(node); + parent.appendChild(wrapper); + + if (stats) { + stats.nodesCreated += 2; + stats.nodesClipped += 1; + } + return wrapper; + } + + const node = createNodeForCapture(captureNode); + node.name = captureNode.name || captureNode.tag || "Layer"; + setPosition(node, renderRect, rootRect, scale); + if (captureNode.clipped && stats) stats.nodesClipped += 1; + + if (captureNode.type === "TEXT") { + applyTextStyles(node, captureNode, scale); + expandTextBounds(node, captureNode, renderRect, scale); + } else { + applyVisualStyles(node, captureNode, assets, stats, scale); + if (applyAutoLayout(node, captureNode, scale) && stats) { + stats.layoutFrames += 1; + } + } + applyTransform(node, captureNode); + + parent.appendChild(node); + stats.nodesCreated += 1; + + return node; +} + +async function importCapture(data) { + if (!data || (data.format !== "pixso-design-capture" && data.schema !== "web-to-pixso-capture")) { + throw new Error("不是有效的 Web to Pixso 采集文件"); + } + + await loadDefaultFont(); + + const page = getPage(); + if (!page) { + throw new Error("没有找到当前 Pixso 页面"); + } + + const frame = app.createFrame(); + const sourceWidth = Math.max(data.source?.selection?.width || data.canvas?.width || data.source?.actualViewportWidth || data.source?.requestedViewportWidth || data.source?.viewport?.width || 1440, 1); + const scale = 1; + const width = Math.min(Math.max(sourceWidth, 1), 20000); + const height = Math.min(Math.max(data.canvas?.height || data.source?.selection?.height || data.source?.document?.height || 900, 1), 30000); + frame.name = data.source?.title || "Web Capture"; + frame.x = 0; + frame.y = 0; + setSize(frame, width, height); + frame.fills = [rgbToPaint(data.canvas?.backgroundColor, { r: 1, g: 1, b: 1, a: 1 })]; + if ("clipsContent" in frame) { + frame.clipsContent = true; + } + + page.appendChild(frame); + + const rootRect = { + x: data.canvas?.x || data.source?.selection?.x || 0, + y: data.canvas?.y || data.source?.selection?.y || 0, + width: sourceWidth, + height: data.canvas?.height || data.source?.selection?.height || data.source?.document?.height || 900 + }; + const stats = { + nodesCreated: 0, + imageCandidates: 0, + imagesImported: 0, + imageFailures: 0, + nodesSkipped: 0, + nodesClipped: 0, + layoutGroups: 0, + layoutFrames: 0, + transparentWrappers: 0 + }; + + const fallbackLayerName = `01 兜底截图层 / 对比底图-${Math.round(sourceWidth)}px`; + const fallbackLayer = createLayerFrame(fallbackLayerName, width, height); + const editableLayer = createLayerFrame("02 可编辑元素层", width, height); + const textLayer = createLayerFrame("03 文字编辑层", width, height); + frame.appendChild(fallbackLayer); + frame.appendChild(editableLayer); + frame.appendChild(textLayer); + + const consumedLayoutIds = new Set(); + if (data.nodes) { + const layoutRoots = sortLayoutRoots(collectLayoutRoots(data.nodes)); + for (const layoutRoot of layoutRoots) { + try { + await renderGroupedSubtree(layoutRoot, editableLayer, rootRect, data.assets || {}, stats, scale); + markSubtreeIds(layoutRoot, consumedLayoutIds); + } catch (error) { + console.warn("[Web to Pixso] Layout group import skipped", error); + stats.nodesSkipped += 1; + } + } + } + + if (data.nodes) { + const renderableNodes = sortRenderableNodes(collectRenderableNodes(data.nodes)); + for (const nodeData of renderableNodes) { + try { + if (!isRasterFallbackNode(nodeData) && consumedLayoutIds.has(nodeData.id)) { + continue; + } + const layerGroup = getLayerGroup(nodeData); + const parentLayer = layerGroup === "comparison" + ? fallbackLayer + : layerGroup === "text" + ? textLayer + : editableLayer; + await renderCaptureNode(nodeData, parentLayer, rootRect, data.assets || {}, stats, scale); + } catch (error) { + console.warn("[Web to Pixso] Layer import skipped", error); + stats.nodesSkipped += 1; + } + } + } + + if ("selection" in app) { + app.selection = [frame]; + } else if (app.state) { + app.state.currentSelection = [frame]; + } + + if (app.viewport?.scrollAndZoomIntoView) { + app.viewport.scrollAndZoomIntoView([frame]); + } else if (app.viewport?.zoomToFit) { + app.viewport.zoomToFit(); + } + + return { + nodeCount: data.diagnostics?.nodeCount || 0, + assetCount: data.diagnostics?.assetCount || 0, + importWidth: width, + ...stats + }; +} + +function postStatus(text, status = "info") { + app.ui?.postMessage?.({ text, status }); +} + +app.showUI(__html__, { width: PLUGIN_WIDTH, height: PLUGIN_HEIGHT }); + +app.ui.onmessage = async message => { + if (message?.type === "CLOSE") { + app.closePlugin?.(); + return; + } + + if (message?.type !== "IMPORT_CAPTURE") return; + + try { + postStatus("正在创建画板和图层...", "loading"); + const stats = await importCapture(message.data, message.options || {}); + const text = `导入完成:创建 ${stats.nodesCreated}/${stats.nodeCount} 层,布局组 ${stats.layoutGroups} 个,自动布局 ${stats.layoutFrames} 组,裁剪 ${stats.nodesClipped} 层,跳过 ${stats.nodesSkipped} 层,宽度 ${stats.importWidth}px,图片 ${stats.imagesImported}/${stats.imageCandidates}`; + postStatus(text, "success"); + notify(text, "success"); + } catch (error) { + const text = error.message || String(error); + postStatus(text, "error"); + notify(text, "error"); + } +}; diff --git a/web-to-pixso/pixso-plugin/manifest.json b/web-to-pixso/pixso-plugin/manifest.json new file mode 100644 index 0000000..38b6fcc --- /dev/null +++ b/web-to-pixso/pixso-plugin/manifest.json @@ -0,0 +1,19 @@ +{ + "identifier": "web-to-pixso", + "id": "web-to-pixso-local", + "name": "Web to Pixso", + "description": "Import a Web to Pixso capture JSON file as editable Pixso layers.", + "version": "1.1.1", + "api": "1.0.0", + "author": "大非", + "editorType": ["pixso", "preview"], + "main": "./main.js", + "ui": "./ui.html", + "icon": "./plugin-logo.png", + "menu": [ + { + "name": "导入网页采集文件", + "command": "import" + } + ] +} diff --git a/web-to-pixso/pixso-plugin/plugin-logo.png b/web-to-pixso/pixso-plugin/plugin-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..73f9beacc95795bef52ca5a16c1ee5cb32fcb1fd GIT binary patch literal 115230 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�jg!OW%C_&Az|O_aYGx`TMcTZ_?9nM@nwb za?AhCCt9Vi2}?LJ_zk50xS^D7c8~SZyM#L=0RE6U!<#T(GS04imhG`=^7~a!ev8o= z)Oc+2t+J|hW!F5YbM9PJy8E6~pXHVG4TG|7q6vmf?~ZEA)tdYm&OQP!V;XKc)Uo!CO=B3m=pZ>j{I6g|CEr57?h8=VZos&ms+j917* zmo}VMvHJ6DnJLy(lO)Hs#_&)^;_Bl?YAF)PRXX~trbTq|&hHCPnX?{7WaSIy7Z{%` zdz;4!Eau{8$LjIW0i=lk@dTuWopS%^<^AGTPn^p^Xx7g@15dkJr)szAQ+RnlKfNoStsbRiBHa2Rpa}qRdl3Pb1X~X ze>gLrH-2L7v6SF=Z^~^@SE}+i@l+){&3$SP=WUHL-J_7|B7SB6H9eNq#qy&MgeqIr zm*|AKLIYa{xK5UIk8^%X0e2d3ol*PrHx@t6nF;}(pcrCeVs9{7Vb_((Y*ccP#?sc$ zuVs;FZ*N(VTwxDL<=jAYNQjA{fnbzzS@_$#JE`UYG68;mbgrd`stF7~&f8E_L`;nh z4f=;`TZaMr$I<~8lye4eqQv6Gf3IJkW)+Pm@i(@#4Cg&*=s0zPmz)#(90dd({n2%3 zvc=3qC1%3V| + + + + + + + +
+
+
+ + Web to Pixso + v1.1.1 +
+
+ +
+ + + + +
+ + +

导入后会创建一个以网页标题命名的画板,并尽量还原文本、图片、背景、边框和圆角。

+
+ 使用说明 +
+ + +
+ + + + diff --git a/web-to-pixso/popup-panel.js b/web-to-pixso/popup-panel.js new file mode 100644 index 0000000..4096987 --- /dev/null +++ b/web-to-pixso/popup-panel.js @@ -0,0 +1,521 @@ +(function () { + "use strict"; + + const ROOT_ID = "__web_to_pixso_panel_root__"; + const SETTINGS_KEY = "webToPixsoSettings"; + const MIN_CAPTURE_WIDTH = 320; + const MAX_CAPTURE_WIDTH = 3840; + const DEFAULT_SETTINGS = { + useProxy: false, + concurrency: "8", + captureMode: "mixed", + captureWidth: null + }; + + function normalizeCaptureWidth(value, fallback = null) { + const number = Number.parseInt(String(value || "").replace(/\D+/g, ""), 10); + if (!Number.isFinite(number)) return fallback; + return Math.max(MIN_CAPTURE_WIDTH, Math.min(MAX_CAPTURE_WIDTH, number)); + } + + function normalizeSettings(value = {}) { + const concurrency = String(value.concurrency || DEFAULT_SETTINGS.concurrency); + return { + useProxy: Boolean(value.useProxy), + concurrency: ["4", "6", "8", "10", "12", "16", "20", "infinite"].includes(concurrency) + ? concurrency + : DEFAULT_SETTINGS.concurrency, + captureMode: value.captureMode === "editable" ? "editable" : "mixed", + captureWidth: normalizeCaptureWidth(value.captureWidth, null) + }; + } + + function css() { + return ` + :host { + all: initial; + color-scheme: light; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; + } + .backdrop { + background: transparent; + inset: 0; + pointer-events: none; + position: fixed; + z-index: 2147483647; + } + .panel { + background: #fff; + border: 1px solid rgba(10, 10, 18, 0.14); + border-radius: 22px; + box-shadow: 0 18px 46px rgba(10, 10, 18, 0.18); + box-sizing: border-box; + color: #1a1a2e; + overflow: hidden; + pointer-events: auto; + position: fixed; + right: 28px; + top: 24px; + width: 320px; + } + .header { + align-items: center; + border-bottom: 1px solid #f0f0f0; + display: flex; + justify-content: space-between; + padding: 16px 20px 15px; + } + .logo-title { + align-items: center; + display: flex; + gap: 10px; + } + .logo { + border-radius: 10px; + box-shadow: 0 4px 12px rgba(10, 10, 18, 0.12); + display: block; + height: 28px; + object-fit: cover; + width: 28px; + } + .title { + color: #1a1a2e; + font-size: 16px; + font-weight: 650; + line-height: 1; + } + .version-badge { + background: #f2f4ff; + border: 1px solid #dfe5ff; + border-radius: 999px; + color: #2450ff; + font-size: 10px; + font-weight: 600; + line-height: 1; + padding: 3px 6px; + white-space: nowrap; + } + button, select, input { + font: inherit; + } + .close-btn { + align-items: center; + background: transparent; + border: 0; + border-radius: 12px; + color: #999; + cursor: pointer; + display: flex; + font-size: 22px; + height: 28px; + justify-content: center; + line-height: 1; + transition: background 0.2s, color 0.2s; + width: 28px; + } + .close-btn:hover { + background: #f4f4f6; + color: #666; + } + .content { + padding: 20px; + } + .setting-row { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 16px; + } + .setting-label { + color: #1a1a2e; + font-size: 14px; + } + .setting-select { + appearance: none; + background: #fff; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); + background-position: right 10px center; + background-repeat: no-repeat; + border: 1px solid #e4e4e4; + border-radius: 12px; + color: #1a1a2e; + cursor: pointer; + font-size: 14px; + min-width: 80px; + outline: none; + padding: 8px 30px 8px 13px; + } + .mode-select { + min-width: 116px; + } + .toggle-switch { + display: inline-block; + height: 26px; + position: relative; + width: 48px; + } + .toggle-switch input { + height: 0; + opacity: 0; + width: 0; + } + .toggle-slider { + background-color: #e4e4e4; + border-radius: 999px; + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: 0.3s; + } + .toggle-slider::before { + background-color: #fff; + border-radius: 50%; + bottom: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); + content: ""; + height: 20px; + left: 3px; + position: absolute; + transition: 0.3s; + width: 20px; + } + input:checked + .toggle-slider { + background-color: #1a1a2e; + } + input:checked + .toggle-slider::before { + transform: translateX(22px); + } + .width-input-wrap { + align-items: center; + background: #fff; + border: 1px solid #e4e4e4; + border-radius: 12px; + display: flex; + height: 36px; + min-width: 116px; + padding: 0 10px 0 12px; + } + .width-input { + background: transparent; + border: 0; + color: #1a1a2e; + font-size: 14px; + min-width: 0; + outline: none; + text-align: right; + width: 68px; + } + .width-input.invalid { + color: #ef4444; + } + .width-unit { + color: #999; + font-size: 12px; + margin-left: 5px; + } + .description { + color: #999; + font-size: 12px; + line-height: 1.6; + margin-bottom: 20px; + } + .capture-btn, + .select-btn { + border: 0; + border-radius: 12px; + cursor: pointer; + font-size: 15px; + font-weight: 600; + padding: 14px 24px; + transition: background 0.2s, transform 0.2s; + width: 100%; + } + .capture-btn { + background: #1a1a2e; + color: #fff; + } + .capture-btn:hover { + background: #2d2d44; + transform: translateY(-1px); + } + .select-btn { + background: #f4f4f6; + color: #1a1a2e; + margin-top: 10px; + } + .select-btn:hover { + background: #ececf1; + transform: translateY(-1px); + } + .capture-btn:disabled, + .select-btn:disabled { + cursor: not-allowed; + opacity: 0.6; + transform: none; + } + .capture-btn.success { + background: #10b981; + } + .capture-btn.error { + background: #ef4444; + } + .status { + margin-top: 16px; + padding: 12px 0 0; + } + .progress-bar { + background: #f0f0f0; + border-radius: 999px; + height: 4px; + margin-bottom: 8px; + overflow: hidden; + } + .progress-fill { + background: linear-gradient(90deg, #00d2ff, #7c3aed); + border-radius: 999px; + height: 100%; + transition: width 0.3s ease; + width: 0; + } + .status-text { + color: #666; + font-size: 12px; + } + .help-link { + align-items: center; + border: 1px solid #e6e8f2; + border-radius: 12px; + color: #2450ff; + display: flex; + font-size: 12px; + font-weight: 600; + justify-content: center; + margin-top: 16px; + padding: 10px 12px; + text-decoration: none; + transition: background 0.18s, border-color 0.18s, color 0.18s; + width: 100%; + } + .help-link:hover { + background: #f6f8ff; + border-color: #dfe5ff; + } + .footer { + align-items: center; + background: #fff; + border-top: 1px solid #f0f0f0; + color: #666; + display: flex; + font-size: 12px; + gap: 8px; + justify-content: space-between; + padding: 12px 20px; + } + .support-email { + color: #888; + font-size: 10px; + line-height: 1.35; + min-width: 0; + text-align: right; + text-decoration: none; + } + .support-email:hover { + color: #2450ff; + } + `; + } + + function panelHtml() { + return ` +
+
+
+
+ + Web to Pixso + v1.1.1 +
+ +
+
+
+ 采集模式 + +
+
+ 跨域图片代理模式 + +
+
+ 页面采集宽度 + +
+
+ 图片采集并发 + +
+

页面采集宽度默认使用当前窗口宽度,可输入 320-3840px 触发响应式布局后采集。

+ + + + 使用说明 +
+ +
+
+ `; + } + + function getField(root, name) { + return root.shadowRoot.querySelector(`[data-field="${name}"]`); + } + + function sanitizeWidth(input, clamp = false) { + const digits = input.value.replace(/\D+/g, ""); + input.value = digits; + const raw = Number.parseInt(digits, 10); + const invalid = Boolean(digits) && Number.isFinite(raw) && (raw < MIN_CAPTURE_WIDTH || raw > MAX_CAPTURE_WIDTH); + input.classList.toggle("invalid", invalid); + const normalized = normalizeCaptureWidth(digits, null); + if (clamp && digits) { + input.value = String(normalized); + input.classList.remove("invalid"); + } + return normalized; + } + + async function getSettings() { + const result = await chrome.storage.local.get({ [SETTINGS_KEY]: DEFAULT_SETTINGS }); + return normalizeSettings(result[SETTINGS_KEY]); + } + + async function saveSettings(settings) { + await chrome.storage.local.set({ [SETTINGS_KEY]: normalizeSettings(settings) }); + } + + function readSettings(root, options = {}) { + const { clampWidth = false } = options; + return normalizeSettings({ + captureMode: getField(root, "captureMode").value, + useProxy: getField(root, "useProxy").checked, + concurrency: getField(root, "concurrency").value, + captureWidth: sanitizeWidth(getField(root, "captureWidth"), clampWidth) + }); + } + + function setProgress(root, percent, text) { + const status = root.shadowRoot.querySelector(".status"); + const fill = root.shadowRoot.querySelector(".progress-fill"); + const statusText = root.shadowRoot.querySelector(".status-text"); + status.hidden = false; + fill.style.width = `${Math.max(0, Math.min(100, percent))}%`; + statusText.textContent = text; + } + + function setBusy(root, isBusy) { + const captureButton = root.shadowRoot.querySelector(".capture-btn"); + const selectButton = root.shadowRoot.querySelector(".select-btn"); + captureButton.disabled = isBusy; + selectButton.disabled = isBusy; + captureButton.classList.remove("success", "error"); + captureButton.textContent = isBusy ? "采集中..." : "开始采集"; + selectButton.textContent = isBusy ? "处理中..." : "打开页面浮窗"; + } + + function setResult(root, kind, text) { + const captureButton = root.shadowRoot.querySelector(".capture-btn"); + captureButton.classList.remove("success", "error"); + captureButton.classList.add(kind); + captureButton.textContent = text; + } + + async function startCapture(root) { + setBusy(root, true); + setProgress(root, 12, "准备当前网页..."); + const settings = readSettings(root, { clampWidth: true }); + await saveSettings(settings); + try { + setProgress(root, 28, "注入采集脚本..."); + const response = await chrome.runtime.sendMessage({ + type: "PIXSO_CAPTURE_CURRENT_TAB", + options: settings + }); + if (!response?.ok) throw new Error(response?.error || "采集失败"); + const widthText = response.actualViewportWidth ? `已按 ${response.actualViewportWidth}px 采集` : "采集完成"; + setProgress(root, 100, `${widthText}:${response.filename || ""}`); + setResult(root, "success", "采集完成"); + setTimeout(() => root.remove(), 900); + } catch (error) { + setProgress(root, 0, error.message || String(error)); + setResult(root, "error", "采集失败"); + setTimeout(() => setBusy(root, false), 2600); + } + } + + async function openToolbar(root) { + const settings = readSettings(root, { clampWidth: true }); + await saveSettings(settings); + root.remove(); + window.__webToPixsoShowCaptureToolbar?.(settings); + } + + async function bind(root) { + const settings = await getSettings(); + getField(root, "captureMode").value = settings.captureMode; + getField(root, "useProxy").checked = settings.useProxy; + getField(root, "concurrency").value = settings.concurrency; + getField(root, "captureWidth").value = String(settings.captureWidth || Math.round(window.innerWidth || document.documentElement.clientWidth || 1440)); + + for (const field of ["captureMode", "useProxy", "concurrency"]) { + getField(root, field).addEventListener("change", () => saveSettings(readSettings(root))); + } + getField(root, "captureWidth").addEventListener("input", event => { + sanitizeWidth(event.currentTarget); + saveSettings(readSettings(root, { clampWidth: false })); + }); + getField(root, "captureWidth").addEventListener("blur", event => { + sanitizeWidth(event.currentTarget, true); + saveSettings(readSettings(root, { clampWidth: true })); + }); + root.shadowRoot.querySelector(".close-btn").addEventListener("click", () => root.remove()); + root.shadowRoot.querySelector(".capture-btn").addEventListener("click", () => startCapture(root)); + root.shadowRoot.querySelector(".select-btn").addEventListener("click", () => openToolbar(root)); + } + + window.__webToPixsoShowPanel = async function showPanel() { + document.getElementById(ROOT_ID)?.remove(); + const root = document.createElement("div"); + root.id = ROOT_ID; + const shadow = root.attachShadow({ mode: "open" }); + shadow.innerHTML = `${panelHtml()}`; + document.documentElement.appendChild(root); + await bind(root); + }; +})(); diff --git a/web-to-pixso/popup.css b/web-to-pixso/popup.css new file mode 100644 index 0000000..62887b8 --- /dev/null +++ b/web-to-pixso/popup.css @@ -0,0 +1,379 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + background: transparent !important; + border-radius: 16px; + overflow: hidden; + width: 320px; +} + +body { + background: transparent !important; + color: #1a1a2e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; + padding: 0; + width: 320px; + overflow: hidden; +} + +.shell { + background: #fff; + border: 1px solid rgba(10, 10, 18, 0.14); + border-radius: 16px; + box-shadow: none; + overflow: hidden; + width: 320px; +} + +.header { + align-items: center; + border-bottom: 1px solid #f0f0f0; + display: flex; + justify-content: space-between; + padding: 16px 20px 15px; +} + +.logo-title { + align-items: center; + display: flex; + gap: 10px; +} + +.logo { + border-radius: 10px; + box-shadow: 0 4px 12px rgba(10, 10, 18, 0.12); + display: block; + height: 28px; + margin-left: -2px; + object-fit: cover; + width: 28px; +} + +.title { + color: #1a1a2e; + font-size: 16px; + font-weight: 600; +} + +.version-badge { + background: #f2f4ff; + border: 1px solid #dfe5ff; + border-radius: 999px; + color: #2450ff; + font-size: 10px; + font-weight: 600; + line-height: 1; + padding: 3px 6px; + white-space: nowrap; +} + +.close-btn { + align-items: center; + background: transparent; + border: 0; + border-radius: 12px; + color: #999; + cursor: pointer; + display: flex; + font-size: 18px; + height: 24px; + justify-content: center; + line-height: 1; + transition: background 0.2s, color 0.2s; + width: 24px; +} + +.close-btn:hover { + background: #f4f4f6; + color: #666; +} + +.content { + padding: 20px; +} + +.setting-row { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 16px; +} + +.setting-label { + color: #1a1a2e; + font-size: 14px; +} + +.toggle-switch { + display: inline-block; + height: 26px; + position: relative; + width: 48px; +} + +.toggle-switch input { + height: 0; + opacity: 0; + width: 0; +} + +.toggle-slider { + background-color: #e4e4e4; + border-radius: 999px; + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: 0.3s; +} + +.toggle-slider::before { + background-color: #fff; + border-radius: 50%; + bottom: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); + content: ""; + height: 20px; + left: 3px; + position: absolute; + transition: 0.3s; + width: 20px; +} + +input:checked + .toggle-slider { + background-color: #1a1a2e; +} + +input:checked + .toggle-slider::before { + transform: translateX(22px); +} + +.setting-select { + appearance: none; + background: #fff; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); + background-position: right 10px center; + background-repeat: no-repeat; + border: 1px solid #e4e4e4; + border-radius: 9px; + color: #1a1a2e; + cursor: pointer; + font-size: 14px; + min-width: 80px; + padding: 7px 30px 7px 13px; + transition: border-color 0.18s, box-shadow 0.18s, background 0.18s; +} + +.setting-select:focus { + border-color: #2450ff; + box-shadow: 0 0 0 4px rgba(36, 80, 255, 0.1); + outline: none; +} + +.mode-select { + min-width: 116px; +} + +.width-input-wrap { + align-items: center; + background: #fff; + border: 1px solid #e4e4e4; + border-radius: 9px; + display: flex; + height: 36px; + min-width: 116px; + padding: 0 10px 0 12px; + transition: border-color 0.18s, box-shadow 0.18s; +} + +.width-input-wrap:focus-within { + border-color: #2450ff; + box-shadow: 0 0 0 4px rgba(36, 80, 255, 0.1); +} + +.width-input { + background: transparent; + border: 0; + color: #1a1a2e; + font: inherit; + font-size: 14px; + min-width: 0; + outline: none; + text-align: right; + width: 68px; +} + +.width-input.invalid { + color: #ef4444; +} + +.width-unit { + color: #999; + font-size: 12px; + margin-left: 5px; +} + +.description { + color: #999; + font-size: 12px; + line-height: 1.6; + margin-bottom: 20px; +} + +.capture-btn { + background: #1a1a2e; + border: 0; + border-radius: 9px; + color: #fff; + cursor: pointer; + font-size: 15px; + font-weight: 500; + padding: 14px 24px; + box-shadow: 0 8px 20px rgba(26, 26, 46, 0.12); + transition: background 0.2s, box-shadow 0.2s, transform 0.2s; + width: 100%; +} + +.capture-btn:hover { + background: #2d2d44; + box-shadow: 0 10px 24px rgba(26, 26, 46, 0.16); + transform: translateY(-1px); +} + +.capture-btn:active { + transform: translateY(0); +} + +.capture-btn:disabled { + cursor: not-allowed; + opacity: 0.6; + transform: none; +} + +.capture-btn.loading { + background: #666; +} + +.capture-btn.success { + background: #10b981; +} + +.capture-btn.error { + background: #ef4444; +} + +.select-btn { + background: #f4f4f6; + border: 0; + border-radius: 9px; + color: #1a1a2e; + cursor: pointer; + font-size: 15px; + font-weight: 500; + margin-top: 10px; + padding: 13px 24px; + transition: background 0.2s, box-shadow 0.2s, transform 0.2s; + width: 100%; +} + +.select-btn:hover { + background: #ececf1; + box-shadow: 0 8px 18px rgba(10, 10, 18, 0.08); + transform: translateY(-1px); +} + +.select-btn:active { + transform: translateY(0); +} + +.select-btn:disabled { + cursor: not-allowed; + opacity: 0.6; + transform: none; +} + +.select-btn.loading { + background: #e7e7ee; +} + +.status { + margin-top: 16px; + padding: 12px 0 0; +} + +.progress-bar { + background: #f0f0f0; + border-radius: 999px; + height: 4px; + margin-bottom: 8px; + overflow: hidden; +} + +.progress-fill { + background: linear-gradient(90deg, #00d2ff, #7c3aed); + border-radius: 999px; + height: 100%; + transition: width 0.3s ease; + width: 0; +} + +.status-text { + color: #666; + font-size: 12px; +} + +.help-link { + align-items: center; + border: 1px solid #e6e8f2; + border-radius: 9px; + color: #2450ff; + display: flex; + font-size: 12px; + font-weight: 500; + justify-content: center; + margin-top: 16px; + padding: 10px 12px; + text-decoration: none; + transition: background 0.18s, border-color 0.18s, color 0.18s; + width: 100%; +} + +.help-link:hover { + background: #f6f8ff; + border-color: #dfe5ff; +} + +.footer { + align-items: center; + background: #fff; + border-top: 1px solid #f0f0f0; + display: flex; + gap: 8px; + justify-content: space-between; + padding: 12px 20px; +} + +.author { + color: #666; + flex: 0 0 auto; + font-size: 12px; +} + +.support-email { + color: #888; + font-size: 10px; + line-height: 1.35; + min-width: 0; + text-align: right; + text-decoration: none; +} + +.support-email:hover { + color: #2450ff; +} diff --git a/web-to-pixso/popup.html b/web-to-pixso/popup.html new file mode 100644 index 0000000..52f50b4 --- /dev/null +++ b/web-to-pixso/popup.html @@ -0,0 +1,86 @@ + + + + + + Web to Pixso + + + +
+
+
+ + Web to Pixso + v1.1.1 +
+ +
+ +
+
+ 采集模式 + +
+ +
+ 跨域图片代理模式 + +
+ +
+ 页面采集宽度 + +
+ +
+ 图片采集并发 + +
+ +

页面采集宽度默认使用当前窗口宽度,可输入 320-3840px 触发响应式布局后采集。

+ + + + + + + 使用说明 +
+ + +
+ + + + diff --git a/web-to-pixso/popup.js b/web-to-pixso/popup.js new file mode 100644 index 0000000..569ff26 --- /dev/null +++ b/web-to-pixso/popup.js @@ -0,0 +1,221 @@ +const SETTINGS_KEY = "webToPixsoSettings"; +const HELP_URL = "https://z8qrcvi3n5.feishu.cn/wiki/RV8TwlhFyiGsEekQXk8cX5SHn6f"; +const DEFAULT_SETTINGS = { + useProxy: false, + concurrency: "8", + captureMode: "mixed", + captureWidth: null +}; +const MIN_CAPTURE_WIDTH = 320; +const MAX_CAPTURE_WIDTH = 3840; + +const captureModeSelect = document.getElementById("captureMode"); +const proxyToggle = document.getElementById("proxyToggle"); +const captureWidthInput = document.getElementById("captureWidth"); +const concurrencySelect = document.getElementById("concurrency"); +const captureBtn = document.getElementById("captureBtn"); +const btnText = document.getElementById("btnText"); +const selectBtn = document.getElementById("selectBtn"); +const selectBtnText = document.getElementById("selectBtnText"); +const status = document.getElementById("status"); +const statusText = document.getElementById("statusText"); +const progressFill = document.getElementById("progressFill"); +const closeBtn = document.getElementById("closeBtn"); +const helpLink = document.getElementById("helpLink"); + +function normalizeSettings(value = {}) { + const concurrency = String(value.concurrency || DEFAULT_SETTINGS.concurrency); + const captureWidth = normalizeCaptureWidth(value.captureWidth, null); + return { + useProxy: Boolean(value.useProxy), + concurrency: ["4", "6", "8", "10", "12", "16", "20", "infinite"].includes(concurrency) + ? concurrency + : DEFAULT_SETTINGS.concurrency, + captureMode: value.captureMode === "editable" ? "editable" : "mixed", + captureWidth + }; +} + +function normalizeCaptureWidth(value, fallback = null) { + const number = Number.parseInt(String(value || "").replace(/\D+/g, ""), 10); + if (!Number.isFinite(number)) return fallback; + return Math.max(MIN_CAPTURE_WIDTH, Math.min(MAX_CAPTURE_WIDTH, number)); +} + +async function getCurrentViewportWidth() { + try { + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + if (!tab?.id) return null; + const [{ result }] = await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + func: () => Math.round(window.innerWidth || document.documentElement.clientWidth || 0) + }); + return normalizeCaptureWidth(result, null); + } catch { + return null; + } +} + +async function getSettings() { + const result = await chrome.storage.local.get({ [SETTINGS_KEY]: DEFAULT_SETTINGS }); + return normalizeSettings(result[SETTINGS_KEY]); +} + +async function saveSettings(settings) { + await chrome.storage.local.set({ [SETTINGS_KEY]: normalizeSettings(settings) }); +} + +function setProgress(percent, text) { + status.hidden = false; + progressFill.style.width = `${Math.max(0, Math.min(100, percent))}%`; + statusText.textContent = text; +} + +function setBusy(isBusy) { + captureBtn.disabled = isBusy; + selectBtn.disabled = isBusy; + captureBtn.classList.toggle("loading", isBusy); + selectBtn.classList.toggle("loading", isBusy); + captureBtn.classList.remove("success", "error"); + btnText.textContent = isBusy ? "采集中..." : "开始采集"; + selectBtnText.textContent = isBusy ? "正在打开浮窗..." : "打开页面浮窗"; +} + +function setResult(kind, text) { + captureBtn.classList.remove("loading", "success", "error"); + captureBtn.classList.add(kind); + btnText.textContent = text; +} + +async function syncSettingsFromUI() { + await saveSettings({ + captureMode: captureModeSelect.value, + useProxy: proxyToggle.checked, + concurrency: concurrencySelect.value, + captureWidth: normalizeCaptureWidth(captureWidthInput.value, null) + }); +} + +function sanitizeCaptureWidthInput({ clamp = false } = {}) { + const digits = captureWidthInput.value.replace(/\D+/g, ""); + captureWidthInput.value = digits; + const width = normalizeCaptureWidth(digits, null); + const rawNumber = Number.parseInt(digits, 10); + let invalid = Boolean(digits) && Number.isFinite(rawNumber) && + (rawNumber < MIN_CAPTURE_WIDTH || rawNumber > MAX_CAPTURE_WIDTH); + captureWidthInput.classList.toggle("invalid", invalid); + if (clamp && digits) { + captureWidthInput.value = String(width); + invalid = false; + captureWidthInput.classList.remove("invalid"); + } + return width; +} + +function readSettingsFromUI() { + return normalizeSettings({ + captureMode: captureModeSelect.value, + useProxy: proxyToggle.checked, + concurrency: concurrencySelect.value, + captureWidth: sanitizeCaptureWidthInput({ clamp: true }) + }); +} + +async function startCapture() { + setBusy(true); + setProgress(12, "准备当前网页..."); + + const settings = readSettingsFromUI(); + await saveSettings(settings); + + try { + setProgress(28, "注入采集脚本..."); + const response = await chrome.runtime.sendMessage({ + type: "PIXSO_CAPTURE_START", + options: settings + }); + + if (!response || !response.ok) { + throw new Error(response?.error || "采集失败"); + } + + const viewportText = response.actualViewportWidth + ? `已按 ${response.actualViewportWidth}px 采集` + : "已按当前页面尺寸采集"; + setProgress(100, `${viewportText}:${response.filename}`); + setResult("success", "采集完成"); + setTimeout(() => window.close(), 900); + } catch (error) { + setProgress(0, error.message || String(error)); + setResult("error", "采集失败"); + setTimeout(() => { + setBusy(false); + status.hidden = true; + progressFill.style.width = "0"; + }, 2600); + } +} + +async function startFloatingToolbar() { + setBusy(true); + setProgress(18, "正在打开页面采集浮窗..."); + + const settings = readSettingsFromUI(); + await saveSettings(settings); + + try { + const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }); + if (!tab?.id) throw new Error("没有可选择的当前标签页"); + + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + files: ["element-picker.js"] + }); + + await chrome.scripting.executeScript({ + target: { tabId: tab.id }, + func: pickerSettings => window.__webToPixsoShowCaptureToolbar?.(pickerSettings), + args: [settings] + }); + + setProgress(100, "请在页面浮窗中选择整页或元素采集。"); + setTimeout(() => window.close(), 500); + } catch (error) { + setProgress(0, error.message || String(error)); + setResult("error", "采集失败"); + setTimeout(() => { + setBusy(false); + status.hidden = true; + progressFill.style.width = "0"; + }, 2600); + } +} + +document.addEventListener("DOMContentLoaded", async () => { + const settings = await getSettings(); + const currentWidth = await getCurrentViewportWidth(); + captureModeSelect.value = settings.captureMode; + proxyToggle.checked = settings.useProxy; + concurrencySelect.value = settings.concurrency; + captureWidthInput.value = String(settings.captureWidth || currentWidth || ""); +}); + +captureModeSelect.addEventListener("change", syncSettingsFromUI); +proxyToggle.addEventListener("change", syncSettingsFromUI); +concurrencySelect.addEventListener("change", syncSettingsFromUI); +captureWidthInput.addEventListener("input", () => { + sanitizeCaptureWidthInput(); + syncSettingsFromUI(); +}); +captureWidthInput.addEventListener("blur", () => { + sanitizeCaptureWidthInput({ clamp: true }); + syncSettingsFromUI(); +}); +captureBtn.addEventListener("click", startCapture); +selectBtn.addEventListener("click", startFloatingToolbar); +closeBtn.addEventListener("click", () => window.close()); +helpLink?.addEventListener("click", async event => { + event.preventDefault(); + await chrome.tabs.create({ url: HELP_URL }); + window.close(); +}); diff --git a/web-to-pixso/runner.js b/web-to-pixso/runner.js new file mode 100644 index 0000000..e07574a --- /dev/null +++ b/web-to-pixso/runner.js @@ -0,0 +1,162 @@ +(function () { + "use strict"; + + const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); + + function freezeAnimations() { + const style = document.createElement("style"); + style.id = "__web-to-pixso-freeze"; + style.textContent = ` + *, *::before, *::after { + animation-play-state: paused !important; + transition-duration: 0s !important; + scroll-behavior: auto !important; + } + .slick-track, + .swiper-wrapper { + transition-duration: 0s !important; + } + `; + document.documentElement.appendChild(style); + + for (const media of document.querySelectorAll("video, audio")) { + try { + media.pause(); + } catch { + // Ignore media elements that cannot be controlled by content scripts. + } + } + } + + function stabilizeCarousels() { + try { + if (window.jQuery) { + window.jQuery(".slick-slider").each((_, element) => { + try { + window.jQuery(element).slick("slickPause"); + window.jQuery(element).slick("slickGoTo", 0, true); + } catch { + // Some pages expose slick classes without the jQuery plugin instance. + } + }); + } + } catch { + // Best effort only. + } + + for (const element of document.querySelectorAll(".swiper, .swiper-container")) { + try { + if (element.swiper) { + element.swiper.autoplay?.stop?.(); + element.swiper.slideToLoop?.(0, 0, false); + element.swiper.slideTo?.(0, 0, false); + element.swiper.update?.(); + } + } catch { + // Keep DOM capture running even if a carousel API rejects. + } + } + + for (const wrapper of document.querySelectorAll(".swiper-wrapper, .slick-track")) { + wrapper.style.transitionDuration = "0s"; + wrapper.style.animationPlayState = "paused"; + } + } + + async function waitForStableTopLayer(timeout = 2500) { + const start = Date.now(); + const selector = [ + "header", + "nav", + "[role='navigation']", + "[class*='header' i]", + "[class*='nav' i]", + "[class*='top' i]" + ].join(","); + + while (Date.now() - start < timeout) { + const candidates = Array.from(document.querySelectorAll(selector)); + const hasVisibleCandidate = candidates.some(element => { + const rect = element.getBoundingClientRect(); + const style = window.getComputedStyle(element); + return rect.width > 20 && + rect.height > 10 && + rect.bottom >= 0 && + rect.top < Math.max(160, window.innerHeight * 0.2) && + style.display !== "none" && + style.visibility !== "hidden" && + Number(style.opacity || 1) > 0; + }); + if (hasVisibleCandidate || document.readyState === "complete") { + await delay(300); + return; + } + await delay(120); + } + } + + async function scrollToLoadLazyContent() { + const maxScroll = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ) - window.innerHeight; + + if (maxScroll <= 0) return; + + const step = Math.max(480, Math.floor(window.innerHeight * 0.8)); + for (let y = 0; y <= maxScroll; y += step) { + window.scrollTo(0, Math.min(y, maxScroll)); + await delay(160); + } + + window.scrollTo(0, maxScroll); + await delay(220); + window.scrollTo(0, 0); + await delay(220); + } + + async function waitForImages(timeout = 3500) { + const images = Array.from(document.images || []); + await Promise.race([ + Promise.allSettled(images.map(image => { + if (image.complete) return Promise.resolve(); + return new Promise(resolve => { + image.addEventListener("load", resolve, { once: true }); + image.addEventListener("error", resolve, { once: true }); + }); + })), + delay(timeout) + ]); + } + + async function waitForFonts(timeout = 3000) { + if (!document.fonts?.ready) return; + await Promise.race([document.fonts.ready, delay(timeout)]); + } + + window.__webToPixsoRunCapture = async function runCapture(options = {}) { + if (!window.__webToPixsoCapture) { + throw new Error("采集引擎未加载"); + } + + freezeAnimations(); + stabilizeCarousels(); + await waitForStableTopLayer(); + stabilizeCarousels(); + await scrollToLoadLazyContent(); + stabilizeCarousels(); + await waitForImages(); + await waitForFonts(); + stabilizeCarousels(); + await delay(200); + + return window.__webToPixsoCapture({ + useProxy: Boolean(options.useProxy), + concurrency: options.concurrency || "8", + captureMode: options.captureMode === "editable" ? "editable" : "mixed", + captureWidth: options.captureWidth, + selectionId: options.selectionId, + selectionWidth: options.selectionWidth + }); + }; +})(); diff --git a/web-to-pixso/发布使用说明-Web to Pixso.md b/web-to-pixso/发布使用说明-Web to Pixso.md new file mode 100644 index 0000000..ba1768d --- /dev/null +++ b/web-to-pixso/发布使用说明-Web to Pixso.md @@ -0,0 +1,118 @@ +# Web to Pixso 使用说明 + +Web to Pixso 可以将网页采集为可导入 Pixso 的高保真设计稿,适合网页参考稿采集、运营页转设计稿、竞品页面还原、开发页面转 Pixso 资产等场景。 + +插件包:`web-to-pixso-v1.1.1.zip` + +使用说明在线文档:[Web to Pixso 使用说明](https://z8qrcvi3n5.feishu.cn/wiki/RV8TwlhFyiGsEekQXk8cX5SHn6f) + +反馈邮箱:`270310136@qq.com`。给我发邮件哦,我光速改。 + +## 一、安装 Chrome 浏览器扩展 + +1. 解压 `web-to-pixso-v1.1.1.zip`。 +2. 打开 Chrome 浏览器,进入 `chrome://extensions/`。 +3. 打开右上角「开发者模式」。 +4. 点击「加载已解压的扩展程序」。 +5. 选择解压后的 `web-to-pixso` 文件夹。 +6. 安装成功后,浏览器右上角会出现 Web to Pixso 扩展图标。 + +## 二、安装 Pixso 插件 + +1. 打开 Pixso。 +2. 进入插件开发/导入插件入口。 +3. 选择 `web-to-pixso/pixso-plugin` 目录中的插件文件。 +4. 导入成功后,在 Pixso 插件面板中可以看到 Web to Pixso。 + +## 三、采集网页 + +1. 在 Chrome 中打开需要采集的目标网页。 +2. 点击浏览器右上角 Web to Pixso 扩展图标。 +3. 选择采集模式: + - 混合高保真:优先保留关键模块截图兜底,同时尽量保留文字可编辑。 + - 可编辑优先:优先转换为 Pixso 原生文本、图片、形状和组件图层。 +4. 可按需要设置: + - 跨域图片代理模式:用于减少图片丢失。 + - 页面采集宽度:用于按指定视口宽度触发响应式页面布局。 + - 图片采集并发:用于控制图片下载并发数量。 +5. 点击「开始采集」。 +6. 采集完成后,会下载一个 `.json` 文件。 + +## 四、导入 Pixso + +1. 在 Pixso 中打开 Web to Pixso 插件。 +2. 将 Chrome 扩展下载的 `.json` 文件拖拽到插件面板,或点击选择文件。 +3. 插件会自动识别页面宽度和页面高度。 +4. 点击「导入到 Pixso」。 +5. 导入完成后,会创建一个以网页标题命名的画板。 + +## 五、导入后的图层结构 + +导入后的设计稿会按用途分层,方便设计师编辑和对比: + +1. 对比底图层 + - 放置完整页面截图或模块截图。 + - 用于和上层可编辑元素进行还原度对比。 + - 可隐藏或锁定。 + +2. 可编辑元素层 + - 包含按钮、卡片、输入框、背景、图片、Logo、图标等。 + - 尽量保留尺寸、位置、圆角、边框、阴影、透明度和背景样式。 + +3. 文字编辑层 + - 包含网页中的可见文字。 + - 尽量保留字体、字号、颜色、行高、字重、对齐方式等样式。 + - 文字可在 Pixso 中直接编辑。 + +## 六、常见问题 + +### 1. 为什么有些区域是截图? + +部分网页使用复杂动画、轮播、视频、Canvas、伪元素、复杂背景或特殊渲染方式。为了保证视觉效果不丢失,插件会为这些区域生成截图兜底,同时尽量保留文字和主要元素可编辑。 + +### 2. 为什么有些图片没有显示? + +可能是目标网站启用了跨域限制、懒加载、防盗链或动态鉴权。可以尝试开启「跨域图片代理模式」后重新采集。 + +### 3. 为什么 Header 或 Hero 区域有时不可编辑? + +部分网站的导航栏、轮播图或首屏区域可能由复杂脚本、Shadow DOM、Canvas、视频或异步渲染生成。插件会优先转换为可编辑图层,并使用兜底截图保证视觉可对比。 + +### 4. 页面采集宽度有什么用? + +页面采集宽度用于模拟不同视口下的响应式布局。例如输入 `1920` 可以采集桌面宽屏布局,输入 `375` 可以采集移动端布局。 + +### 5. 导入后如何检查还原度? + +可以先显示「对比底图层」,再查看上方的可编辑元素层和文字编辑层是否与底图对齐。对比完成后,可以隐藏或锁定底图。 + +## 七、适用场景 + +- 网页转 Pixso 设计稿 +- 竞品页面采集 +- 运营活动页还原 +- 开发页面转设计资产 +- 设计走查和页面对比 +- 旧页面重构前的视觉备份 + +## 八、版本说明 + +当前版本:V1.1.1 + +支持从 Web to Pixso Chrome 扩展导出的 JSON 文件导入 Pixso,生成包含可编辑文本、图片、背景、按钮、卡片和对比底图的高保真网页设计稿。 + +本版重点: + +- Chrome 扩展和 Pixso 插件版本号统一为 `1.1.1`。 +- 插件面板显示版本号,避免用户混淆安装包。 +- Chrome 扩展和 Pixso 插件均新增「使用说明」入口,点击后打开飞书文档。 +- 两端插件底部均新增反馈邮箱:`270310136@qq.com`。 +- 采集 JSON 协议版本同步为 `1.1.1`,方便问题排查。 +- 保留页面采集宽度、混合高保真、可编辑优先、跨域图片代理和图片采集并发能力。 +- 继续强化三层结构:对比底图层、可编辑元素层、文字编辑层。 + +已知边界: + +- 复杂动画、Canvas、视频、动态轮播和强跨域资源可能仍需要兜底截图或人工微调。 +- 真实网页还原质量会受目标网站资源加载、登录态、懒加载和浏览器环境影响。 +- 对外使用时建议先用对比底图层检查还原度,再进行设计稿编辑。