From 3402e55bce54f23367e7dd231acf2b62185a42ac Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Tue, 23 Sep 2025 14:11:00 +0200 Subject: [PATCH 01/28] Started with implementation of Azure blob storage --- lib/azure-blob-storage.js | 330 ++++++++++++++++++++++++++++++++++++++ package.json | 20 ++- 2 files changed, 342 insertions(+), 8 deletions(-) create mode 100644 lib/azure-blob-storage.js diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js new file mode 100644 index 00000000..693a7ce0 --- /dev/null +++ b/lib/azure-blob-storage.js @@ -0,0 +1,330 @@ +const { BlobServiceClient } = require('@azure/storage-blob'); +const { scanRequest } = require('./malwareScanner') +const cds = require("@sap/cds"); +const utils = require('./helper') +const DEBUG = cds.debug('attachments'); +const { SELECT } = cds.ql; + +const isMultitenacyEnabled = !!cds.env.requires.multitenancy; +const objectStoreKind = cds.env.requires?.attachments?.objectStore?.kind; +const separateObjectStore = isMultitenacyEnabled && objectStoreKind === "separate"; + +const azureClientsCache = {}; +module.exports = class AzureAttachmentsService extends require("./basic") { + init() { + // For single tenant or shared object store instance + if (!separateObjectStore) { + const creds = cds.env.requires?.objectStore?.credentials; + + if (!creds) throw new Error("Azure Blob Storage credentials are not provided."); + + this.containerName = creds.container_name; + this.blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token); + this.containerClient = this.blobServiceClient.getContainerClient(creds.container_name); + return super.init(); + } + } + + async createAzureClient(tenantID) { + DEBUG?.(`[Azure Upload] Creating Azure client for tenant ${tenantID}`); + try { + if (azureClientsCache[tenantID]) { + this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient; + this.containerClient = azureClientsCache[tenantID].containerClient; + this.containerName = azureClientsCache[tenantID].containerName; + return; + } + + const serviceManagerCreds = cds.env.requires?.serviceManager?.credentials; + if (!serviceManagerCreds) { + throw new Error("Service Manager Instance is not bound"); + } + + const { sm_url, url, clientid, clientsecret, certificate, key, certurl } = serviceManagerCreds; + const token = await utils.fetchToken(url, clientid, clientsecret, certificate, key, certurl); + + const objectStoreCreds = await utils.getObjectStoreCredentials(tenantID, sm_url, token); + + if (!objectStoreCreds) { + throw new Error(`Azure Blob Storage instance not bound for tenant ${tenantID}`); + } + + const creds = objectStoreCreds.credentials; + const blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token); + const containerClient = blobServiceClient.getContainerClient(creds.container_name); + + azureClientsCache[tenantID] = { + blobServiceClient, + containerClient, + containerName: creds.container_name, + }; + + this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient; + this.containerClient = azureClientsCache[tenantID].containerClient; + this.containerName = azureClientsCache[tenantID].containerName; + DEBUG?.(`[Azure Upload] Created Azure client for tenant ${tenantID}`); + } catch (error) { + // eslint-disable-next-line no-console + console.error(`Creation of Azure client for tenant ${tenantID} failed`, error); + } + } + + async put(attachments, data, isDraftEnabled, _content, req) { + DEBUG?.(`[Azure Upload] Executing put for file in ${attachments}`); + + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req.tenant; + await this.createAzureClient(tenantID); + } + + if (Array.isArray(data)) + return Promise.all( + data.map((d) => this.put(attachments, d, isDraftEnabled)) + ); + const { content = _content, ...metadata } = data; + const blobName = metadata.url; + + try { + const blobClient = this.containerClient.getBlockBlobClient(blobName); + + // Handle different content types (Buffer, stream, etc.) + let contentLength; + if (Buffer.isBuffer(content)) { + contentLength = content.length; + } else if (content && typeof content.length === 'number') { + contentLength = content.length; + } else if (content && typeof content.size === 'number') { + contentLength = content.size; + } else { + // For streams or other content types, convert to buffer first + const chunks = []; + for await (const chunk of content) { + chunks.push(chunk); + } + content = Buffer.concat(chunks); + contentLength = content.length; + } + + const stored = super.put(attachments, metadata, null, isDraftEnabled); + await Promise.all([stored, blobClient.upload(content, contentLength)]); + if (this.kind === 'azure') scanRequest(attachments, { ID: metadata.ID }, req); + DEBUG?.(`[Azure Upload] File uploaded successfully using put to ${this.containerName}`); + } catch (err) { + console.error(err); // eslint-disable-line no-console + } + } + + // eslint-disable-next-line no-unused-vars + async get(attachments, keys, req = {}) { + DEBUG?.(`[Azure Upload] Executing get for file`); + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req.tenant; + await this.createAzureClient(tenantID); + } + const response = await SELECT.from(attachments, keys).columns("url"); + if (response?.url) { + const blobName = response.url; + const blobClient = this.containerClient.getBlockBlobClient(blobName); + const downloadResponse = await blobClient.download(); + return downloadResponse.readableStreamBody; + } + } + + async deleteAttachment(key, req) { + if (!key) return; + return await this.delete(key, req); + } + + async deleteAttachmentsWithKeys(records, req) { + if (req?.attachmentsToDelete?.length > 0) { + req.attachmentsToDelete.forEach((attachment) => { + this.deleteAttachment(attachment.url, req); + }); + } + } + + async attachDeletionData(req) { + const attachments = cds.model.definitions[req?.target?.name + ".attachments"]; + if (attachments) { + const diffData = await req.diff(); + let deletedAttachments = []; + diffData.attachments?.filter((object) => { + return object._op === "delete"; + }) + .map((attachment) => { + deletedAttachments.push(attachment.ID); + }); + + if (deletedAttachments.length > 0) { + let attachmentsToDelete = await SELECT.from(attachments).columns("url").where({ ID: { in: [...deletedAttachments] } }); + if (attachmentsToDelete.length > 0) { + req.attachmentsToDelete = attachmentsToDelete; + } + } + } + } + + async updateContentHandler(req, next) { + DEBUG?.(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`); + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req.tenant; + await this.createAzureClient(tenantID); + } + + if (req?.data?.content) { + const response = await SELECT.from(req.target, { ID: req.data.ID }).columns("url"); + if (response?.url) { + const blobName = response.url; + const blobClient = this.containerClient.getBlockBlobClient(blobName); + + // Handle different content types for update + let contentLength; + const content = req.data.content; + if (Buffer.isBuffer(content)) { + contentLength = content.length; + } else if (content && typeof content.length === 'number') { + contentLength = content.length; + } else if (content && typeof content.size === 'number') { + contentLength = content.size; + } else { + // Convert to buffer if needed + const chunks = []; + for await (const chunk of content) { + chunks.push(chunk); + } + req.data.content = Buffer.concat(chunks); + contentLength = req.data.content.length; + } + + await blobClient.upload(req.data.content, contentLength); + + const keys = { ID: req.data.ID } + scanRequest(req.target, keys, req) + DEBUG?.(`[Azure Upload] Uploaded file using updateContentHandler for ${req.target.name}`); + } + } else if (req?.data?.note) { + const key = { ID: req.data.ID }; + await super.update(req.target, key, { note: req.data.note }); + DEBUG?.(`[Azure Upload] Updated file upload with note for ${req.target.name}`); + } else { + next(); + } + } + + async getAttachmentsToDelete({ draftEntity, activeEntity, id }) { + const [draftAttachments, activeAttachments] = await Promise.all([ + SELECT.from(draftEntity).columns("url").where(id), + SELECT.from(activeEntity).columns("url").where(id) + ]); + + const activeUrls = new Set(activeAttachments.map(a => a.url)); + return draftAttachments + .filter(({ url }) => !activeUrls.has(url)) + .map(({ url }) => ({ url })); + } + + async attachDraftDeletionData(req) { + const draftEntity = cds.model.definitions[req?.target?.name]; + const name = req?.target?.name; + const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined; + + if (!draftEntity || !activeEntity) return; + + const diff = await req.diff(); + if (diff._op !== "delete" || !diff.ID) return; + + const attachmentsToDelete = await this.getAttachmentsToDelete({ + draftEntity, + activeEntity, + id: { ID: diff.ID } + }); + + if (attachmentsToDelete.length) { + req.attachmentsToDelete = attachmentsToDelete; + } + } + + async attachDraftDiscardDeletionData(req) { + const { ID } = req.data; + const parentEntity = req.target.name.split('.').slice(0, -1).join('.'); + const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`]; + const activeEntity = cds.model.definitions[`${parentEntity}.attachments`]; + + if (!draftEntity || !activeEntity) return; + + const attachmentsToDelete = await this.getAttachmentsToDelete({ + draftEntity, + activeEntity, + id: { up__ID: ID } + }); + + if (attachmentsToDelete.length) { + req.attachmentsToDelete = attachmentsToDelete; + } + } + + registerUpdateHandlers(srv, entity, mediaElement) { + srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)); + srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)); + + srv.prepend(() => { + srv.on( + "PUT", + mediaElement, + this.updateContentHandler.bind(this) + ); + }); + } + + registerDraftUpdateHandlers(srv, entity, mediaElement) { + srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)); + srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)); + + // case: attachments uploaded in draft and draft is discarded + srv.before("CANCEL", entity.drafts, this.attachDraftDiscardDeletionData.bind(this)); + srv.after("CANCEL", entity.drafts, this.deleteAttachmentsWithKeys.bind(this)); + + srv.prepend(() => { + if (mediaElement.drafts) { + srv.on( + "PUT", + mediaElement.drafts, + this.updateContentHandler.bind(this) + ); + + // case: attachments uploaded in draft and deleted before saving + srv.before( + "DELETE", + mediaElement.drafts, + this.attachDraftDeletionData.bind(this) + ); + srv.after( + "DELETE", + mediaElement.drafts, + this.deleteAttachmentsWithKeys.bind(this) + ); + } + }); + } + + async delete(blobName, req) { + DEBUG?.(`[Azure Upload] Executing delete for file in ${req.target.name}`); + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req.tenant; + await this.createAzureClient(tenantID); + } + + const blobClient = this.containerClient.getBlockBlobClient(blobName); + const response = await blobClient.delete(); + return response._response.status === 202; + } + + async deleteInfectedAttachment(Attachments, key, req) { + const response = await SELECT.from(Attachments, key).columns('url') + return await this.delete(response.url, req); + } +}; diff --git a/package.json b/package.json index 5f0d227b..0a4d2ec5 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.400.0", "@aws-sdk/lib-storage": "^3.515.0", + "@azure/storage-blob": "^12.28.0", "axios": "^1.4.0" }, "devDependencies": { @@ -45,14 +46,17 @@ }, "attachments-s3": { "impl": "@cap-js/attachments/lib/aws-s3" + }, + "attachments-azure": { + "impl": "@cap-js/attachments/lib/azure-blob-storage" } }, - "serviceManager":{ - "vcap": { - "label": "service-manager" - } - }, - "objectStore":{ + "serviceManager": { + "vcap": { + "label": "service-manager" + } + }, + "objectStore": { "vcap": { "label": "objectstore" } @@ -79,7 +83,7 @@ }, "[hybrid]": { "attachments": { - "kind": "s3", + "kind": "azure", "scan": true, "objectStore": { "kind": "separate" @@ -88,4 +92,4 @@ } } } -} +} \ No newline at end of file From 30b9efc42e625a112bc7f8c3c39ac9b056c13c7a Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 10 Oct 2025 10:53:23 +0200 Subject: [PATCH 02/28] Refactor Azure Blob Storage service to improve logging and error handling; remove unnecessary semicolons. --- lib/aws-s3.js | 6 +- lib/azure-blob-storage.js | 509 +++++++++++++++++++++++++++----------- 2 files changed, 366 insertions(+), 149 deletions(-) diff --git a/lib/aws-s3.js b/lib/aws-s3.js index bc70113c..009827d1 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -392,13 +392,13 @@ module.exports = class AWSAttachmentsService extends require("./basic") { await this.createClientS3(tenantID) } - const targetID = req.data.ID || req.params[1]?.ID || req.params[1]; + const targetID = req.data.ID || req.params[1]?.ID || req.params[1] if (!targetID) { - req.reject(400, "Missing ID in request"); + req.reject(400, "Missing ID in request") } if (req?.data?.content) { - const response = await SELECT.from(req.target, { ID: targetID }).columns("url"); + const response = await SELECT.from(req.target, { ID: targetID }).columns("url") if (response?.url) { const Key = response.url const input = { diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 693a7ce0..88118b57 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -1,216 +1,433 @@ -const { BlobServiceClient } = require('@azure/storage-blob'); +const { BlobServiceClient } = require('@azure/storage-blob') const { scanRequest } = require('./malwareScanner') -const cds = require("@sap/cds"); +const cds = require("@sap/cds") const utils = require('./helper') -const DEBUG = cds.debug('attachments'); -const { SELECT } = cds.ql; +const { SELECT } = cds.ql +const { logConfig } = require('./logger') -const isMultitenacyEnabled = !!cds.env.requires.multitenancy; -const objectStoreKind = cds.env.requires?.attachments?.objectStore?.kind; -const separateObjectStore = isMultitenacyEnabled && objectStoreKind === "separate"; +const isMultitenacyEnabled = !!cds.env.requires.multitenancy +const objectStoreKind = cds.env.requires?.attachments?.objectStore?.kind +const separateObjectStore = isMultitenacyEnabled && objectStoreKind === "separate" -const azureClientsCache = {}; +const azureClientsCache = {} module.exports = class AzureAttachmentsService extends require("./basic") { init() { + // Log initial configuration + logConfig.info('Azure Blob Storage Attachments Service initialization', { + multitenancy: isMultitenacyEnabled, + objectStoreKind, + separateObjectStore, + attachmentsConfig: { + kind: cds.env.requires?.attachments?.kind, + scan: cds.env.requires?.attachments?.scan + } + }) + + logConfig.processStep('Initializing Azure Blob Storage Attachments Service', { + separateObjectStore + }) + // For single tenant or shared object store instance if (!separateObjectStore) { - const creds = cds.env.requires?.objectStore?.credentials; + const creds = cds.env.requires?.objectStore?.credentials + + if (!creds) { + logConfig.configValidation('objectStore.credentials', creds, false, + 'Bind an Azure Blob Storage instance to your application or configure separateObjectStore for multitenancy') + throw new Error("Azure Blob Storage credentials are not provided.") + } + + // Validate required credentials + const requiredFields = ['container_name', 'container_uri', 'sas_token'] + const missingFields = requiredFields.filter(field => !creds[field]) + + if (missingFields.length > 0) { + logConfig.configValidation('objectStore.credentials', creds, false, + `Azure Blob Storage credentials missing: ${missingFields.join(', ')}`) + throw new Error(`Missing Azure Blob Storage credentials: ${missingFields.join(', ')}`) + } + + logConfig.info('Configuring shared Azure Blob Storage client', { + containerName: creds.container_name, + containerUri: creds.container_uri, + hasSasToken: !!creds.sas_token + }) - if (!creds) throw new Error("Azure Blob Storage credentials are not provided."); + this.containerName = creds.container_name + this.blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token) + this.containerClient = this.blobServiceClient.getContainerClient(creds.container_name) - this.containerName = creds.container_name; - this.blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token); - this.containerClient = this.blobServiceClient.getContainerClient(creds.container_name); - return super.init(); + logConfig.info('Azure Blob Storage client initialized successfully', { + containerName: this.containerName + }) + + return super.init() + } else { + logConfig.info('Separate object store mode enabled - clients will be created per tenant') } } async createAzureClient(tenantID) { - DEBUG?.(`[Azure Upload] Creating Azure client for tenant ${tenantID}`); + logConfig.processStep('Creating tenant-specific Azure Blob Storage client', { tenantID }) + try { + // Check cache first if (azureClientsCache[tenantID]) { - this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient; - this.containerClient = azureClientsCache[tenantID].containerClient; - this.containerName = azureClientsCache[tenantID].containerName; - return; + logConfig.debug('Using cached Azure Blob Storage client', { + tenantID, + containerName: azureClientsCache[tenantID].containerName + }) + this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient + this.containerClient = azureClientsCache[tenantID].containerClient + this.containerName = azureClientsCache[tenantID].containerName + return } - const serviceManagerCreds = cds.env.requires?.serviceManager?.credentials; + // Validate Service Manager configuration + const serviceManagerCreds = cds.env.requires?.serviceManager?.credentials if (!serviceManagerCreds) { - throw new Error("Service Manager Instance is not bound"); + logConfig.configValidation('serviceManager.credentials', serviceManagerCreds, false, + 'Bind a Service Manager instance for separate object store mode') + throw new Error("Service Manager Instance is not bound") + } + + const { sm_url, url, clientid, clientsecret, certificate, key, certurl } = serviceManagerCreds + + // Validate required Service Manager fields + const requiredSmFields = ['sm_url', 'url', 'clientid'] + const missingSmFields = requiredSmFields.filter(field => !serviceManagerCreds[field]) + + if (missingSmFields.length > 0) { + logConfig.configValidation('serviceManager.credentials', serviceManagerCreds, false, + `Service Manager credentials missing: ${missingSmFields.join(', ')}`) + throw new Error(`Missing Service Manager credentials: ${missingSmFields.join(', ')}`) } - const { sm_url, url, clientid, clientsecret, certificate, key, certurl } = serviceManagerCreds; - const token = await utils.fetchToken(url, clientid, clientsecret, certificate, key, certurl); + logConfig.debug('Fetching access token for tenant', { tenantID, sm_url }) + const token = await utils.fetchToken(url, clientid, clientsecret, certificate, key, certurl) - const objectStoreCreds = await utils.getObjectStoreCredentials(tenantID, sm_url, token); + logConfig.debug('Fetching object store credentials for tenant', { tenantID }) + const objectStoreCreds = await utils.getObjectStoreCredentials(tenantID, sm_url, token) if (!objectStoreCreds) { - throw new Error(`Azure Blob Storage instance not bound for tenant ${tenantID}`); + logConfig.withSuggestion('error', + 'Object store credentials not found for tenant', null, + 'Ensure Azure Blob Storage instance is subscribed and bound for this tenant', + { tenantID }) + throw new Error(`Azure Blob Storage instance not bound for tenant ${tenantID}`) } - const creds = objectStoreCreds.credentials; - const blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token); - const containerClient = blobServiceClient.getContainerClient(creds.container_name); + // Validate object store credentials + const requiredOsFields = ['container_name', 'container_uri', 'sas_token'] + const missingOsFields = requiredOsFields.filter(field => !objectStoreCreds.credentials?.[field]) + + if (missingOsFields.length > 0) { + logConfig.withSuggestion('error', + 'Object store credentials incomplete', null, + 'Check Azure Blob Storage instance configuration and binding', + { tenantID, missingFields: missingOsFields }) + throw new Error(`Incomplete Azure Blob Storage credentials: ${missingOsFields.join(', ')}`) + } + + logConfig.debug('Creating Azure Blob Storage client for tenant', { + tenantID, + containerName: objectStoreCreds.credentials.container_name + }) + + const creds = objectStoreCreds.credentials + const blobServiceClient = new BlobServiceClient(creds.container_uri + "?" + creds.sas_token) + const containerClient = blobServiceClient.getContainerClient(creds.container_name) azureClientsCache[tenantID] = { blobServiceClient, containerClient, containerName: creds.container_name, - }; + } + + this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient + this.containerClient = azureClientsCache[tenantID].containerClient + this.containerName = azureClientsCache[tenantID].containerName + + logConfig.debug('Azure Blob Storage client has been created successful', { + tenantID, + containerName: this.containerName + }) - this.blobServiceClient = azureClientsCache[tenantID].blobServiceClient; - this.containerClient = azureClientsCache[tenantID].containerClient; - this.containerName = azureClientsCache[tenantID].containerName; - DEBUG?.(`[Azure Upload] Created Azure client for tenant ${tenantID}`); } catch (error) { - // eslint-disable-next-line no-console - console.error(`Creation of Azure client for tenant ${tenantID} failed`, error); + logConfig.withSuggestion('error', + 'Failed to create tenant-specific Azure Blob Storage client', error, + 'Check Service Manager and Azure Blob Storage instance configuration', + { tenantID }) + throw error } } async put(attachments, data, isDraftEnabled, _content, req) { - DEBUG?.(`[Azure Upload] Executing put for file in ${attachments}`); - - // Check separate object store instances - if (separateObjectStore) { - const tenantID = req.tenant; - await this.createAzureClient(tenantID); - } + const startTime = Date.now() - if (Array.isArray(data)) - return Promise.all( - data.map((d) => this.put(attachments, d, isDraftEnabled)) - ); - const { content = _content, ...metadata } = data; - const blobName = metadata.url; + logConfig.processStep('Starting file upload to Azure Blob Storage', { + attachmentEntity: attachments.name, + isDraftEnabled, + tenant: req?.tenant + }) try { - const blobClient = this.containerClient.getBlockBlobClient(blobName); + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req?.tenant + if (!tenantID) { + logConfig.withSuggestion('error', + 'Tenant ID required for separate object store mode', null, + 'Ensure request context includes tenant information', + { separateObjectStore, hasTenant: !!tenantID }) + throw new Error('Tenant ID required for separate object store') + } + await this.createAzureClient(tenantID) + } + + if (Array.isArray(data)) { + logConfig.debug('Processing bulk file upload', { + fileCount: data.length, + filenames: data.map(d => d.filename) + }) + return Promise.all( + data.map((d) => this.put(attachments, d, isDraftEnabled, _content, req)) + ) + } + + const { content = _content, ...metadata } = data + const blobName = metadata.url + + if (!blobName) { + logConfig.withSuggestion('error', + 'File key/URL is required for Azure Blob Storage upload', null, + 'Ensure attachment data includes a valid URL/key', + { metadata: { ...metadata, content: !!content } }) + throw new Error('File key is required for upload') + } + + if (!content) { + logConfig.withSuggestion('error', + 'File content is required for Azure Blob Storage upload', null, + 'Ensure attachment data includes file content', + { key: blobName, hasContent: !!content }) + throw new Error('File content is required for upload') + } + + const blobClient = this.containerClient.getBlockBlobClient(blobName) // Handle different content types (Buffer, stream, etc.) - let contentLength; + let contentLength if (Buffer.isBuffer(content)) { - contentLength = content.length; + contentLength = content.length } else if (content && typeof content.length === 'number') { - contentLength = content.length; + contentLength = content.length } else if (content && typeof content.size === 'number') { - contentLength = content.size; + contentLength = content.size } else { // For streams or other content types, convert to buffer first - const chunks = []; + const chunks = [] for await (const chunk of content) { - chunks.push(chunk); + chunks.push(chunk) } - content = Buffer.concat(chunks); - contentLength = content.length; + content = Buffer.concat(chunks) + contentLength = content.length + } + + logConfig.debug('Uploading file to Azure Blob Storage', { + containerName: this.containerName, + blobName, + filename: metadata.filename, + contentSize: contentLength + }) + + const stored = super.put(attachments, metadata, null, isDraftEnabled) + await Promise.all([stored, blobClient.upload(content, contentLength)]) + + const duration = Date.now() - startTime + logConfig.debug('File upload to Azure Blob Storage completed successfully', { + filename: metadata.filename, + fileId: metadata.ID, + containerName: this.containerName, + blobName, + duration + }) + + // Initiate malware scan if configured + if (this.kind === 'azure') { + logConfig.debug('Initiating malware scan for uploaded file', { + fileId: metadata.ID, + filename: metadata.filename + }) + scanRequest(attachments, { ID: metadata.ID }, req) } - const stored = super.put(attachments, metadata, null, isDraftEnabled); - await Promise.all([stored, blobClient.upload(content, contentLength)]); - if (this.kind === 'azure') scanRequest(attachments, { ID: metadata.ID }, req); - DEBUG?.(`[Azure Upload] File uploaded successfully using put to ${this.containerName}`); } catch (err) { - console.error(err); // eslint-disable-line no-console + const duration = Date.now() - startTime + logConfig.withSuggestion('error', + 'File upload to Azure Blob Storage failed', err, + 'Check Azure Blob Storage connectivity, credentials, and container permissions', + { filename: data?.filename, fileId: data?.ID, containerName: this.containerName, blobName: data?.url, duration }) + throw err } } // eslint-disable-next-line no-unused-vars async get(attachments, keys, req = {}) { - DEBUG?.(`[Azure Upload] Executing get for file`); - // Check separate object store instances - if (separateObjectStore) { - const tenantID = req.tenant; - await this.createAzureClient(tenantID); - } - const response = await SELECT.from(attachments, keys).columns("url"); - if (response?.url) { - const blobName = response.url; - const blobClient = this.containerClient.getBlockBlobClient(blobName); - const downloadResponse = await blobClient.download(); - return downloadResponse.readableStreamBody; + const startTime = Date.now() + + logConfig.processStep('Starting file download from Azure Blob Storage', { + attachmentEntity: attachments.name, + keys, + tenant: req?.tenant + }) + + try { + // Check separate object store instances + if (separateObjectStore) { + const tenantID = req?.tenant + if (!tenantID) { + logConfig.withSuggestion('error', + 'Tenant ID required for separate object store mode', null, + 'Ensure request context includes tenant information', + { separateObjectStore, hasTenant: !!tenantID }) + throw new Error('Tenant ID required for separate object store') + } + await this.createAzureClient(tenantID) + } + + logConfig.debug('Fetching attachment metadata', { keys }) + const response = await SELECT.from(attachments, keys).columns("url") + + if (!response?.url) { + logConfig.withSuggestion('warn', + 'File URL not found in database', null, + 'Check if the attachment exists and has been properly uploaded', + { keys, hasResponse: !!response }) + return null + } + + const blobName = response.url + + logConfig.debug('Downloading file from Azure Blob Storage', { + containerName: this.containerName, + blobName + }) + + const blobClient = this.containerClient.getBlockBlobClient(blobName) + const downloadResponse = await blobClient.download() + + const duration = Date.now() - startTime + logConfig.debug('File download from Azure Blob Storage completed successfully', { + fileId: keys.ID, + containerName: this.containerName, + blobName, + duration + }) + + return downloadResponse.readableStreamBody + + } catch (error) { + const duration = Date.now() - startTime + const suggestion = error.code === 'BlobNotFound' ? + 'File may have been deleted from Azure Blob Storage or URL is incorrect' : + error.code === 'AuthenticationFailed' ? + 'Check Azure Blob Storage credentials and SAS token' : + 'Check Azure Blob Storage connectivity and configuration' + + logConfig.withSuggestion('error', + 'File download from Azure Blob Storage failed', error, + suggestion, + { fileId: keys?.ID, containerName: this.containerName, attachmentName: attachments.name, duration }) + + throw error } } async deleteAttachment(key, req) { - if (!key) return; - return await this.delete(key, req); + if (!key) return + return await this.delete(key, req) } async deleteAttachmentsWithKeys(records, req) { if (req?.attachmentsToDelete?.length > 0) { req.attachmentsToDelete.forEach((attachment) => { - this.deleteAttachment(attachment.url, req); - }); + this.deleteAttachment(attachment.url, req) + }) } } async attachDeletionData(req) { - const attachments = cds.model.definitions[req?.target?.name + ".attachments"]; + const attachments = cds.model.definitions[req?.target?.name + ".attachments"] if (attachments) { - const diffData = await req.diff(); - let deletedAttachments = []; + const diffData = await req.diff() + let deletedAttachments = [] diffData.attachments?.filter((object) => { - return object._op === "delete"; + return object._op === "delete" }) .map((attachment) => { - deletedAttachments.push(attachment.ID); - }); + deletedAttachments.push(attachment.ID) + }) if (deletedAttachments.length > 0) { - let attachmentsToDelete = await SELECT.from(attachments).columns("url").where({ ID: { in: [...deletedAttachments] } }); + let attachmentsToDelete = await SELECT.from(attachments).columns("url").where({ ID: { in: [...deletedAttachments] } }) if (attachmentsToDelete.length > 0) { - req.attachmentsToDelete = attachmentsToDelete; + req.attachmentsToDelete = attachmentsToDelete } } } } async updateContentHandler(req, next) { - DEBUG?.(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`); + logConfig.debug(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant; - await this.createAzureClient(tenantID); + const tenantID = req.tenant + await this.createAzureClient(tenantID) + } + + const targetID = req.data.ID || req.params[1]?.ID || req.params[1]; + if (!targetID) { + req.reject(400, "Missing ID in request"); } if (req?.data?.content) { - const response = await SELECT.from(req.target, { ID: req.data.ID }).columns("url"); + const response = await SELECT.from(req.target, { ID: targetID }).columns("url") if (response?.url) { - const blobName = response.url; - const blobClient = this.containerClient.getBlockBlobClient(blobName); + const blobName = response.url + const blobClient = this.containerClient.getBlockBlobClient(blobName) // Handle different content types for update - let contentLength; - const content = req.data.content; + let contentLength + const content = req.data.content if (Buffer.isBuffer(content)) { - contentLength = content.length; + contentLength = content.length } else if (content && typeof content.length === 'number') { - contentLength = content.length; + contentLength = content.length } else if (content && typeof content.size === 'number') { - contentLength = content.size; + contentLength = content.size } else { // Convert to buffer if needed - const chunks = []; + const chunks = [] for await (const chunk of content) { - chunks.push(chunk); + chunks.push(chunk) } - req.data.content = Buffer.concat(chunks); - contentLength = req.data.content.length; + req.data.content = Buffer.concat(chunks) + contentLength = req.data.content.length } - await blobClient.upload(req.data.content, contentLength); + await blobClient.upload(req.data.content, contentLength) - const keys = { ID: req.data.ID } + const keys = { ID: targetID } scanRequest(req.target, keys, req) - DEBUG?.(`[Azure Upload] Uploaded file using updateContentHandler for ${req.target.name}`); + logConfig.debug(`[Azure Upload] Uploaded file using updateContentHandler for ${req.target.name}`) } } else if (req?.data?.note) { - const key = { ID: req.data.ID }; - await super.update(req.target, key, { note: req.data.note }); - DEBUG?.(`[Azure Upload] Updated file upload with note for ${req.target.name}`); + const key = { ID: targetID } + await super.update(req.target, key, { note: req.data.note }) + logConfig.debug(`[Azure Upload] Updated file upload with note for ${req.target.name}`) } else { - next(); + next() } } @@ -218,74 +435,74 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const [draftAttachments, activeAttachments] = await Promise.all([ SELECT.from(draftEntity).columns("url").where(id), SELECT.from(activeEntity).columns("url").where(id) - ]); + ]) - const activeUrls = new Set(activeAttachments.map(a => a.url)); + const activeUrls = new Set(activeAttachments.map(a => a.url)) return draftAttachments .filter(({ url }) => !activeUrls.has(url)) - .map(({ url }) => ({ url })); + .map(({ url }) => ({ url })) } async attachDraftDeletionData(req) { - const draftEntity = cds.model.definitions[req?.target?.name]; - const name = req?.target?.name; - const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined; + const draftEntity = cds.model.definitions[req?.target?.name] + const name = req?.target?.name + const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined - if (!draftEntity || !activeEntity) return; + if (!draftEntity || !activeEntity) return - const diff = await req.diff(); - if (diff._op !== "delete" || !diff.ID) return; + const diff = await req.diff() + if (diff._op !== "delete" || !diff.ID) return const attachmentsToDelete = await this.getAttachmentsToDelete({ draftEntity, activeEntity, id: { ID: diff.ID } - }); + }) if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete; + req.attachmentsToDelete = attachmentsToDelete } } async attachDraftDiscardDeletionData(req) { - const { ID } = req.data; - const parentEntity = req.target.name.split('.').slice(0, -1).join('.'); - const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`]; - const activeEntity = cds.model.definitions[`${parentEntity}.attachments`]; + const { ID } = req.data + const parentEntity = req.target.name.split('.').slice(0, -1).join('.') + const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`] + const activeEntity = cds.model.definitions[`${parentEntity}.attachments`] - if (!draftEntity || !activeEntity) return; + if (!draftEntity || !activeEntity) return const attachmentsToDelete = await this.getAttachmentsToDelete({ draftEntity, activeEntity, id: { up__ID: ID } - }); + }) if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete; + req.attachmentsToDelete = attachmentsToDelete } } registerUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)); - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)); + srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) + srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) srv.prepend(() => { srv.on( "PUT", mediaElement, this.updateContentHandler.bind(this) - ); - }); + ) + }) } registerDraftUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)); - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)); + srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) + srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) // case: attachments uploaded in draft and draft is discarded - srv.before("CANCEL", entity.drafts, this.attachDraftDiscardDeletionData.bind(this)); - srv.after("CANCEL", entity.drafts, this.deleteAttachmentsWithKeys.bind(this)); + srv.before("CANCEL", entity.drafts, this.attachDraftDiscardDeletionData.bind(this)) + srv.after("CANCEL", entity.drafts, this.deleteAttachmentsWithKeys.bind(this)) srv.prepend(() => { if (mediaElement.drafts) { @@ -293,38 +510,38 @@ module.exports = class AzureAttachmentsService extends require("./basic") { "PUT", mediaElement.drafts, this.updateContentHandler.bind(this) - ); + ) // case: attachments uploaded in draft and deleted before saving srv.before( "DELETE", mediaElement.drafts, this.attachDraftDeletionData.bind(this) - ); + ) srv.after( "DELETE", mediaElement.drafts, this.deleteAttachmentsWithKeys.bind(this) - ); + ) } - }); + }) } async delete(blobName, req) { - DEBUG?.(`[Azure Upload] Executing delete for file in ${req.target.name}`); + logConfig.debug(`[Azure Upload] Executing delete for file in ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant; - await this.createAzureClient(tenantID); + const tenantID = req.tenant + await this.createAzureClient(tenantID) } - const blobClient = this.containerClient.getBlockBlobClient(blobName); - const response = await blobClient.delete(); - return response._response.status === 202; + const blobClient = this.containerClient.getBlockBlobClient(blobName) + const response = await blobClient.delete() + return response._response.status === 202 } async deleteInfectedAttachment(Attachments, key, req) { const response = await SELECT.from(Attachments, key).columns('url') - return await this.delete(response.url, req); + return await this.delete(response.url, req) } -}; +} From 0c9b1e7237d280400609fa7893e92f0a545eac05 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 10 Oct 2025 11:10:14 +0200 Subject: [PATCH 03/28] Add Azure Blob Storage settings and refactor tenant ID retrieval in AzureAttachmentsService --- .vscode/settings.json | 4 + lib/azure-blob-storage.js | 4 +- lib/mtx/server.js | 654 +++++++++++++++++++------------------- 3 files changed, 333 insertions(+), 329 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..f72d3b11 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.tabSize": 2, + "editor.indentSize": 2 +} \ No newline at end of file diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 88118b57..287d04ac 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -382,7 +382,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { logConfig.debug(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant + const tenantID = cds.context.tenant await this.createAzureClient(tenantID) } @@ -531,7 +531,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { logConfig.debug(`[Azure Upload] Executing delete for file in ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant + const tenantID = cds.context.tenant await this.createAzureClient(tenantID) } diff --git a/lib/mtx/server.js b/lib/mtx/server.js index c0be1966..50ad6fd5 100644 --- a/lib/mtx/server.js +++ b/lib/mtx/server.js @@ -5,410 +5,410 @@ const { logConfig } = require('../logger') const { S3Client, paginateListObjectsV2, DeleteObjectsCommand } = require('@aws-sdk/client-s3') const PATH = { - SERVICE_INSTANCE: "v1/service_instances", - SERVICE_BINDING: "v1/service_bindings", - SERVICE_PLAN: "v1/service_plans", - SERVICE_OFFERING: "v1/service_offerings" + SERVICE_INSTANCE: "v1/service_instances", + SERVICE_BINDING: "v1/service_bindings", + SERVICE_PLAN: "v1/service_plans", + SERVICE_OFFERING: "v1/service_offerings" } const HTTP_METHOD = { - POST: "post", - GET: "get", - DELETE: "delete" + POST: "post", + GET: "get", + DELETE: "delete" } const STATE = { - SUCCEEDED: "succeeded", - FAILED: "failed", + SUCCEEDED: "succeeded", + FAILED: "failed", } let POLL_WAIT_TIME = 5000 const ASYNC_TIMEOUT = 5 * 60 * 1000 async function wait(milliseconds) { - if (milliseconds <= 0) { - return - } - await new Promise(function (resolve) { - setTimeout(resolve, milliseconds) - }) + if (milliseconds <= 0) { + return + } + await new Promise(function (resolve) { + setTimeout(resolve, milliseconds) + }) } const _serviceManagerRequest = async (sm_url, method, path, token, params = {}) => { - try { - const response = await axios({ - method, - url: `${sm_url}/${path}`, - headers: { - 'Accept': 'application/json', - 'Authorization': `Bearer ${token}` - }, - params - }) + try { + const response = await axios({ + method, + url: `${sm_url}/${path}`, + headers: { + 'Accept': 'application/json', + 'Authorization': `Bearer ${token}` + }, + params + }) - return response?.data?.items?.[0] // Error handling : return undefined instead of crashing when .items is undefined + return response?.data?.items?.[0] // Error handling : return undefined instead of crashing when .items is undefined - } catch (error) { - logConfig.withSuggestion('error', - `Service Manager API request failed - ${method.toUpperCase()} ${path}`, error, - 'Check Service Manager connectivity and credentials', - { method, path, sm_url, params }) - } + } catch (error) { + logConfig.withSuggestion('error', + `Service Manager API request failed - ${method.toUpperCase()} ${path}`, error, + 'Check Service Manager connectivity and credentials', + { method, path, sm_url, params }) + } } const _validateSMCredentials = ({ sm_url, url, clientid, clientsecret, certificate, key }) => { - if (!sm_url || !url) { - throw new Error("Missing Service Manager credentials: 'sm_url' or 'url' is not defined.") - } - - if (!clientid || !clientsecret) { - logConfig.debug('OAuth client credentials not found - checking for MTLS credentials', { sm_url, url, clientid }) - if (!certificate || !key) { - throw new Error("MTLS credentials are also missing: 'certificate' or 'key' is not defined.") - } + if (!sm_url || !url) { + throw new Error("Missing Service Manager credentials: 'sm_url' or 'url' is not defined.") + } + + if (!clientid || !clientsecret) { + logConfig.debug('OAuth client credentials not found - checking for MTLS credentials', { sm_url, url, clientid }) + if (!certificate || !key) { + throw new Error("MTLS credentials are also missing: 'certificate' or 'key' is not defined.") } + } } const _fetchToken = async (url, clientid, clientsecret, certificate, key) => { - try { - const tokenUrl = `${url}/oauth/token` - const headers = { - Accept: "application/json", - "Content-Type": "application/x-www-form-urlencoded", - } - const body = "grant_type=client_credentials" - - // Case 1: OAuth Client Credentials Flow - if (clientid && clientsecret) { - logConfig.debug('Using OAuth client credentials to fetch token.', { url, clientid }) - const response = await axios.post(tokenUrl, null, { - headers, - params: { - grant_type: "client_credentials", - client_id: clientid, - client_secret: clientsecret, - }, - }) - return response.data.access_token - } - - logConfig.debug('OAuth client credentials missing - checking for MTLS credentials', { url, clientid }) + try { + const tokenUrl = `${url}/oauth/token` + const headers = { + Accept: "application/json", + "Content-Type": "application/x-www-form-urlencoded", + } + const body = "grant_type=client_credentials" + + // Case 1: OAuth Client Credentials Flow + if (clientid && clientsecret) { + logConfig.debug('Using OAuth client credentials to fetch token.', { url, clientid }) + const response = await axios.post(tokenUrl, null, { + headers, + params: { + grant_type: "client_credentials", + client_id: clientid, + client_secret: clientsecret, + }, + }) + return response.data.access_token + } - // Case 2: MTLS Flow - if (certificate && key) { - logConfig.debug('MTLS certificate and key found - proceeding with MTLS token fetch.', { url, clientid }) - const agent = new https.Agent({ cert: certificate, key: key }) + logConfig.debug('OAuth client credentials missing - checking for MTLS credentials', { url, clientid }) - const response = await axios.post(tokenUrl, body, { - headers, - httpsAgent: agent, - }) - return response.data.access_token - } + // Case 2: MTLS Flow + if (certificate && key) { + logConfig.debug('MTLS certificate and key found - proceeding with MTLS token fetch.', { url, clientid }) + const agent = new https.Agent({ cert: certificate, key: key }) - // If neither flow is possible - throw new Error("Missing authentication credentials: Provide either OAuth clientid/clientsecret or MTLS certificate/key.") - } catch (error) { - logConfig.withSuggestion('error', - 'Failed to fetch OAuth token using provided credentials', error, - 'Verify Service Manager credentials and connectivity') - throw error + const response = await axios.post(tokenUrl, body, { + headers, + httpsAgent: agent, + }) + return response.data.access_token } + + // If neither flow is possible + throw new Error("Missing authentication credentials: Provide either OAuth clientid/clientsecret or MTLS certificate/key.") + } catch (error) { + logConfig.withSuggestion('error', + 'Failed to fetch OAuth token using provided credentials', error, + 'Verify Service Manager credentials and connectivity') + throw error + } } const _getOfferingID = async (sm_url, token) => { - const offerings = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_OFFERING, token, { fieldQuery: "name eq 'objectstore'" }) - const offeringID = offerings.id - if (!offeringID) logConfig.debug('Object store service offering not found in Service Manager', { sm_url }) - return offeringID + const offerings = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_OFFERING, token, { fieldQuery: "name eq 'objectstore'" }) + const offeringID = offerings.id + if (!offeringID) logConfig.debug('Object store service offering not found in Service Manager', { sm_url }) + return offeringID } const _getPlanID = async (sm_url, token, offeringID) => { - // Recheck the fieldQuery for catalog_name - const supportedPlans = ["standard", "s3-standard"] - for (const planName of supportedPlans) { - try { - const plan = await _serviceManagerRequest( - sm_url, - HTTP_METHOD.GET, - PATH.SERVICE_PLAN, - token, - { - fieldQuery: `service_offering_id eq '${offeringID}' and catalog_name eq '${planName}'`, - } - ) - if (plan?.id) { - logConfig.debug('Using object store plan', { planName, planID: plan.id }) - return plan.id - } - } catch (error) { - logConfig.withSuggestion('error', - `Failed to fetch plan "${planName}" from Service Manager`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, offeringID, planName }) + // Recheck the fieldQuery for catalog_name + const supportedPlans = ["standard", "s3-standard"] + for (const planName of supportedPlans) { + try { + const plan = await _serviceManagerRequest( + sm_url, + HTTP_METHOD.GET, + PATH.SERVICE_PLAN, + token, + { + fieldQuery: `service_offering_id eq '${offeringID}' and catalog_name eq '${planName}'`, } + ) + if (plan?.id) { + logConfig.debug('Using object store plan', { planName, planID: plan.id }) + return plan.id + } + } catch (error) { + logConfig.withSuggestion('error', + `Failed to fetch plan "${planName}" from Service Manager`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, offeringID, planName }) } - logConfig.debug('No supported object store service plan found in Service Manager', { sm_url, attempted: supportedPlans.join(", ") }) - throw new Error( - `No supported object store service plan found in Service Manager.` - ) + } + logConfig.debug('No supported object store service plan found in Service Manager', { sm_url, attempted: supportedPlans.join(", ") }) + throw new Error( + `No supported object store service plan found in Service Manager.` + ) } const _createObjectStoreInstance = async (sm_url, tenant, planID, token) => { - try { - const response = await axios.post(`${sm_url}/v1/service_instances`, { - name: `object-store-${tenant}-${cds.utils.uuid()}`, - service_plan_id: planID, - parameters: {}, - labels: { tenant_id: [tenant], service: ["OBJECT_STORE"] } - }, { - headers: { - 'Accept': 'application/json', - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json' - } - }) - const instancePath = response.headers.location.substring(1) - const instanceId = await _pollUntilDone(sm_url, instancePath, token) - return instanceId.data.resource_id - } catch (error) { - logConfig.withSuggestion('error', - `Failed to create object store instance for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, tenant, planID }) - } + try { + const response = await axios.post(`${sm_url}/v1/service_instances`, { + name: `object-store-${tenant}-${cds.utils.uuid()}`, + service_plan_id: planID, + parameters: {}, + labels: { tenant_id: [tenant], service: ["OBJECT_STORE"] } + }, { + headers: { + 'Accept': 'application/json', + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' + } + }) + const instancePath = response.headers.location.substring(1) + const instanceId = await _pollUntilDone(sm_url, instancePath, token) + return instanceId.data.resource_id + } catch (error) { + logConfig.withSuggestion('error', + `Failed to create object store instance for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, tenant, planID }) + } } const _pollUntilDone = async (sm_url, instancePath, token) => { - try { - let iteration = 1 - const startTime = Date.now() - let isReady = false - while (!isReady) { - await wait(POLL_WAIT_TIME * iteration) - iteration++ - - const instanceStatus = await axios.get(`${sm_url}/${instancePath}`, { - headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } - }) - - if (instanceStatus.data.state === STATE.SUCCEEDED) { - isReady = true - return instanceStatus - } - - if (Date.now() - startTime > ASYNC_TIMEOUT) { - logConfig.debug('Timed out waiting for service instance to be ready', { instancePath, sm_url }) - } - - if (instanceStatus.data.state === STATE.FAILED) { - logConfig.debug('Service instance creation failed', { instancePath, sm_url, details: instanceStatus.data }) - } - } - } catch (error) { - logConfig.withSuggestion('error', - 'Error polling for object store instance readiness', error, - 'Check Service Manager connectivity and instance status', - { sm_url, instancePath }) + try { + let iteration = 1 + const startTime = Date.now() + let isReady = false + while (!isReady) { + await wait(POLL_WAIT_TIME * iteration) + iteration++ + + const instanceStatus = await axios.get(`${sm_url}/${instancePath}`, { + headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } + }) + + if (instanceStatus.data.state === STATE.SUCCEEDED) { + isReady = true + return instanceStatus + } + + if (Date.now() - startTime > ASYNC_TIMEOUT) { + logConfig.debug('Timed out waiting for service instance to be ready', { instancePath, sm_url }) + } + + if (instanceStatus.data.state === STATE.FAILED) { + logConfig.debug('Service instance creation failed', { instancePath, sm_url, details: instanceStatus.data }) + } } + } catch (error) { + logConfig.withSuggestion('error', + 'Error polling for object store instance readiness', error, + 'Check Service Manager connectivity and instance status', + { sm_url, instancePath }) + } } const _bindObjectStoreInstance = async (sm_url, tenant, instanceID, token) => { - if (instanceID) { - try { - const response = await axios.post(`${sm_url}/${PATH.SERVICE_BINDING}`, { - name: `object-store-${tenant}-${cds.utils.uuid()}`, - service_instance_id: instanceID, - parameters: {}, - labels: { tenant_id: [tenant], service: ["OBJECT_STORE"] } - }, { - headers: { - 'Accept': 'application/json', - 'Authorization': `Bearer ${token}`, - 'Content-Type': 'application/json' - } - }) - return response.data.id - } catch (error) { - logConfig.withSuggestion('error', - `Error binding object store instance for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, tenant, instanceID }) + if (instanceID) { + try { + const response = await axios.post(`${sm_url}/${PATH.SERVICE_BINDING}`, { + name: `object-store-${tenant}-${cds.utils.uuid()}`, + service_instance_id: instanceID, + parameters: {}, + labels: { tenant_id: [tenant], service: ["OBJECT_STORE"] } + }, { + headers: { + 'Accept': 'application/json', + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json' } + }) + return response.data.id + } catch (error) { + logConfig.withSuggestion('error', + `Error binding object store instance for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, tenant, instanceID }) } + } } const _getBindingIdForDeletion = async (sm_url, tenant, token) => { - try { - const getBindingCredentials = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_BINDING, token, { - labelQuery: `service eq 'OBJECT_STORE' and tenant_id eq '${tenant}'` - }) - if (!getBindingCredentials?.id) { - logConfig.warn('No binding credentials found for tenant during deletion', { tenant }) - return null // Handle missing data gracefully - } - return getBindingCredentials.id - - } catch (error) { - logConfig.withSuggestion('error', - `Error fetching binding credentials for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, tenant }) + try { + const getBindingCredentials = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_BINDING, token, { + labelQuery: `service eq 'OBJECT_STORE' and tenant_id eq '${tenant}'` + }) + if (!getBindingCredentials?.id) { + logConfig.warn('No binding credentials found for tenant during deletion', { tenant }) + return null // Handle missing data gracefully } + return getBindingCredentials.id + + } catch (error) { + logConfig.withSuggestion('error', + `Error fetching binding credentials for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, tenant }) + } } const _deleteBinding = async (sm_url, bindingID, token) => { - if (bindingID) { - try { - await axios.delete(`${sm_url}/${PATH.SERVICE_BINDING}/${bindingID}`, { - headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } - }) - } catch (error) { - logConfig.withSuggestion('error', - `Error deleting binding - ${bindingID}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, bindingID }) - } - } else { - logConfig.warn('No binding ID provided for deletion, skipping delete operation') + if (bindingID) { + try { + await axios.delete(`${sm_url}/${PATH.SERVICE_BINDING}/${bindingID}`, { + headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } + }) + } catch (error) { + logConfig.withSuggestion('error', + `Error deleting binding - ${bindingID}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, bindingID }) } + } else { + logConfig.warn('No binding ID provided for deletion, skipping delete operation') + } } const _getInstanceIdForDeletion = async (sm_url, tenant, token) => { + try { + const instanceId = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_INSTANCE, token, { labelQuery: `service eq 'OBJECT_STORE' and tenant_id eq '${tenant}'` }) + return instanceId.id + } catch (error) { + logConfig.withSuggestion('error', + `Error fetching service instance id for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, tenant }) + } +} + +const _deleteObjectStoreInstance = async (sm_url, instanceID, token) => { + if (instanceID) { try { - const instanceId = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_INSTANCE, token, { labelQuery: `service eq 'OBJECT_STORE' and tenant_id eq '${tenant}'` }) - return instanceId.id + const response = await axios.delete(`${sm_url}/${PATH.SERVICE_INSTANCE}/${instanceID}`, { + headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } + }) + const instancePath = response.headers.get("location").substring(1) + await _pollUntilDone(sm_url, instancePath, token) // remove + logConfig.debug('Object store instance deleted', { instanceID }) } catch (error) { - logConfig.withSuggestion('error', - `Error fetching service instance id for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, tenant }) + logConfig.withSuggestion('error', + `Error deleting object store instance - ${instanceID}`, error, + 'Check Service Manager connectivity and credentials', + { sm_url, instanceID }) } + } } -const _deleteObjectStoreInstance = async (sm_url, instanceID, token) => { - if (instanceID) { +cds.on('listening', async () => { + const profile = cds.env.profile + const objectStoreKind = cds.env.requires?.attachments?.objectStore?.kind + if (profile === 'mtx-sidecar') { + const ds = await cds.connect.to("cds.xt.DeploymentService") + if (objectStoreKind === "separate") { + ds.after('subscribe', async (_, req) => { + const { tenant } = req.data try { - const response = await axios.delete(`${sm_url}/${PATH.SERVICE_INSTANCE}/${instanceID}`, { - headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${token}` } - }) - const instancePath = response.headers.get("location").substring(1) - await _pollUntilDone(sm_url, instancePath, token) // remove - logConfig.debug('Object store instance deleted', { instanceID }) + const serviceManagerCredentials = cds.env.requires?.serviceManager?.credentials || {} + const { sm_url, url, clientid, clientsecret, certificate, key } = serviceManagerCredentials + + _validateSMCredentials({ sm_url, url, clientid, clientsecret, certificate, key }) + + const token = await _fetchToken(url, clientid, clientsecret, certificate, key) + + const offeringID = await _getOfferingID(sm_url, token) + + const planID = await _getPlanID(sm_url, token, offeringID) + + const instanceID = await _createObjectStoreInstance(sm_url, tenant, planID, token) + logConfig.debug('Object Store instance created', { tenant, instanceID }) + + await _bindObjectStoreInstance(sm_url, tenant, instanceID, token) } catch (error) { - logConfig.withSuggestion('error', - `Error deleting object store instance - ${instanceID}`, error, - 'Check Service Manager connectivity and credentials', - { sm_url, instanceID }) + logConfig.withSuggestion('error', + `Error setting up object store for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { tenant }) } - } -} + }) -cds.on('listening', async () => { - const profile = cds.env.profile - const objectStoreKind = cds.env.requires?.attachments?.objectStore?.kind - if (profile === 'mtx-sidecar') { - const ds = await cds.connect.to("cds.xt.DeploymentService") - if (objectStoreKind === "separate") { - ds.after('subscribe', async (_, req) => { - const { tenant } = req.data - try { - const serviceManagerCredentials = cds.env.requires?.serviceManager?.credentials || {} - const { sm_url, url, clientid, clientsecret, certificate, key } = serviceManagerCredentials - - _validateSMCredentials({ sm_url, url, clientid, clientsecret, certificate, key }) - - const token = await _fetchToken(url, clientid, clientsecret, certificate, key) - - const offeringID = await _getOfferingID(sm_url, token) - - const planID = await _getPlanID(sm_url, token, offeringID) - - const instanceID = await _createObjectStoreInstance(sm_url, tenant, planID, token) - logConfig.debug('Object Store instance created', { tenant, instanceID }) - - await _bindObjectStoreInstance(sm_url, tenant, instanceID, token) - } catch (error) { - logConfig.withSuggestion('error', - `Error setting up object store for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { tenant }) - } - }) + ds.after('unsubscribe', async (_, req) => { + const { tenant } = req.data + try { + const serviceManagerCredentials = cds.env.requires?.serviceManager?.credentials || {} + const { sm_url, url, clientid, clientsecret, certificate, key } = serviceManagerCredentials + + _validateSMCredentials({ sm_url, url, clientid, clientsecret, certificate, key }) - ds.after('unsubscribe', async (_, req) => { - const { tenant } = req.data - try { - const serviceManagerCredentials = cds.env.requires?.serviceManager?.credentials || {} - const { sm_url, url, clientid, clientsecret, certificate, key } = serviceManagerCredentials + const token = await _fetchToken(url, clientid, clientsecret, certificate, key) - _validateSMCredentials({ sm_url, url, clientid, clientsecret, certificate, key }) + const bindingID = await _getBindingIdForDeletion(sm_url, tenant, token) - const token = await _fetchToken(url, clientid, clientsecret, certificate, key) + await _deleteBinding(sm_url, bindingID, token) - const bindingID = await _getBindingIdForDeletion(sm_url, tenant, token) + const service_instance_id = await _getInstanceIdForDeletion(sm_url, tenant, token) - await _deleteBinding(sm_url, bindingID, token) + await _deleteObjectStoreInstance(sm_url, service_instance_id, token) + } catch (error) { + logConfig.withSuggestion('error', + `Error deleting object store service for tenant - ${tenant}`, error, + 'Check Service Manager connectivity and credentials', + { tenant }) + } - const service_instance_id = await _getInstanceIdForDeletion(sm_url, tenant, token) + }) + } else if (objectStoreKind === "shared") { + ds.after('unsubscribe', async (_, req) => { + const { tenant } = req.data - await _deleteObjectStoreInstance(sm_url, service_instance_id, token) - } catch (error) { - logConfig.withSuggestion('error', - `Error deleting object store service for tenant - ${tenant}`, error, - 'Check Service Manager connectivity and credentials', - { tenant }) - } + const creds = cds.env.requires?.objectStore?.credentials + if (!creds) throw new Error("SAP Object Store instance credentials not found.") - }) - } else if (objectStoreKind === "shared") { - ds.after('unsubscribe', async (_, req) => { - const { tenant } = req.data - - const creds = cds.env.requires?.objectStore?.credentials - if (!creds) throw new Error("SAP Object Store instance credentials not found.") - - const client = new S3Client({ - region: creds.region, - credentials: { - accessKeyId: creds.access_key_id, - secretAccessKey: creds.secret_access_key, - }, - }) - - const bucket = creds.bucket - const keysToDelete = [] - - try { - const paginator = paginateListObjectsV2({ client }, { - Bucket: bucket, - Prefix: tenant, - }) - - for await (const page of paginator) { - page.Contents?.forEach(obj => { - keysToDelete.push({ Key: obj.Key }) - }) - } - - if (keysToDelete.length > 0) { - await client.send(new DeleteObjectsCommand({ - Bucket: bucket, - Delete: { Objects: keysToDelete }, - })) - logConfig.debug('S3 objects deleted for tenant', { tenant, deletedCount: keysToDelete.length }) - } else { - logConfig.debug('No S3 objects found for tenant during cleanup', { tenant }) - } - } catch (error) { - logConfig.withSuggestion('error', - `Failed to clean up S3 objects for tenant "${tenant}"`, error, - 'Check AWS S3 connectivity and permissions', - { tenant }) - } - }) + const client = new S3Client({ + region: creds.region, + credentials: { + accessKeyId: creds.access_key_id, + secretAccessKey: creds.secret_access_key, + }, + }) + const bucket = creds.bucket + const keysToDelete = [] + + try { + const paginator = paginateListObjectsV2({ client }, { + Bucket: bucket, + Prefix: tenant, + }) + + for await (const page of paginator) { + page.Contents?.forEach(obj => { + keysToDelete.push({ Key: obj.Key }) + }) + } + + if (keysToDelete.length > 0) { + await client.send(new DeleteObjectsCommand({ + Bucket: bucket, + Delete: { Objects: keysToDelete }, + })) + logConfig.debug('S3 objects deleted for tenant', { tenant, deletedCount: keysToDelete.length }) + } else { + logConfig.debug('No S3 objects found for tenant during cleanup', { tenant }) + } + } catch (error) { + logConfig.withSuggestion('error', + `Failed to clean up S3 objects for tenant "${tenant}"`, error, + 'Check AWS S3 connectivity and permissions', + { tenant }) } + }) + } - module.exports = cds.server + } + module.exports = cds.server }) From 5e6939ad455139d3d4f35ef7b79d3cc824a423b7 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 10 Oct 2025 11:16:31 +0200 Subject: [PATCH 04/28] Refactor AzureAttachmentsService to improve content handling in the put method --- lib/azure-blob-storage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 287d04ac..2f14c828 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -195,7 +195,8 @@ module.exports = class AzureAttachmentsService extends require("./basic") { ) } - const { content = _content, ...metadata } = data + let content = _content + const { ...metadata } = data const blobName = metadata.url if (!blobName) { From d9023589db28c0b71617327201c5a90fd3c3b5c0 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 10 Oct 2025 12:32:06 +0200 Subject: [PATCH 05/28] Update error message for missing Azure Blob Storage credentials in AzureAttachmentsService --- lib/azure-blob-storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 2f14c828..3913528c 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -34,7 +34,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { if (!creds) { logConfig.configValidation('objectStore.credentials', creds, false, 'Bind an Azure Blob Storage instance to your application or configure separateObjectStore for multitenancy') - throw new Error("Azure Blob Storage credentials are not provided.") + throw new Error("SAP Object Store instance is not bound.") } // Validate required credentials From 5b810b3ae66030fd7579d2b0c450d0823f00df9a Mon Sep 17 00:00:00 2001 From: Simon Kobler <32038731+KoblerS@users.noreply.github.com> Date: Fri, 10 Oct 2025 13:17:20 +0200 Subject: [PATCH 06/28] Add retry logic for Cloud Foundry login in deployment action (#262) --- .github/actions/deploy/action.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/actions/deploy/action.yml b/.github/actions/deploy/action.yml index 55158562..345c8479 100644 --- a/.github/actions/deploy/action.yml +++ b/.github/actions/deploy/action.yml @@ -37,7 +37,15 @@ runs: shell: bash run: | echo "::debug::CF_API=${{ inputs.CF_API }}" - cf login -a ${{ inputs.CF_API }} -u ${{ inputs.CF_USERNAME }} -p ${{ inputs.CF_PASSWORD }} -o ${{ inputs.CF_ORG }} -s ${{ inputs.CF_SPACE }} + for i in {1..3}; do + cf login -a ${{ inputs.CF_API }} -u ${{ inputs.CF_USERNAME }} -p ${{ inputs.CF_PASSWORD }} -o ${{ inputs.CF_ORG }} -s ${{ inputs.CF_SPACE }} && break + echo "cf login failed, retrying ($i/3)..." + sleep 10 + if [ "$i" -eq 3 ]; then + echo "❌ cf login failed after 3 attempts." + exit 1 + fi + done - name: Install Multi-Target Application Build Tool (MBT) shell: bash From 6dfa7c461092014a9c5b8b33195437332d16b5de Mon Sep 17 00:00:00 2001 From: Marvin Date: Fri, 10 Oct 2025 15:07:20 +0200 Subject: [PATCH 07/28] 258 chore remove cross dependency from tests (#259) This pr: - changes the attachment tests so they aren't dependent on one another - added a clearing of the attachments before and after each test - added helper functions to reduce redundant code - documented these helper functions if they are ever needed again Closes: #258 --------- Co-authored-by: Marten Schiwek Co-authored-by: Simon Kobler <32038731+KoblerS@users.noreply.github.com> --- eslint.config.mjs | 13 +- jest.config.js | 6 +- lib/malwareScanner.js | 3 +- .../integration/attachments-non-draft.test.js | 151 +++++-- tests/integration/attachments.test.js | 391 ++++++++++-------- tests/utils/api.js | 38 +- tests/utils/testUtils.js | 12 + 7 files changed, 367 insertions(+), 247 deletions(-) create mode 100644 tests/utils/testUtils.js diff --git a/eslint.config.mjs b/eslint.config.mjs index 2c4773ef..35d89d4a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,2 +1,11 @@ -import cds from '@sap/cds/eslint.config.mjs' -export default [ ...cds ] +import cds from "@sap/cds/eslint.config.mjs" +export default [ + ...cds, + { + name: 'test-files-config', + files: ["tests/**/*"], + rules: { + 'no-console': 'off', + } + }, +] diff --git a/jest.config.js b/jest.config.js index 63d7b107..e7032439 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,9 @@ const config = { - testTimeout: 42222, + testTimeout: 60000, testMatch: ['**/*.test.js'], - setupFilesAfterEnv: ['/tests/setup.js'] + setupFilesAfterEnv: ['/tests/setup.js'], + forceExit: true, + detectOpenHandles: true } module.exports = config \ No newline at end of file diff --git a/lib/malwareScanner.js b/lib/malwareScanner.js index efe2e126..7c8e1772 100644 --- a/lib/malwareScanner.js +++ b/lib/malwareScanner.js @@ -51,7 +51,7 @@ async function scanRequest(Attachments, key, req) { logConfig.info('Setting scan status to Clean (development mode)', { fileId: key.ID }) updateStatus(AttachmentsSrv, key, "Clean", currEntity, draftEntity, activeEntity) .catch(e => logConfig.error('Failed to update scan status', e, { fileId: key.ID })) - }, 5000).unref() + }, 1000).unref() return } else { logConfig.debug('Skipping scan - not in development/test mode', { @@ -175,7 +175,6 @@ async function entryExists(Attachments, key) { } } - function getCredentials() { try { const credentials = cds.env.requires?.malwareScanner?.credentials diff --git a/tests/integration/attachments-non-draft.test.js b/tests/integration/attachments-non-draft.test.js index 967da482..daf1ce49 100644 --- a/tests/integration/attachments-non-draft.test.js +++ b/tests/integration/attachments-non-draft.test.js @@ -1,13 +1,24 @@ const path = require("path") const fs = require("fs") const cds = require("@sap/cds") -const { commentAnnotation, uncommentAnnotation } = require("../utils/modify-annotation") +const { test } = cds.test() +const { + commentAnnotation, + uncommentAnnotation, +} = require("../utils/modify-annotation") +const { delay } = require("../utils/testUtils") -const servicesCdsPath = path.resolve(__dirname, '../incidents-app/srv/services.cds') -const annotationsCdsPath = path.resolve(__dirname, '../incidents-app/app/incidents/annotations.cds') +const servicesCdsPath = path.resolve( + __dirname, + "../incidents-app/srv/services.cds" +) +const annotationsCdsPath = path.resolve( + __dirname, + "../incidents-app/app/incidents/annotations.cds" +) const linesToComment = [ - 'annotate ProcessorService.Incidents with @odata.draft.enabled', - 'annotate service.Incidents with @odata.draft.enabled' + "annotate ProcessorService.Incidents with @odata.draft.enabled", + "annotate service.Incidents with @odata.draft.enabled", ] beforeAll(async () => { @@ -18,18 +29,25 @@ beforeAll(async () => { const app = path.resolve(__dirname, "../incidents-app") const { expect, axios } = require("@cap-js/cds-test")(app) -axios.defaults.auth = { username: "alice" } -jest.setTimeout(5 * 60 * 1000) - -let attachmentID = null let incidentID = "3ccf474c-3881-44b7-99fb-59a2a4668418" afterAll(async () => { - await uncommentAnnotation(servicesCdsPath, linesToComment) - await uncommentAnnotation(annotationsCdsPath, linesToComment) + try { + await uncommentAnnotation(servicesCdsPath, linesToComment) + await uncommentAnnotation(annotationsCdsPath, linesToComment) + + // Close any remaining CDS connections + cds.disconnect() + } catch (error) { + console.warn("Warning: Error during cleanup:", error.message) + } }) describe("Tests for uploading/deleting and fetching attachments through API calls with non draft mode", () => { + axios.defaults.auth = { username: "alice" } + const { createAttachmentMetadata, uploadAttachmentContent } = + createHelpers(axios) + beforeAll(async () => { cds.env.requires.db.kind = "sql" cds.env.requires.attachments.kind = "db" @@ -39,72 +57,121 @@ describe("Tests for uploading/deleting and fetching attachments through API call cds.env.profiles = ["development"] }) + beforeEach(async () => { + // Clean up any existing attachments before each test + await test.data.reset() + }) + it("should create attachment metadata", async () => { - const response = await axios.post( - `/odata/v4/processor/Incidents(${incidentID})/attachments`, - { filename: "sample.pdf" }, - { headers: { "Content-Type": "application/json" } } - ) - expect(response.status).to.equal(201) - expect(response.data).to.have.property("ID") - attachmentID = response.data.ID + const attachmentID = await createAttachmentMetadata(incidentID) + expect(attachmentID).to.exist }) it("should upload attachment content", async () => { - const fileContent = fs.readFileSync(path.join(__dirname, 'content/sample.pdf')) - const response = await axios.put( - `/odata/v4/processor/Incidents(${incidentID})/attachments(up__ID=${incidentID},ID=${attachmentID})/content`, - fileContent, - { - headers: { - "Content-Type": "application/pdf", - "Content-Length": fileContent.length - } - } - ) + const attachmentID = await createAttachmentMetadata(incidentID) + const response = await uploadAttachmentContent(incidentID, attachmentID) expect(response.status).to.equal(204) }) it("should list attachments for incident", async () => { - await new Promise(resolve => setTimeout(resolve, 5000)) + const attachmentID = await createAttachmentMetadata(incidentID) + await uploadAttachmentContent(incidentID, attachmentID) + + // Wait for scanning to complete + await delay() + const response = await axios.get( `/odata/v4/processor/Incidents(ID=${incidentID})/attachments` ) expect(response.status).to.equal(200) - expect(response.data.value[0].up__ID).to.equal(incidentID) - expect(response.data.value[0].filename).to.equal("sample.pdf") - expect(response.data.value[0].content).to.be.undefined + + const expectedFilename = "sample.pdf" + const expectedStatus = "Clean" + const attachment = response.data.value[0] + + expect(attachment.up__ID).to.equal(incidentID) + expect(attachment.filename).to.equal(expectedFilename) + expect(attachment.status).to.equal(expectedStatus) + expect(attachment.content).to.be.undefined expect(response.data.value[0].ID).to.equal(attachmentID) - expect(response.data.value[0].status).to.equal("Clean") }) it("Fetching the content of the uploaded attachment", async () => { + const attachmentID = await createAttachmentMetadata(incidentID) + await uploadAttachmentContent(incidentID, attachmentID) + + // Wait for scanning to complete + await delay() + const response = await axios.get( `/odata/v4/processor/Incidents(ID=${incidentID})/attachments(up__ID=${incidentID},ID=${attachmentID})/content`, - { responseType: 'arraybuffer' } + { responseType: "arraybuffer" } ) expect(response.status).to.equal(200) expect(response.data).to.exist expect(response.data.length).to.be.greaterThan(0) - const originalContent = fs.readFileSync(path.join(__dirname, 'content/sample.pdf')) + const originalContent = fs.readFileSync( + path.join(__dirname, "content/sample.pdf") + ) expect(Buffer.compare(response.data, originalContent)).to.equal(0) }) - it("Deleting the uploaded attachment", async () => { - const response = await axios.delete( + it("should delete attachment and verify deletion", async () => { + const attachmentID = await createAttachmentMetadata(incidentID) + await uploadAttachmentContent(incidentID, attachmentID) + + // Wait for scanning to complete + await delay() + + // Delete the attachment + const deleteResponse = await axios.delete( `/odata/v4/processor/Incidents(ID=${incidentID})/attachments(up__ID=${incidentID},ID=${attachmentID})` ) - expect(response.status).to.equal(204) - }) + expect(deleteResponse.status).to.equal(204) - it("Verifying the attachment is deleted", async () => { + // Verify the attachment is deleted try { await axios.get( `/odata/v4/processor/Incidents(ID=${incidentID})/attachments(up__ID=${incidentID},ID=${attachmentID})` ) + // Should not reach here + expect.fail("Expected 404 error") } catch (err) { expect(err.response.status).to.equal(404) } }) }) + +function createHelpers(axios) { + return { + createAttachmentMetadata: async (incidentID, filename = "sample.pdf") => { + const response = await axios.post( + `/odata/v4/processor/Incidents(${incidentID})/attachments`, + { filename: filename }, + { headers: { "Content-Type": "application/json" } } + ) + return response.data.ID + }, + uploadAttachmentContent: async ( + incidentID, + attachmentID, + contentPath = "content/sample.pdf" + ) => { + const fileContent = fs.readFileSync( + path.join(__dirname, "..", "integration", contentPath) + ) + const response = await axios.put( + `/odata/v4/processor/Incidents(${incidentID})/attachments(up__ID=${incidentID},ID=${attachmentID})/content`, + fileContent, + { + headers: { + "Content-Type": "application/pdf", + "Content-Length": fileContent.length, + }, + } + ) + return response + }, + } +} diff --git a/tests/integration/attachments.test.js b/tests/integration/attachments.test.js index 27e744a1..044404cb 100644 --- a/tests/integration/attachments.test.js +++ b/tests/integration/attachments.test.js @@ -1,233 +1,208 @@ const cds = require("@sap/cds") const path = require("path") -const app = path.resolve(__dirname, "../incidents-app") -const { expect, axios, GET, POST, DELETE } = require("@cap-js/cds-test")(app) const { RequestSend } = require("../utils/api") +const { delay } = require("../utils/testUtils") const { createReadStream } = cds.utils.fs const { join } = cds.utils.path +const app = path.join(__dirname, "../incidents-app") +const { test, expect, axios, GET, POST, DELETE } = cds.test(app) axios.defaults.auth = { username: "alice" } -jest.setTimeout(5 * 60 * 1000) let utils = null -let sampleDocID = null -let incidentID = null +const incidentID = "3ccf474c-3881-44b7-99fb-59a2a4668418" describe("Tests for uploading/deleting attachments through API calls - in-memory db", () => { beforeAll(async () => { + // Set environment before any connections cds.env.requires.db.kind = "sql" cds.env.requires.attachments.kind = "db" - await cds.connect.to("sql:my.db") - await cds.connect.to("attachments") cds.env.requires.attachments.scan = false cds.env.profiles = ["development"] - sampleDocID = null - incidentID = "3ccf474c-3881-44b7-99fb-59a2a4668418" + + // Connect to services + await cds.connect.to("sql:my.db") + await cds.connect.to("attachments") + + // Initialize test variables + utils = new RequestSend(POST) }) + + beforeEach(async () => { + await test.data.reset() + }) + //Draft mode uploading attachment it("Uploading attachment in draft mode with scanning enabled", async () => { - //function to upload attachment - let action = await POST.bind( - {}, - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=false)/attachments`, - { - up__ID: incidentID, - filename: "sample.pdf", - mimeType: "application/pdf", - content: createReadStream(join(__dirname, "content/sample.pdf")), - createdAt: new Date( - Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000 - ), - createdBy: "alice", - } - ) + let sampleDocID = null - try { - //trigger to upload attachment - await utils.draftModeActions( - "processor", - "Incidents", - incidentID, - "ProcessorService", - action - ) - } catch (err) { - expect(err).to.be.undefined - } + // Upload attachment using helper function + sampleDocID = await uploadDraftAttachment(utils, POST, GET, incidentID) + expect(sampleDocID).to.not.be.null //read attachments list for Incident - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` - ) - //the data should have only one attachment - expect(response.status).to.equal(200) - expect(response.data.value.length).to.equal(1) - //to make sure content is not read - expect(response.data.value[0].content).to.be.undefined - sampleDocID = response.data.value[0].ID - } catch (err) { - expect(err).to.be.undefined - } + const attachmentResponse = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` + ) + //the data should have only one attachment + expect(attachmentResponse.status).to.equal(200) + expect(attachmentResponse.data.value.length).to.equal(1) + //to make sure content is not read + expect(attachmentResponse.data.value[0].content).to.be.undefined + sampleDocID = attachmentResponse.data.value[0].ID //read attachment in active table - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` - ) - expect(response.status).to.equal(200) - expect(response.data).to.not.be.undefined - } catch (err) { - expect(err).to.be.undefined - } - + const contentResponse = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` + ) + expect(contentResponse.status).to.equal(200) + expect(contentResponse.data).to.not.be.undefined // Check Scanning status - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` - ) - expect(response.status).to.equal(200) - expect(response.data.value.length).to.equal(1) - expect(response.data.value[0].status).to.equal("Scanning") // Initial status should be Scanning - - } catch (err) { - - expect(err).to.be.undefined - } + const scanResponse = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` + ) + expect(scanResponse.status).to.equal(200) + expect(scanResponse.data.value.length).to.equal(1) + expect(scanResponse.data.value[0].status).to.equal("Scanning") // Initial status should be Scanning - //Mocking scanning timer for at least 5 seconds - await new Promise(resolve => setTimeout(resolve, 5000)) + // Wait for scanning to complete + await delay() //Check clean status - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` - ) - expect(response.status).to.equal(200) - expect(response.data.value.length).to.equal(1) - expect(response.data.value[0].status).to.equal("Clean") - } catch (err) { - expect(err).to.be.undefined - } + const resultResponse = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` + ) + expect(resultResponse.status).to.equal(200) + expect(resultResponse.data.value.length).to.equal(1) + expect(resultResponse.data.value[0].status).to.equal("Clean") }) it("Scan status is translated", async () => { //function to upload attachment - let action = await POST.bind( - {}, - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=false)/attachments`, - { - up__ID: incidentID, - filename: "sample.pdf", - mimeType: "application/pdf", - content: createReadStream(join(__dirname, "content/sample.pdf")), - createdAt: new Date( - Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000 - ), - createdBy: "alice", - } - ) - - try { - //trigger to upload attachment - await utils.draftModeActions( - "processor", - "Incidents", - incidentID, - "ProcessorService", - action + let action = () => + POST( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=false)/attachments`, + { + up__ID: incidentID, + filename: "sample.pdf", + mimeType: "application/pdf", + content: createReadStream(join(__dirname, "content/sample.pdf")), + createdAt: new Date( + Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000 + ), + createdBy: "alice", + } ) - } catch (err) { - expect(err).to.be.undefined - } - - const scanStatesEN = await cds.run(SELECT.from('sap.attachments.ScanStates')); - const scanStatesDE = await cds.run(SELECT.localized.from('sap.attachments.ScanStates').columns('code', `texts[locale='de'].name as name`)) + + //trigger to upload attachment + await utils.draftModeEdit("processor", "Incidents", incidentID, "ProcessorService") + await utils.draftModeSave("processor", "Incidents", incidentID, action, "ProcessorService") + + const scanStatesEN = await cds.run( + SELECT.from("sap.attachments.ScanStates") + ) + const scanStatesDE = await cds.run( + SELECT.localized + .from("sap.attachments.ScanStates") + .columns("code", `texts[locale='de'].name as name`) + ) // Check Scanning status const response = await GET( `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments?$expand=statusNav($select=name,code)` ) expect(response.status).to.equal(200) - expect(response.data.value.length).to.equal(2) - expect(response.data.value[0].statusNav.name).to.equal(scanStatesEN.find(state => state.code === response.data.value[0].status).name) + expect(response.data.value.length).to.equal(1) + expect(response.data.value[0].statusNav.name).to.equal( + scanStatesEN.find((state) => state.code === response.data.value[0].status) + .name + ) const responseDE = await GET( `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments?$expand=statusNav($select=name,code)&sap-locale=de` ) expect(responseDE.status).to.equal(200) - expect(responseDE.data.value.length).to.equal(2) - expect(responseDE.data.value[0].statusNav.name).to.equal(scanStatesDE.find(state => state.code === responseDE.data.value[0].status).name) + expect(responseDE.data.value.length).to.equal(1) + expect(responseDE.data.value[0].statusNav.name).to.equal( + scanStatesDE.find( + (state) => state.code === responseDE.data.value[0].status + ).name + ) }) //Deleting the attachment it("Deleting the attachment", async () => { + let sampleDocID = null + + // First upload an attachment to delete + sampleDocID = await uploadDraftAttachment(utils, POST, GET, incidentID) + expect(sampleDocID).to.not.be.null + + // Wait for scanning to complete + await delay() + //check the content of the uploaded attachment in main table - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` - ) - expect(response.status).to.equal(200) - } catch (err) { - expect(err).to.be.undefined - } - //delete attachment - let action = await DELETE.bind( - {}, - `odata/v4/processor/Incidents_attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=false)` + const contentResponse = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` ) - try { - //trigger to delete attachment - await utils.draftModeActions( - "processor", - "Incidents", - incidentID, - "ProcessorService", - action + expect(contentResponse.status).to.equal(200) + + //delete attachment + let action = () => + DELETE( + `odata/v4/processor/Incidents_attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=false)` ) - } catch (err) { - expect(err).to.be.undefined - } + //trigger to delete attachment + await utils.draftModeEdit("processor", "Incidents", incidentID, "ProcessorService") + await utils.draftModeSave("processor", "Incidents", incidentID, action, "ProcessorService") //read attachments list for Incident - try { - const response = await GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` - ) - //the data should have no attachments - expect(response.status).to.equal(200) - expect(response.data.value.length).to.equal(1) - } catch (err) { - expect(err).to.be.undefined - } + const response = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` + ) + //the data should have no attachments + expect(response.status).to.equal(200) + expect(response.data.value.length).to.equal(0) //content should not be there - await expect(GET( - `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` - )).to.be.rejectedWith(/404/) + await expect( + GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)/content` + ) + ).to.be.rejectedWith(/404/) }) }) describe("Tests for attachments facet disable", () => { beforeAll(async () => { + // Set environment before any connections cds.env.requires.db.kind = "sql" cds.env.requires.attachments.kind = "db" - await cds.connect.to("sql:my.db") - await cds.connect.to("attachments") cds.env.requires.attachments.scan = false cds.env.profiles = ["development"] + + // Connect to services + await cds.connect.to("sql:my.db") + await cds.connect.to("attachments") + + // Initialize test variables utils = new RequestSend(POST) }) it("Checking attachments facet metadata when @UI.Hidden is undefined", async () => { try { - const res = await GET( - `odata/v4/processor/$metadata?$format=json` - ) + const res = await GET(`odata/v4/processor/$metadata?$format=json`) expect(res.status).to.equal(200) - const facets = res.data.ProcessorService.$Annotations["ProcessorService.Incidents"]["@UI.Facets"] - const attachmentsFacetLabel = facets.some(facet => facet.Label === 'Attachments') - const attachmentsFacetTarget = facets.some(facet => facet.Target === 'attachments/@UI.LineItem') + const facets = + res.data.ProcessorService.$Annotations["ProcessorService.Incidents"][ + "@UI.Facets" + ] + const attachmentsFacetLabel = facets.some( + (facet) => facet.Label === "Attachments" + ) + const attachmentsFacetTarget = facets.some( + (facet) => facet.Target === "attachments/@UI.LineItem" + ) expect(attachmentsFacetLabel).to.be.true expect(attachmentsFacetTarget).to.be.true } catch (err) { @@ -236,42 +211,98 @@ describe("Tests for attachments facet disable", () => { }) it("Checking attachments facet when @attachments.disable_facet is enabled", async () => { - const res = await GET( - `odata/v4/processor/$metadata?$format=json` - ) + const res = await GET(`odata/v4/processor/$metadata?$format=json`) expect(res.status).to.equal(200) - const facets = res.data.ProcessorService.$Annotations["ProcessorService.Incidents"]["@UI.Facets"] - const hiddenAttachmentsFacetLabel = facets.some(facet => facet.Label === 'Attachments') + const facets = + res.data.ProcessorService.$Annotations["ProcessorService.Incidents"][ + "@UI.Facets" + ] + const hiddenAttachmentsFacetLabel = facets.some( + (facet) => facet.Label === "Attachments" + ) //Checking the facet metadata for hiddenAttachments since its annotated with @attachments.disable_facet as enabled - const hiddenAttachmentsFacetTarget = facets.some(facet => facet.Target === 'hiddenAttachments/@UI.LineItem') + const hiddenAttachmentsFacetTarget = facets.some( + (facet) => facet.Target === "hiddenAttachments/@UI.LineItem" + ) expect(hiddenAttachmentsFacetLabel).to.be.true expect(hiddenAttachmentsFacetTarget).to.be.false }) it("Checking attachments facet when @UI.Hidden is enabled", async () => { - const res = await GET( - `odata/v4/processor/$metadata?$format=json` - ) + const res = await GET(`odata/v4/processor/$metadata?$format=json`) expect(res.status).to.equal(200) - const facets = res.data.ProcessorService.$Annotations["ProcessorService.Incidents"]["@UI.Facets"] - const hiddenAttachmentsFacetLabel = facets.some(facet => facet.Label === 'Attachments') + const facets = + res.data.ProcessorService.$Annotations["ProcessorService.Incidents"][ + "@UI.Facets" + ] + const hiddenAttachmentsFacetLabel = facets.some( + (facet) => facet.Label === "Attachments" + ) - const hiddenAttachmentsFacetTarget = facets.find(facet => facet.Target === 'hiddenAttachments2/@UI.LineItem') + const hiddenAttachmentsFacetTarget = facets.find( + (facet) => facet.Target === "hiddenAttachments2/@UI.LineItem" + ) expect(hiddenAttachmentsFacetLabel).to.be.true expect(!!hiddenAttachmentsFacetTarget).to.be.true - expect(hiddenAttachmentsFacetTarget['@UI.Hidden']).to.equal(true) + expect(hiddenAttachmentsFacetTarget["@UI.Hidden"]).to.equal(true) }) it("Attachments facet is not added when its manually added by the developer", async () => { - const res = await GET( - `odata/v4/processor/$metadata?$format=json` - ) + const res = await GET(`odata/v4/processor/$metadata?$format=json`) expect(res.status).to.equal(200) - const facets = res.data.ProcessorService.$Annotations["ProcessorService.Customers"]["@UI.Facets"] + const facets = + res.data.ProcessorService.$Annotations["ProcessorService.Customers"][ + "@UI.Facets" + ] - const attachmentFacets = facets.filter(facet => facet.Target === 'attachments/@UI.LineItem') + const attachmentFacets = facets.filter( + (facet) => facet.Target === "attachments/@UI.LineItem" + ) expect(attachmentFacets.length).to.equal(1) - expect(attachmentFacets[0].Label).to.equal('My custom attachments') + expect(attachmentFacets[0].Label).to.equal("My custom attachments") }) -}) \ No newline at end of file +}) + +/** + * Uploads attachment in draft mode using CDS test utilities + * @param {Object} utils - RequestSend utility instance + * @param {Object} POST - CDS test POST function + * @param {Object} GET - CDS test GET function + * @param {string} incidentId - Incident ID + * @param {string} filename - Filename for the attachment + * @returns {Promise} - Attachment ID + */ +async function uploadDraftAttachment( + utils, + POST, + GET, + incidentId, + filename = "sample.pdf" +) { + const action = () => + POST( + `odata/v4/processor/Incidents(ID=${incidentId},IsActiveEntity=false)/attachments`, + { + up__ID: incidentId, + filename: filename, + mimeType: "application/pdf", + content: createReadStream( + join(__dirname, "..", "integration", "content/sample.pdf") + ), + createdAt: new Date( + Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000 + ), + createdBy: "alice", + } + ) + + await utils.draftModeEdit("processor", "Incidents", incidentID, "ProcessorService") + await utils.draftModeSave("processor", "Incidents", incidentID, action, "ProcessorService") + + // Get the uploaded attachment ID + const response = await GET( + `odata/v4/processor/Incidents(ID=${incidentId},IsActiveEntity=true)/attachments` + ) + return response.data.value[0]?.ID +} diff --git a/tests/utils/api.js b/tests/utils/api.js index b037f630..c37a7992 100644 --- a/tests/utils/api.js +++ b/tests/utils/api.js @@ -2,34 +2,34 @@ class RequestSend { constructor(post) { this.post = post } - async draftModeActions( - serviceName, - entityName, - id, - path, - action, - isRootCreated = false - ) { - if (!isRootCreated) { - try { - await this.post( - `odata/v4/${serviceName}/${entityName}(ID=${id},IsActiveEntity=true)/${path}.draftEdit`, - { - PreserveChanges: true, - } - ) - } catch (err) { - return err - } + async draftModeEdit(serviceName, entityName, id, path) { + try { + // Create draft from active entity + await this.post( + `odata/v4/${serviceName}/${entityName}(ID=${id},IsActiveEntity=true)/${path}.draftEdit`, + { + PreserveChanges: true, + } + ) + } catch (err) { + return err } + } + + async draftModeSave(serviceName, entityName, id, action, path) { try { + // Execute the action (e.g., POST attachment) await action() + + // Prepare the draft await this.post( `odata/v4/${serviceName}/${entityName}(ID=${id},IsActiveEntity=false)/${path}.draftPrepare`, { SideEffectsQualifier: "", } ) + + // Activate the draft await this.post( `odata/v4/${serviceName}/${entityName}(ID=${id},IsActiveEntity=false)/${path}.draftActivate`, {} diff --git a/tests/utils/testUtils.js b/tests/utils/testUtils.js new file mode 100644 index 00000000..89b6614b --- /dev/null +++ b/tests/utils/testUtils.js @@ -0,0 +1,12 @@ +/** + * Waits for attachment scanning to complete + * @param {number} timeout - Timeout in milliseconds (default: 5000) + * @returns {Promise} + */ +async function delay(timeout = 1000) { + return new Promise(resolve => setTimeout(resolve, timeout)) +} + +module.exports = { + delay, +} From 7668ca5a251f94cdcc97da3302680a06dafecb31 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Thu, 16 Oct 2025 12:30:13 +0200 Subject: [PATCH 08/28] Enhance AWS Attachments Service with detailed JSDoc comments and improve error handling in various methods --- lib/aws-s3.js | 126 +++++++++++++++++++++++++++++------ lib/basic.js | 103 +++++++++++++++++++++++----- lib/helper.js | 7 ++ lib/logger.js | 67 ++++++++++++++++--- lib/malwareScanner.js | 2 +- lib/mtx/server.js | 108 +++++++++++++++++++++++++++++- lib/plugin.js | 20 +++++- tests/unit/unitTests.test.js | 8 ++- 8 files changed, 386 insertions(+), 55 deletions(-) diff --git a/lib/aws-s3.js b/lib/aws-s3.js index 009827d1..ebc3592b 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -12,6 +12,9 @@ const separateObjectStore = isMultitenacyEnabled && objectStoreKind === "separat const s3ClientsCache = {} module.exports = class AWSAttachmentsService extends require("./basic") { + /** + * Initializes the AWS S3 Attachments Service + */ init() { // Log initial configuration logConfig.info('AWS S3 Attachments Service initialization', { @@ -75,6 +78,10 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } + /** + * Creates or retrieves a cached S3 client for the specified tenant + * @param {String} tenantID - The tenant ID for which to create/retrieve the S3 client + */ async createClientS3(tenantID) { logConfig.processStep('Creating tenant-specific S3 client', { tenantID }) @@ -173,19 +180,23 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } - async put(attachments, data, isDraftEnabled, _content, req) { + /** + * @inheritdoc + */ + async put(attachments, data, _content, isDraftEnabled) { const startTime = Date.now() + const tenantID = cds.context.tenant + logConfig.processStep('Starting file upload to S3', { attachmentEntity: attachments.name, isDraftEnabled, - tenant: req?.tenant + tenant: tenantID }) try { // Check separate object store instances if (separateObjectStore) { - const tenantID = req?.tenant if (!tenantID) { logConfig.withSuggestion('error', 'Tenant ID required for separate object store mode', null, @@ -202,7 +213,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { filenames: data.map(d => d.filename) }) return Promise.all( - data.map((d) => this.put(attachments, d, isDraftEnabled, _content, req)) + data.map((d) => this.put(attachments, d, _content, isDraftEnabled)) ) } @@ -214,7 +225,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { 'File key/URL is required for S3 upload', null, 'Ensure attachment data includes a valid URL/key', { metadata: { ...metadata, content: !!content } }) - throw new Error('File key is required for upload') + return } if (!content) { @@ -222,7 +233,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { 'File content is required for S3 upload', null, 'Ensure attachment data includes file content', { key: Key, hasContent: !!content }) - throw new Error('File content is required for upload') + return } const input = { @@ -261,7 +272,17 @@ module.exports = class AWSAttachmentsService extends require("./basic") { fileId: metadata.ID, filename: metadata.filename }) - scanRequest(attachments, { ID: metadata.ID }, req) + + const scanRequestJob = cds.spawn(async () => { + await scanRequest(attachments, { ID: metadata.ID }) + }) + + scanRequestJob.on('error', (err) => { + logConfig.withSuggestion('error', + 'Failed to initiate malware scan for attachment', err, + 'Check malware scanner configuration and connectivity', + { fileId: metadata.ID, filename: metadata.filename, errorMessage: err.message }) + }) } } catch (err) { @@ -274,20 +295,23 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } - // eslint-disable-next-line no-unused-vars - async get(attachments, keys, req = {}) { + /** + * @inheritdoc + */ + async get(attachments, keys) { const startTime = Date.now() + const tenantID = cds.context.tenant + logConfig.processStep('Starting file download from S3', { attachmentEntity: attachments.name, keys, - tenant: req?.tenant + tenant: tenantID }) try { // Check separate object store instances if (separateObjectStore) { - const tenantID = req?.tenant if (!tenantID) { logConfig.withSuggestion('error', 'Tenant ID required for separate object store mode', null, @@ -350,19 +374,33 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } - async deleteAttachment(key, req) { + /** + * Deletes a file from S3 based on the provided key + * @param {string} key - The key of the file to delete + * @returns {Promise} - Promise resolving when deletion is complete + */ + async deleteAttachment(key) { if (!key) return - return await this.delete(key, req) + return await this.delete(key) } + /** + * Registers attachment handlers for the given service and entity + * @param {*} records - The records to process + * @param {import('@sap/cds').Request} req - The request object + */ async deleteAttachmentsWithKeys(records, req) { if (req?.attachmentsToDelete?.length > 0) { req.attachmentsToDelete.forEach((attachment) => { - this.deleteAttachment(attachment.url, req) + this.deleteAttachment(attachment.url) }) } } + /** + * Registers attachment handlers for the given service and entity + * @param {import('@sap/cds').Request} req - The request object + */ async attachDeletionData(req) { const attachments = cds.model.definitions[req?.target?.name + ".attachments"] if (attachments) { @@ -384,11 +422,17 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } + /** + * Registers attachment handlers for the given service and entity + * @param {import('@sap/cds').Request} req - The request object + * @param {import('express').NextFunction} next - The next middleware function + */ async updateContentHandler(req, next) { logConfig.debug(`[S3 Upload] Uploading file using updateContentHandler for ${req.target.name}`) + // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant + const tenantID = cds.context.tenant await this.createClientS3(tenantID) } @@ -410,11 +454,21 @@ module.exports = class AWSAttachmentsService extends require("./basic") { client: this.client, params: input, }) - // const stored = super.put (Attachments, metadata) await Promise.all([multipartUpload.done()]) const keys = { ID: targetID } - scanRequest(req.target, keys, req) + + const scanRequestJob = cds.spawn(async () => { + await scanRequest(req.target, keys, req) + }) + + scanRequestJob.on('error', async (err) => { + logConfig.withSuggestion('error', + 'Failed to initiate malware scan for attachment', err, + 'Check malware scanner configuration and connectivity', + { keys, errorMessage: err.message }) + }) + logConfig.debug(`[S3 Upload] Uploaded file using updateContentHandler for ${req.target.name}`) } } else if (req?.data?.note) { @@ -426,6 +480,11 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } + /** + * Registers attachment handlers for the given service and entity + * @param {{draftEntity: string, activeEntity:cds.Entity, id:string}} param0 - The service and entities + * @returns + */ async getAttachmentsToDelete({ draftEntity, activeEntity, id }) { const [draftAttachments, activeAttachments] = await Promise.all([ SELECT.from(draftEntity).columns("url").where(id), @@ -438,6 +497,10 @@ module.exports = class AWSAttachmentsService extends require("./basic") { .map(({ url }) => ({ url })) } + /** + * Add draft attachment deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ async attachDraftDeletionData(req) { const draftEntity = cds.model.definitions[req?.target?.name] const name = req?.target?.name @@ -459,6 +522,10 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } + /** + * Add draft discard deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ async attachDraftDiscardDeletionData(req) { const { ID } = req.data const parentEntity = req.target.name.split('.').slice(0, -1).join('.') @@ -478,6 +545,9 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } + /** + * @inheritdoc + */ registerUpdateHandlers(srv, entity, mediaElement) { srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) @@ -491,6 +561,9 @@ module.exports = class AWSAttachmentsService extends require("./basic") { }) } + /** + * @inheritdoc + */ registerDraftUpdateHandlers(srv, entity, mediaElement) { srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) @@ -522,11 +595,17 @@ module.exports = class AWSAttachmentsService extends require("./basic") { }) } - async delete(Key, req) { - logConfig.debug(`[S3 Upload] Executing delete for file in ${req.target.name}`) + /** + * Deletes a file from S3 based on the provided key + * @param {string} Key - The key of the file to delete + * @returns {Promise} - Promise resolving when deletion is complete + */ + async delete(Key) { + const tenantID = cds.context.tenant + logConfig.debug(`[S3 Upload] Executing delete for file ${Key} in bucket ${this.bucket}`) + // Check separate object store instances if (separateObjectStore) { - const tenantID = req.tenant await this.createClientS3(tenantID) } @@ -539,8 +618,11 @@ module.exports = class AWSAttachmentsService extends require("./basic") { return response.DeleteMarker } - async deleteInfectedAttachment(Attachments, key, req) { + /** + * @inheritdoc + */ + async deleteInfectedAttachment(Attachments, key) { const response = await SELECT.from(Attachments, key).columns('url') - return await this.delete(response.url, req) + return await this.delete(response.url) } } diff --git a/lib/basic.js b/lib/basic.js index 1ae5f296..cfe584c4 100644 --- a/lib/basic.js +++ b/lib/basic.js @@ -5,7 +5,14 @@ const { logConfig } = require('./logger') const attachmentIDRegex = /\/\w+\(.*ID=([0-9a-fA-F-]{36})/ module.exports = class AttachmentsService extends cds.Service { - + /** + * Uploads attachments to the database and initiates malware scans for database-stored files + * @param {cds.Entity} attachments - Attachments entity definition + * @param {Array|Object} data - The attachment data to be uploaded + * @param {Buffer|Stream} _content - The content of the attachment (if not included in data) + * @param {boolean} isDraftEnabled - Flag indicating if draft handling is enabled + * @returns {Array} - Result of the upsert operation + */ async put(attachments, data, _content, isDraftEnabled = true) { if (!Array.isArray(data)) { if (_content) data.content = _content @@ -54,27 +61,43 @@ module.exports = class AttachmentsService extends cds.Service { fileIds: data.map(d => d.ID) }) - await Promise.all( - data.map(async (d) => { - try { - logConfig.debug('Starting scan request', { fileId: d.ID }) - await scanRequest(attachments, { ID: d.ID }) - logConfig.debug('Scan request completed', { fileId: d.ID }) - } catch (error) { - logConfig.withSuggestion('error', - 'Failed to initiate malware scan for attachment', error, - 'Check malware scanner configuration and connectivity', - { fileId: d.ID, filename: d.filename }) - } - }) - ) + const scanRequestJob = cds.spawn(async () => { + await Promise.all( + data.map(async (d) => { + try { + logConfig.debug('Starting scan request', { fileId: d.ID }) + await scanRequest(attachments, { ID: d.ID }) + + logConfig.debug('Scan request completed', { fileId: d.ID }) + } catch (error) { + logConfig.withSuggestion('error', + 'Failed to initiate malware scan for attachment', error, + 'Check malware scanner configuration and connectivity', + { fileId: d.ID, filename: d.filename }) + } + }) + ) + }) + + scanRequestJob.on('error', (error) => { + logConfig.withSuggestion('error', + 'Error occurred during malware scan requests', error, + 'Check malware scanner configuration and connectivity', + { errorMessage: error.message }) + }) } return res } - // eslint-disable-next-line no-unused-vars - async get(attachments, keys, req = {}) { + /** + * Registers attachment handlers for the given service and entity + * @param {cds.Entity} attachments - The attachment service instance + * @param {string} keys - The keys to identify the attachment + * @param {import('@sap/cds').Request} req - The request object + * @returns {Buffer|Stream|null} - The content of the attachment or null if not found + */ + async get(attachments, keys) { if (attachments.isDraft) { attachments = attachments.actives } @@ -88,11 +111,12 @@ module.exports = class AttachmentsService extends cds.Service { /** * Returns a handler to copy updated attachments content from draft to active / object store + * @param {cds.Entity} attachments - Attachments entity definition + * @returns {Function} - The draft save handler function */ draftSaveHandler(attachments) { const queryFields = this.getFields(attachments) - return async (_, req) => { // The below query loads the attachments into streams const cqn = SELECT(queryFields) @@ -111,6 +135,12 @@ module.exports = class AttachmentsService extends cds.Service { } } + /** + * Handles non-draft attachment updates by uploading content to the database + * @param {Express.Request} req - The request object + * @param {cds.Entity} attachment - Attachments entity definition + * @returns + */ async nonDraftHandler(req, attachment) { if (req?.content?.url?.endsWith("/content")) { const attachmentID = req.content.url.match(attachmentIDRegex)[1] @@ -120,6 +150,12 @@ module.exports = class AttachmentsService extends cds.Service { } } + /** + * Returns the fields to be selected from Attachments entity definition + * including the association keys if Attachments entity definition is associated to another entity + * @param {cds.Entity} attachments - Attachments entity definition + * @returns {Array} - Array of fields to be selected + */ getFields(attachments) { const attachmentFields = ["filename", "mimeType", "content", "url", "ID"] const { up_ } = attachments.keys @@ -131,17 +167,36 @@ module.exports = class AttachmentsService extends cds.Service { else return Object.keys(attachments.keys) } + /** + * Registers handlers for attachment entities in the service + * @param {cds.Service} srv - The CDS service instance + * @param {cds.Entity} entity - The entity containing attachment associations + * @param {cds.Entity} target - Attachments entity definition to register handlers for + */ registerUpdateHandlers(srv, entity, target) { srv.after("PUT", target, async (req) => { await this.nonDraftHandler(req, target) }) } + /** + * Registers draft save handler for attachment entities in the service + * @param {cds.Service} srv - The CDS service instance + * @param {cds.Entity} entity - The entity containing attachment associations + * @param {cds.Entity} target - Attachments entity definition to register handlers for + */ registerDraftUpdateHandlers(srv, entity, target) { srv.after("SAVE", entity, this.draftSaveHandler(target)) return } + /** + * Updates attachment metadata in the database + * @param {cds.Entity} Attachments - Attachments entity definition + * @param {string} key - The key of the attachment to update + * @param {*} data - The data to update the attachment with + * @returns + */ async update(Attachments, key, data) { logConfig.debug("Updating attachment for", { attachmentName: Attachments.name, @@ -150,11 +205,23 @@ module.exports = class AttachmentsService extends cds.Service { return await UPDATE(Attachments, key).with(data) } + /** + * Retrieves the malware scan status of an attachment + * @param {cds.Entity} Attachments - Attachments entity definition + * @param {string} key - The key of the attachment to retrieve the status for + * @returns {string} - The malware scan status of the attachment + */ async getStatus(Attachments, key) { const result = await SELECT.from(Attachments, key).columns('status') return result?.status } + /** + * Deletes the content of an infected attachment by setting its content to null + * @param {cds.Entity} Attachments - Attachments entity definition + * @param {string} key - The key of the attachment to delete + * @returns {Promise} - Result of the update operation + */ async deleteInfectedAttachment(Attachments, key) { return await UPDATE(Attachments, key).with({ content: null }) } diff --git a/lib/helper.js b/lib/helper.js index 7610c333..e879a7ce 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -182,6 +182,13 @@ async function fetchTokenWithMTLS(certURL, clientid, certificate, key) { const response = await axios(options) const duration = Date.now() - startTime + if (!response.data?.access_token) { + logConfig.withSuggestion('error', 'MTLS token response missing access_token', null, + 'Check MTLS certificate/key validity and Service Manager configuration', + { clientid, duration, responseData: response.data }) + throw new Error('Access token not found in MTLS token response') + } + logConfig.debug('MTLS token fetched successfully', { clientid, duration, tokenType: response.data.token_type }) return response.data.access_token diff --git a/lib/logger.js b/lib/logger.js index ebe8e112..e30b9fec 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -22,24 +22,40 @@ class AttachmentsLogger { } } + /** + * Logs an informational message with optional context + * @param {string} message - The message to log + * @param {*} context - Additional context to include in the log + */ info(message, context = {}) { try { - this.LOG.info(this._formatMessage('INFO', message, context)) + this.LOG.info(this._formatMessage(message, context)) // eslint-disable-next-line no-unused-vars } catch (e) { // Silently fail in test environments } } + /** + * Logs a warning message with optional context + * @param {string} message - The message to log + * @param {*} context - Additional context to include in the log + */ warn(message, context = {}) { try { - this.LOG.warn(this._formatMessage('WARN', message, context)) + this.LOG.warn(this._formatMessage(message, context)) // eslint-disable-next-line no-unused-vars } catch (e) { // Silently fail in test environments } } + /** + * Logs an error message with optional context and error details + * @param {string} message - The message to log + * @param {Error} error - The error object to log + * @param {*} context - Additional context to include in the log + */ error(message, error = null, context = {}) { try { const fullContext = { ...context } @@ -50,17 +66,22 @@ class AttachmentsLogger { code: error.code } } - this.LOG.error(this._formatMessage('ERROR', message, fullContext)) + this.LOG.error(this._formatMessage(message, fullContext)) // eslint-disable-next-line no-unused-vars } catch (e) { // Silently fail in test environments } } + /** + * Logs a debug message with optional context + * @param {string} message - The message to log + * @param {*} context - Additional context to include in the log + */ debug(message, context = {}) { try { if (this.DEBUG) { - this.DEBUG(this._formatMessage('DEBUG', message, context)) + this.DEBUG(this._formatMessage(message, context)) } // eslint-disable-next-line no-unused-vars } catch (e) { @@ -68,10 +89,15 @@ class AttachmentsLogger { } } + /** + * Logs a verbose message with optional context if verbose logging is enabled + * @param {string} message - The message to log + * @param {*} context - Additional context to include in the log + */ verbose(message, context = {}) { try { if (this.isVerboseEnabled && this.DEBUG) { - this.DEBUG(this._formatMessage('VERBOSE', message, context)) + this.DEBUG(this._formatMessage(message, context)) } // eslint-disable-next-line no-unused-vars } catch (e) { @@ -79,6 +105,13 @@ class AttachmentsLogger { } } + /** + * Logs the result of a configuration validation + * @param {string} configPath - The path of the configuration being validated + * @param {string} value - The value being validated + * @param {boolean} isValid - Whether the value is valid + * @param {string} suggestion - Suggestion for correction if invalid + */ logConfigValidation(configPath, value, isValid, suggestion = null) { const context = { configPath, value: this._sanitizeValue(value), isValid } if (suggestion) context.suggestion = suggestion @@ -90,10 +123,23 @@ class AttachmentsLogger { } } + /** + * Logs a specific process step with details + * @param {string} step - The process step being logged + * @param {*} details - Additional details about the step + */ logProcessStep(step, details = {}) { this.verbose(`Process step: ${step}`, details) } + /** + * Logs a message with a suggestion for improvement + * @param {('info'|'warn'|'error'|'debug')} level - The log level + * @param {string} message - The message to log + * @param {Error} error - The error object (if any) + * @param {string} suggestion - Suggestion for improvement + * @param {*} context - Additional context to include in the log + */ logWithSuggestion(level, message, error = null, suggestion = null, context = {}) { const fullContext = { ...context } if (suggestion) fullContext.suggestion = suggestion @@ -113,9 +159,14 @@ class AttachmentsLogger { } } - _formatMessage(level, message, context) { - const timestamp = new Date().toISOString() - let formattedMessage = `[${timestamp}] [${level}] ${message}` + /** + * Formats the log message with level, and context + * @param {string} message - The main log message + * @param {*} context - Additional context to include + * @returns + */ + _formatMessage(message, context) { + let formattedMessage = message if (Object.keys(context).length > 0) { formattedMessage += ` | Context: ${JSON.stringify(context)}` diff --git a/lib/malwareScanner.js b/lib/malwareScanner.js index 7c8e1772..cf2e19be 100644 --- a/lib/malwareScanner.js +++ b/lib/malwareScanner.js @@ -74,7 +74,7 @@ async function scanRequest(Attachments, key, req) { 'Bind a Malware Scanner service instance to your application', { fileId: key.ID }) await updateStatus(AttachmentsSrv, key, "Failed", currEntity, draftEntity, activeEntity) - return + throw error } logConfig.debug('Fetching file content for scanning', { fileId: key.ID }) diff --git a/lib/mtx/server.js b/lib/mtx/server.js index 50ad6fd5..df108ed1 100644 --- a/lib/mtx/server.js +++ b/lib/mtx/server.js @@ -25,6 +25,11 @@ const STATE = { let POLL_WAIT_TIME = 5000 const ASYNC_TIMEOUT = 5 * 60 * 1000 +/** + * Waits for the specified number of milliseconds + * @param {number} milliseconds - Time to wait in milliseconds + * @returns {Promise} - Resolves after the specified time + */ async function wait(milliseconds) { if (milliseconds <= 0) { return @@ -34,6 +39,15 @@ async function wait(milliseconds) { }) } +/** + * Registers attachment handlers for the given service and entity + * @param {string} sm_url - Service Manager URL + * @param {import('axios').Method} method - HTTP method + * @param {string} path - API path + * @param {string} token - OAuth token + * @param {*} params - Query parameters + * @returns {string} - Response data + */ const _serviceManagerRequest = async (sm_url, method, path, token, params = {}) => { try { const response = await axios({ @@ -53,9 +67,14 @@ const _serviceManagerRequest = async (sm_url, method, path, token, params = {}) `Service Manager API request failed - ${method.toUpperCase()} ${path}`, error, 'Check Service Manager connectivity and credentials', { method, path, sm_url, params }) + throw error } } +/** + * Registers attachment handlers for the given service and entity + * @param {{ sm_url: string, url: string, clientid: string, clientsecret: string, certificate: string, key: string }} param0 - Service Manager credentials + */ const _validateSMCredentials = ({ sm_url, url, clientid, clientsecret, certificate, key }) => { if (!sm_url || !url) { throw new Error("Missing Service Manager credentials: 'sm_url' or 'url' is not defined.") @@ -64,6 +83,10 @@ const _validateSMCredentials = ({ sm_url, url, clientid, clientsecret, certifica if (!clientid || !clientsecret) { logConfig.debug('OAuth client credentials not found - checking for MTLS credentials', { sm_url, url, clientid }) if (!certificate || !key) { + logConfig.withSuggestion('error', + 'MTLS credentials are also missing', null, + 'Provide either OAuth clientid/clientsecret or MTLS certificate/key in Service Manager credentials', + { sm_url, url, clientid }) throw new Error("MTLS credentials are also missing: 'certificate' or 'key' is not defined.") } } @@ -89,6 +112,14 @@ const _fetchToken = async (url, clientid, clientsecret, certificate, key) => { client_secret: clientsecret, }, }) + + if (!response.data?.access_token) { + logConfig.withSuggestion('error', 'OAuth token response missing access_token', null, + 'Check clientid/clientsecret validity and Service Manager configuration', + { clientid, responseData: response.data }) + throw new Error('Access token not found in OAuth token response') + } + return response.data.access_token } @@ -103,6 +134,14 @@ const _fetchToken = async (url, clientid, clientsecret, certificate, key) => { headers, httpsAgent: agent, }) + + if (!response.data?.access_token) { + logConfig.withSuggestion('error', 'MTLS token response missing access_token', null, + 'Check MTLS certificate/key validity and Service Manager configuration', + { clientid, responseData: response.data }) + throw new Error('Access token not found in MTLS token response') + } + return response.data.access_token } @@ -123,10 +162,18 @@ const _getOfferingID = async (sm_url, token) => { return offeringID } +/** + * Registers attachment handlers for the given service and entity + * @param {*} sm_url - Service Manager URL + * @param {*} token - OAuth token + * @param {*} offeringID - Service Offering ID + * @returns + */ const _getPlanID = async (sm_url, token, offeringID) => { // Recheck the fieldQuery for catalog_name const supportedPlans = ["standard", "s3-standard"] for (const planName of supportedPlans) { + logConfig.debug('Fetching object store plan from Service Manager', { planName }) try { const plan = await _serviceManagerRequest( sm_url, @@ -138,7 +185,7 @@ const _getPlanID = async (sm_url, token, offeringID) => { } ) if (plan?.id) { - logConfig.debug('Using object store plan', { planName, planID: plan.id }) + logConfig.debug('Using object store plan', { planName, planID: plan.id, offeringID }) return plan.id } } catch (error) { @@ -146,6 +193,7 @@ const _getPlanID = async (sm_url, token, offeringID) => { `Failed to fetch plan "${planName}" from Service Manager`, error, 'Check Service Manager connectivity and credentials', { sm_url, offeringID, planName }) + throw error } } logConfig.debug('No supported object store service plan found in Service Manager', { sm_url, attempted: supportedPlans.join(", ") }) @@ -154,6 +202,14 @@ const _getPlanID = async (sm_url, token, offeringID) => { ) } +/** + * Creates an object store instance for the given tenant + * @param {*} sm_url - Service Manager URL + * @param {*} tenant - Tenant ID + * @param {*} planID - Service Plan ID + * @param {*} token - OAuth token + * @returns + */ const _createObjectStoreInstance = async (sm_url, tenant, planID, token) => { try { const response = await axios.post(`${sm_url}/v1/service_instances`, { @@ -179,6 +235,13 @@ const _createObjectStoreInstance = async (sm_url, tenant, planID, token) => { } } +/** + * Polls the service manager until the instance is in a terminal state + * @param {*} sm_url - Service Manager URL + * @param {*} instancePath - Path to the service instance + * @param {*} token - OAuth token + * @returns + */ const _pollUntilDone = async (sm_url, instancePath, token) => { try { let iteration = 1 @@ -213,6 +276,14 @@ const _pollUntilDone = async (sm_url, instancePath, token) => { } } +/** + * Registers attachment handlers for the given service and entity + * @param {*} sm_url - Service Manager URL + * @param {*} tenant - Tenant ID + * @param {*} instanceID - Service Instance ID + * @param {*} token - OAuth token + * @returns + */ const _bindObjectStoreInstance = async (sm_url, tenant, instanceID, token) => { if (instanceID) { try { @@ -238,6 +309,13 @@ const _bindObjectStoreInstance = async (sm_url, tenant, instanceID, token) => { } } +/** + * Registers attachment handlers for the given service and entity + * @param {string} sm_url - Service Manager URL + * @param {string} tenant - Tenant ID + * @param {string} token - OAuth token + * @returns {string} - Binding ID + */ const _getBindingIdForDeletion = async (sm_url, tenant, token) => { try { const getBindingCredentials = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_BINDING, token, { @@ -257,6 +335,12 @@ const _getBindingIdForDeletion = async (sm_url, tenant, token) => { } } +/** + * Registers attachment handlers for the given service and entity + * @param {string} sm_url - Service Manager URL + * @param {string} bindingID - Binding ID + * @param {string} token - OAuth token + */ const _deleteBinding = async (sm_url, bindingID, token) => { if (bindingID) { try { @@ -274,6 +358,13 @@ const _deleteBinding = async (sm_url, bindingID, token) => { } } +/** + * Registers attachment handlers for the given service and entity + * @param {string} sm_url - Service Manager URL + * @param {string} tenant - Tenant ID + * @param {string} token - OAuth token + * @returns {string} - Instance ID + */ const _getInstanceIdForDeletion = async (sm_url, tenant, token) => { try { const instanceId = await _serviceManagerRequest(sm_url, HTTP_METHOD.GET, PATH.SERVICE_INSTANCE, token, { labelQuery: `service eq 'OBJECT_STORE' and tenant_id eq '${tenant}'` }) @@ -286,6 +377,12 @@ const _getInstanceIdForDeletion = async (sm_url, tenant, token) => { } } +/** + * Deletes an object store instance + * @param {string} sm_url - Service Manager URL + * @param {string} instanceID - Service Instance ID + * @param {string} token - OAuth token + */ const _deleteObjectStoreInstance = async (sm_url, instanceID, token) => { if (instanceID) { try { @@ -412,3 +509,12 @@ cds.on('listening', async () => { } module.exports = cds.server }) + +module.exports = { + _fetchToken, + _validateSMCredentials, + _serviceManagerRequest, + _getOfferingID, + _getPlanID, + _createObjectStoreInstance +} \ No newline at end of file diff --git a/lib/plugin.js b/lib/plugin.js index 3b3ee759..05af06b5 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -4,6 +4,7 @@ const { logConfig } = require('./logger') const attachmentIDRegex = /\/\w+\(.*ID=([0-9a-fA-F-]{36})/ cds.on(cds.version >= "8.6.0" ? "compile.to.edmx" : "loaded", unfoldModel) + function unfoldModel(csn) { const meta = csn.meta ??= {} if (!("sap.attachments.Attachments" in csn.definitions)) return @@ -52,7 +53,7 @@ cds.once("served", async function registerPluginHandlers() { const isDraft = !!target?.drafts const targets = isDraft ? [target, target.drafts] : [target] - logConfig.info(`Registering handlers for attachment entity: ${target.name}`) + logConfig.debug(`Registering handlers for attachment entity: ${target.name}`) srv.before("READ", targets, validateAttachment) @@ -72,6 +73,10 @@ cds.once("served", async function registerPluginHandlers() { } } + /** + * Prepares the attachment data before creation + * @param {import('@sap/cds').Request} req - The request object + */ function onPrepareAttachment(req) { req.data.url = cds.utils.uuid() const isMultitenacyEnabled = !!cds.env.requires.multitenancy @@ -84,6 +89,10 @@ cds.once("served", async function registerPluginHandlers() { req.data.mimeType = Ext2MimeTypes[ext] || "application/octet-stream" } + /** + * Validates if the attachment can be accessed based on its malware scan status + * @param {import('@sap/cds').Request} req - The request object + */ async function validateAttachment(req) { /* removing case condition for mediaType annotation as in our case binary value and metadata is stored in different database */ @@ -105,13 +114,18 @@ cds.once("served", async function registerPluginHandlers() { } } + /** + * Reads the attachment content if requested + * @param {[cds.Entity]} param0 + * @param {import('@sap/cds').Request} req - The request object + * @returns + */ async function readAttachment([attachment], req) { if (req._.readAfterWrite || !req?.req?.url?.endsWith("/content") || !attachment || attachment?.content) return let keys = { ID: req.req.url.match(attachmentIDRegex)[1] } let { target } = req - attachment.content = await AttachmentsSrv.get(target, keys, req) //Dependency -> sending req object for usage in SDM plugin + attachment.content = await AttachmentsSrv.get(target, keys) //Dependency -> sending req object for usage in SDM plugin } - }) function validateAttachmentSize(req) { diff --git a/tests/unit/unitTests.test.js b/tests/unit/unitTests.test.js index 3a6bd14b..64029739 100644 --- a/tests/unit/unitTests.test.js +++ b/tests/unit/unitTests.test.js @@ -110,8 +110,12 @@ describe('scanRequest', () => { const key = { ID: 'test-id' } cds.env = { requires: {}, profiles: [] } - // The function should not throw but should update status to Failed - await scanRequest(Attachments, key) + try { + await scanRequest(Attachments, key) + } catch (error) { + expect(error.message).toBe("SAP Malware Scanning service is not bound.") + } + expect(mockAttachmentsSrv.update).toHaveBeenCalledWith(expect.anything(), key, { status: 'Failed' }) }) }) From 822f2f60aca94427665c5149f24b4cdb69ffebdc Mon Sep 17 00:00:00 2001 From: Marten Schiwek Date: Mon, 13 Oct 2025 11:54:44 +0200 Subject: [PATCH 09/28] Update translation_v2.json (#265) Adjust collection name for working i18n integration. --- translation_v2.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translation_v2.json b/translation_v2.json index 715491e6..85763ec0 100644 --- a/translation_v2.json +++ b/translation_v2.json @@ -10,7 +10,7 @@ ] }, { - "collectionName": "data", + "collectionName": "attachments_data", "folders": [ { "startingFolderPath": "/db/data", From 668c4e5450e105259b48c88204e21dc76d56737f Mon Sep 17 00:00:00 2001 From: Marten Schiwek Date: Mon, 13 Oct 2025 16:03:09 +0200 Subject: [PATCH 10/28] Added missing descr column (#267) Needed for translation workbench --- db/data/sap.attachments-ScanStates.csv | 12 ++++++------ db/data/sap.attachments-ScanStates_texts.csv | 12 ++++++------ db/data/sap.attachments-ScanStates_texts_de.csv | 12 ++++++------ db/data/sap.attachments-ScanStates_texts_en.csv | 12 ++++++------ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/db/data/sap.attachments-ScanStates.csv b/db/data/sap.attachments-ScanStates.csv index a87ca22d..091705e8 100644 --- a/db/data/sap.attachments-ScanStates.csv +++ b/db/data/sap.attachments-ScanStates.csv @@ -1,6 +1,6 @@ -code;name -Unscanned;Unscanned -Scanning;Scanning -Infected;Infected -Clean;Clean -Failed;Failed \ No newline at end of file +code;name;descr +Unscanned;Unscanned;The file is not yet scanned for malware. +Scanning;Scanning;The file is currently being scanned for malware. +Infected;Infected;The file contains malware! Do not download! +Clean;Clean;The file does not contain any malware. +Failed;Failed;The file could not be scanned for malware. \ No newline at end of file diff --git a/db/data/sap.attachments-ScanStates_texts.csv b/db/data/sap.attachments-ScanStates_texts.csv index 6b0c97d8..cf261a67 100644 --- a/db/data/sap.attachments-ScanStates_texts.csv +++ b/db/data/sap.attachments-ScanStates_texts.csv @@ -1,6 +1,6 @@ -locale;code;name -en;Unscanned;Unscanned -en;Scanning;Scanning -en;Infected;Infected -en;Clean;Clean -en;Failed;Failed \ No newline at end of file +locale;code;name;descr +en;Unscanned;Unscanned;The file is not yet scanned for malware. +en;Scanning;Scanning;The file is currently being scanned for malware. +en;Infected;Infected;The file contains malware! Do not download! +en;Clean;Clean;The file does not contain any malware. +en;Failed;Failed;The file could not be scanned for malware. \ No newline at end of file diff --git a/db/data/sap.attachments-ScanStates_texts_de.csv b/db/data/sap.attachments-ScanStates_texts_de.csv index 18c4f111..c11ce5e1 100644 --- a/db/data/sap.attachments-ScanStates_texts_de.csv +++ b/db/data/sap.attachments-ScanStates_texts_de.csv @@ -1,6 +1,6 @@ -locale;code;name -de;Unscanned;Nicht gescannt -de;Scanning;Wird gescannt -de;Infected;Infiziert -de;Clean;Sauber -de;Failed;Fehlgeschlagen \ No newline at end of file +locale;code;name;descr +de;Unscanned;Nicht gescannt; +de;Scanning;Wird gescannt; +de;Infected;Infiziert; +de;Clean;Sauber; +de;Failed;Fehlgeschlagen; \ No newline at end of file diff --git a/db/data/sap.attachments-ScanStates_texts_en.csv b/db/data/sap.attachments-ScanStates_texts_en.csv index 6b0c97d8..11cf865b 100644 --- a/db/data/sap.attachments-ScanStates_texts_en.csv +++ b/db/data/sap.attachments-ScanStates_texts_en.csv @@ -1,6 +1,6 @@ -locale;code;name -en;Unscanned;Unscanned -en;Scanning;Scanning -en;Infected;Infected -en;Clean;Clean -en;Failed;Failed \ No newline at end of file +locale;code;name;descr +en;Unscanned;Unscanned; +en;Scanning;Scanning; +en;Infected;Infected; +en;Clean;Clean; +en;Failed;Failed; \ No newline at end of file From fbcd591782f70356bf074bec04d9de02117d3146 Mon Sep 17 00:00:00 2001 From: Simon Kobler <32038731+KoblerS@users.noreply.github.com> Date: Tue, 14 Oct 2025 09:00:38 +0200 Subject: [PATCH 11/28] Prepare release notes (#266) --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaea5e2c..5ac7feb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). The format is based on [Keep a Changelog](http://keepachangelog.com/). +## Version 3.0.0 + +**BREAKING CHANGE:** Replaced usage of the CAP `req` variable with `cds.context` throughout the codebase. + +### Fixed + +- Resolved a crash in the malware scanning process when running the CDS server in a multitenancy setup. +- Corrected missing translations for column labels. +- Scan states are now translated. + +### Added + +- Deprecated `@attachments.disable_facet` +- Introduced support for @UI.Hidden, enabling dynamic hiding of the attachments section in the UI. + ## Version 2.2.2 ### Added diff --git a/package.json b/package.json index 16e89cf1..9b56f62c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@cap-js/attachments", "description": "CAP cds-plugin providing image and attachment storing out-of-the-box.", - "version": "2.2.2", + "version": "3.0.0", "repository": "cap-js/attachments", "author": "SAP SE (https://www.sap.com)", "homepage": "https://cap.cloud.sap/", From c0a71f67bfb441e9a0cbf61a92f3c06bb4d2d41a Mon Sep 17 00:00:00 2001 From: Simon Kobler <32038731+KoblerS@users.noreply.github.com> Date: Thu, 16 Oct 2025 10:51:10 +0200 Subject: [PATCH 12/28] Enhance memory management and error handling in attachment processing (#270) - Refactor content handling in AWSAttachmentsService to ensure cleanup after uploads. - Improve error handling in malwareScanner by streaming files directly to the scanner. - Optimize memory usage in basic.js and plugin.js by clearing content references post-upload. --- lib/aws-s3.js | 7 ++++--- lib/basic.js | 4 ++-- lib/malwareScanner.js | 36 ++++++++++++++++-------------------- lib/plugin.js | 4 ++-- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/lib/aws-s3.js b/lib/aws-s3.js index ebc3592b..f83a4621 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -255,6 +255,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { }) const stored = super.put(attachments, metadata, null, isDraftEnabled) + await Promise.all([stored, multipartUpload.done()]) const duration = Date.now() - startTime @@ -335,7 +336,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { const Key = response.url - logConfig.debug('Downloading file from S3', { + logConfig.debug('Streaming file from S3', { bucket: this.bucket, key: Key }) @@ -348,7 +349,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { ) const duration = Date.now() - startTime - logConfig.debug('File download from S3 completed successfully', { + logConfig.debug('File streamed from S3 successfully', { fileId: keys.ID, bucket: this.bucket, key: Key, @@ -454,7 +455,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { client: this.client, params: input, }) - await Promise.all([multipartUpload.done()]) + await multipartUpload.done() const keys = { ID: targetID } diff --git a/lib/basic.js b/lib/basic.js index cfe584c4..60f7be99 100644 --- a/lib/basic.js +++ b/lib/basic.js @@ -139,7 +139,7 @@ module.exports = class AttachmentsService extends cds.Service { * Handles non-draft attachment updates by uploading content to the database * @param {Express.Request} req - The request object * @param {cds.Entity} attachment - Attachments entity definition - * @returns + * @returns {Promise} - Result of the upsert operation */ async nonDraftHandler(req, attachment) { if (req?.content?.url?.endsWith("/content")) { @@ -195,7 +195,7 @@ module.exports = class AttachmentsService extends cds.Service { * @param {cds.Entity} Attachments - Attachments entity definition * @param {string} key - The key of the attachment to update * @param {*} data - The data to update the attachment with - * @returns + * @returns {Promise} - Result of the update operation */ async update(Attachments, key, data) { logConfig.debug("Updating attachment for", { diff --git a/lib/malwareScanner.js b/lib/malwareScanner.js index cf2e19be..2bccd331 100644 --- a/lib/malwareScanner.js +++ b/lib/malwareScanner.js @@ -80,14 +80,10 @@ async function scanRequest(Attachments, key, req) { logConfig.debug('Fetching file content for scanning', { fileId: key.ID }) const contentStream = await AttachmentsSrv.get(currEntity, key) - let fileContent - try { - logConfig.verbose('Converting file stream to string for scanning', { fileId: key.ID }) - fileContent = await streamToString(contentStream) - } catch (err) { + if (!contentStream) { logConfig.withSuggestion('error', - 'Cannot read file content for malware scanning', err, - 'Check file integrity and storage accessibility', + 'Cannot fetch file content for malware scanning', null, + 'Check file exists and storage accessibility', { fileId: key.ID }) await updateStatus(AttachmentsSrv, key, "Failed", currEntity, draftEntity, activeEntity) return @@ -97,19 +93,20 @@ async function scanRequest(Attachments, key, req) { const scanStartTime = Date.now() try { - logConfig.debug('Sending file to Malware Scanning Service', { + logConfig.debug('Streaming file to Malware Scanning Service', { fileId: key.ID, - scannerUri: credentials.uri, - contentLength: fileContent.length + scannerUri: credentials.uri }) + // Stream the file directly to the scanner without loading into memory response = await fetch(`https://${credentials.uri}/scan`, { method: "POST", headers: { Authorization: "Basic " + Buffer.from(`${credentials.username}:${credentials.password}`, "binary").toString("base64"), }, - body: fileContent, + body: contentStream, + duplex: 'half' // Required for streaming request bodies }) } catch (error) { @@ -119,7 +116,13 @@ async function scanRequest(Attachments, key, req) { 'Check malware scanner service binding and network connectivity', { fileId: key.ID, scanDuration, scannerUri: credentials?.uri }) await updateStatus(AttachmentsSrv, key, "Failed", currEntity, draftEntity, activeEntity) + + // Cleanup: destroy stream on error + contentStream?.destroy() return + } finally { + // Cleanup: destroy stream after request completion + contentStream?.destroy() } try { @@ -151,6 +154,8 @@ async function scanRequest(Attachments, key, req) { 'Check malware scanner service health and response format', { fileId: key.ID, scanDuration, httpStatus: response?.status }) await updateStatus(AttachmentsSrv, key, "Failed", currEntity, draftEntity, activeEntity) + } finally { + contentStream?.destroy() } } @@ -206,15 +211,6 @@ function getCredentials() { } } -function streamToString(stream) { - const chunks = [] - return new Promise((resolve, reject) => { - stream.on('data', (chunk) => chunks.push(Buffer.from(chunk))) - stream.on('error', (err) => reject(err)) - stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8'))) - }) -} - module.exports = { scanRequest } diff --git a/lib/plugin.js b/lib/plugin.js index 05af06b5..df380b9e 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -118,13 +118,13 @@ cds.once("served", async function registerPluginHandlers() { * Reads the attachment content if requested * @param {[cds.Entity]} param0 * @param {import('@sap/cds').Request} req - The request object - * @returns + * @returns */ async function readAttachment([attachment], req) { if (req._.readAfterWrite || !req?.req?.url?.endsWith("/content") || !attachment || attachment?.content) return let keys = { ID: req.req.url.match(attachmentIDRegex)[1] } let { target } = req - attachment.content = await AttachmentsSrv.get(target, keys) //Dependency -> sending req object for usage in SDM plugin + attachment.content = await AttachmentsSrv.get(target, keys) } }) From daf9fc50872693fa72cf3767430322ea12093dcf Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Thu, 16 Oct 2025 12:36:41 +0200 Subject: [PATCH 13/28] Refactor Azure Blob Storage and malware scanner integration for improved clarity and error handling --- lib/azure-blob-storage.js | 103 ++++++++++++++++++++++++++++++++++---- lib/malwareScanner.js | 2 +- 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 3913528c..badb4312 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -11,6 +11,9 @@ const separateObjectStore = isMultitenacyEnabled && objectStoreKind === "separat const azureClientsCache = {} module.exports = class AzureAttachmentsService extends require("./basic") { + /** + * Initializes the Azure Blob Storage Attachments Service + */ init() { // Log initial configuration logConfig.info('Azure Blob Storage Attachments Service initialization', { @@ -67,6 +70,10 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Creates or retrieves a cached Azure Blob Storage client for the given tenant + * @param {String} tenantID - The tenant ID for which to create/retrieve the client + */ async createAzureClient(tenantID) { logConfig.processStep('Creating tenant-specific Azure Blob Storage client', { tenantID }) @@ -162,6 +169,9 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * @inheritdoc + */ async put(attachments, data, isDraftEnabled, _content, req) { const startTime = Date.now() @@ -260,7 +270,17 @@ module.exports = class AzureAttachmentsService extends require("./basic") { fileId: metadata.ID, filename: metadata.filename }) - scanRequest(attachments, { ID: metadata.ID }, req) + + const scanRequestJob = cds.spawn(async () => { + await scanRequest(attachments, { ID: metadata.ID }) + }) + + scanRequestJob.on('error', (err) => { + logConfig.withSuggestion('error', + 'Failed to initiate malware scan for attachment', err, + 'Check malware scanner configuration and connectivity', + { fileId: metadata.ID, filename: metadata.filename, errorMessage: err.message }) + }) } } catch (err) { @@ -273,20 +293,23 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } - // eslint-disable-next-line no-unused-vars - async get(attachments, keys, req = {}) { + /** + * @inheritdoc + */ + async get(attachments, keys) { const startTime = Date.now() + const tenantID = cds.context.tenant + logConfig.processStep('Starting file download from Azure Blob Storage', { attachmentEntity: attachments.name, keys, - tenant: req?.tenant + tenant: tenantID }) try { // Check separate object store instances if (separateObjectStore) { - const tenantID = req?.tenant if (!tenantID) { logConfig.withSuggestion('error', 'Tenant ID required for separate object store mode', null, @@ -345,11 +368,21 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Deletes a file from Azure Blob Storage based on the provided key + * @param {string} key - The key of the file to delete + * @returns {Promise} - Promise resolving when deletion is complete + */ async deleteAttachment(key, req) { if (!key) return return await this.delete(key, req) } + /** + * Registers attachment handlers for the given service and entity + * @param {*} records - The records to process + * @param {import('@sap/cds').Request} req - The request object + */ async deleteAttachmentsWithKeys(records, req) { if (req?.attachmentsToDelete?.length > 0) { req.attachmentsToDelete.forEach((attachment) => { @@ -358,6 +391,10 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Registers attachment handlers for the given service and entity + * @param {import('@sap/cds').Request} req - The request object + */ async attachDeletionData(req) { const attachments = cds.model.definitions[req?.target?.name + ".attachments"] if (attachments) { @@ -379,6 +416,11 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Registers attachment handlers for the given service and entity + * @param {import('@sap/cds').Request} req - The request object + * @param {import('express').NextFunction} next - The next middleware function + */ async updateContentHandler(req, next) { logConfig.debug(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`) // Check separate object store instances @@ -420,7 +462,18 @@ module.exports = class AzureAttachmentsService extends require("./basic") { await blobClient.upload(req.data.content, contentLength) const keys = { ID: targetID } - scanRequest(req.target, keys, req) + + const scanRequestJob = cds.spawn(async () => { + await scanRequest(req.target, keys) + }) + + scanRequestJob.on('error', async (err) => { + logConfig.withSuggestion('error', + 'Failed to initiate malware scan for attachment', err, + 'Check malware scanner configuration and connectivity', + { keys, errorMessage: err.message }) + }) + logConfig.debug(`[Azure Upload] Uploaded file using updateContentHandler for ${req.target.name}`) } } else if (req?.data?.note) { @@ -432,6 +485,11 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Registers attachment handlers for the given service and entity + * @param {{draftEntity: string, activeEntity:cds.Entity, id:string}} param0 - The service and entities + * @returns + */ async getAttachmentsToDelete({ draftEntity, activeEntity, id }) { const [draftAttachments, activeAttachments] = await Promise.all([ SELECT.from(draftEntity).columns("url").where(id), @@ -444,6 +502,10 @@ module.exports = class AzureAttachmentsService extends require("./basic") { .map(({ url }) => ({ url })) } + /** + * Add draft attachment deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ async attachDraftDeletionData(req) { const draftEntity = cds.model.definitions[req?.target?.name] const name = req?.target?.name @@ -465,6 +527,10 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * Add draft discard deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ async attachDraftDiscardDeletionData(req) { const { ID } = req.data const parentEntity = req.target.name.split('.').slice(0, -1).join('.') @@ -484,6 +550,9 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } + /** + * @inheritdoc + */ registerUpdateHandlers(srv, entity, mediaElement) { srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) @@ -497,6 +566,9 @@ module.exports = class AzureAttachmentsService extends require("./basic") { }) } + /** + * @inheritdoc + */ registerDraftUpdateHandlers(srv, entity, mediaElement) { srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) @@ -528,11 +600,17 @@ module.exports = class AzureAttachmentsService extends require("./basic") { }) } - async delete(blobName, req) { - logConfig.debug(`[Azure Upload] Executing delete for file in ${req.target.name}`) + /** + * Deletes a file from Azure Blob Storage + * @param {string} Key - The key of the file to delete + * @returns {Promise} - Promise resolving when deletion is complete + */ + async delete(blobName) { + const tenantID = cds.context.tenant + logConfig.debug(`[S3 Upload] Executing delete for file ${Key} in bucket ${this.containerName}`) + // Check separate object store instances if (separateObjectStore) { - const tenantID = cds.context.tenant await this.createAzureClient(tenantID) } @@ -541,8 +619,11 @@ module.exports = class AzureAttachmentsService extends require("./basic") { return response._response.status === 202 } - async deleteInfectedAttachment(Attachments, key, req) { + /** + * @inheritdoc + */ + async deleteInfectedAttachment(Attachments, key) { const response = await SELECT.from(Attachments, key).columns('url') - return await this.delete(response.url, req) + return await this.delete(response.url) } } diff --git a/lib/malwareScanner.js b/lib/malwareScanner.js index 2bccd331..6a54cb9c 100644 --- a/lib/malwareScanner.js +++ b/lib/malwareScanner.js @@ -137,7 +137,7 @@ async function scanRequest(Attachments, key, req) { fileId: key.ID, entity: currEntity.name }) - await AttachmentsSrv.deleteInfectedAttachment(currEntity, key, req) + await AttachmentsSrv.deleteInfectedAttachment(currEntity, key) } else if (status === "Clean") { logConfig.info('Malware scan completed - file is clean', { fileId: key.ID, From c06c5180e5833f1c7d27baf5a3ca88f6e6396e06 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 17 Oct 2025 10:14:13 +0200 Subject: [PATCH 14/28] Improve error handling for credential validation in AWS S3 and Azure Blob Storage services --- lib/aws-s3.js | 13 +++++++------ lib/azure-blob-storage.js | 41 ++++++++++++--------------------------- 2 files changed, 19 insertions(+), 35 deletions(-) diff --git a/lib/aws-s3.js b/lib/aws-s3.js index 63d5fa1d..ad5a14ca 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -46,8 +46,9 @@ module.exports = class AWSAttachmentsService extends require("./basic") { const missingFields = requiredFields.filter(field => !creds[field]) if (missingFields.length > 0) { - logConfig.configValidation('objectStore.credentials', creds, false, - `Object Store credentials missing: ${missingFields.join(', ')}`) + if (Object.keys(creds).includes('container_name')) { + throw new Error('Azure Blob Storage credentials found where AWS S3 credentials expected, please check your service bindings.') + } throw new Error(`Missing Object Store credentials: ${missingFields.join(', ')}`) } @@ -429,7 +430,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { * @param {import('express').NextFunction} next - The next middleware function */ async updateContentHandler(req, next) { - logConfig.debug(`[S3 Upload] Uploading file using updateContentHandler for ${req.target.name}`) + logConfig.debug(`[AWS S3] Uploading file using updateContentHandler for ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { @@ -470,12 +471,12 @@ module.exports = class AWSAttachmentsService extends require("./basic") { { keys, errorMessage: err.message }) }) - logConfig.debug(`[S3 Upload] Uploaded file using updateContentHandler for ${req.target.name}`) + logConfig.debug(`[AWS S3] Uploaded file using updateContentHandler for ${req.target.name}`) } } else if (req?.data?.note) { const key = { ID: targetID } await super.update(req.target, key, { note: req.data.note }) - logConfig.debug(`[S3 Upload] Updated file upload with note for ${req.target.name}`) + logConfig.debug(`[AWS S3] Updated file upload with note for ${req.target.name}`) } else { next() } @@ -603,7 +604,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { */ async delete(Key) { const tenantID = cds.context.tenant - logConfig.debug(`[S3 Upload] Executing delete for file ${Key} in bucket ${this.bucket}`) + logConfig.debug(`[AWS S3] Executing delete for file ${Key} in bucket ${this.bucket}`) // Check separate object store instances if (separateObjectStore) { diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index a78f3d94..74442010 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -35,8 +35,9 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const creds = cds.env.requires?.objectStore?.credentials if (!creds) { - logConfig.configValidation('objectStore.credentials', creds, false, - 'Bind an Azure Blob Storage instance to your application or configure separateObjectStore for multitenancy') + if (Object.keys(creds).includes('bucket')) { + throw new Error('AWS S3 credentials found where Azure Blob Storage credentials expected, please check your service bindings.') + } throw new Error("SAP Object Store instance is not bound.") } @@ -227,33 +228,15 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const blobClient = this.containerClient.getBlockBlobClient(blobName) - // Handle different content types (Buffer, stream, etc.) - let contentLength - if (Buffer.isBuffer(content)) { - contentLength = content.length - } else if (content && typeof content.length === 'number') { - contentLength = content.length - } else if (content && typeof content.size === 'number') { - contentLength = content.size - } else { - // For streams or other content types, convert to buffer first - const chunks = [] - for await (const chunk of content) { - chunks.push(chunk) - } - content = Buffer.concat(chunks) - contentLength = content.length - } - logConfig.debug('Uploading file to Azure Blob Storage', { containerName: this.containerName, blobName, filename: metadata.filename, - contentSize: contentLength + contentSize: content.length || content.size || 'unknown' }) const stored = super.put(attachments, metadata, null, isDraftEnabled) - await Promise.all([stored, blobClient.upload(content, contentLength)]) + await Promise.all([stored, blobClient.uploadData(content)]) const duration = Date.now() - startTime logConfig.debug('File upload to Azure Blob Storage completed successfully', { @@ -301,7 +284,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const tenantID = cds.context.tenant - logConfig.processStep('Starting file download from Azure Blob Storage', { + logConfig.processStep('Starting stream from Azure Blob Storage', { attachmentEntity: attachments.name, keys, tenant: tenantID @@ -333,7 +316,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const blobName = response.url - logConfig.debug('Downloading file from Azure Blob Storage', { + logConfig.debug('Streaming file from Azure Blob Storage', { containerName: this.containerName, blobName }) @@ -342,7 +325,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { const downloadResponse = await blobClient.download() const duration = Date.now() - startTime - logConfig.debug('File download from Azure Blob Storage completed successfully', { + logConfig.debug('File streamed from Azure Blob Storage successfully', { fileId: keys.ID, containerName: this.containerName, blobName, @@ -422,7 +405,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { * @param {import('express').NextFunction} next - The next middleware function */ async updateContentHandler(req, next) { - logConfig.debug(`[Azure Upload] Uploading file using updateContentHandler for ${req.target.name}`) + logConfig.debug(`[Azure] Uploading file using updateContentHandler for ${req.target.name}`) // Check separate object store instances if (separateObjectStore) { const tenantID = cds.context.tenant @@ -474,12 +457,12 @@ module.exports = class AzureAttachmentsService extends require("./basic") { { keys, errorMessage: err.message }) }) - logConfig.debug(`[Azure Upload] Uploaded file using updateContentHandler for ${req.target.name}`) + logConfig.debug(`[Azure] Uploaded file using updateContentHandler for ${req.target.name}`) } } else if (req?.data?.note) { const key = { ID: targetID } await super.update(req.target, key, { note: req.data.note }) - logConfig.debug(`[Azure Upload] Updated file upload with note for ${req.target.name}`) + logConfig.debug(`[Azure] Updated file upload with note for ${req.target.name}`) } else { next() } @@ -607,7 +590,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { */ async delete(blobName) { const tenantID = cds.context.tenant - logConfig.debug(`[S3 Upload] Executing delete for file ${blobName} in bucket ${this.containerName}`) + logConfig.debug(`[Azure] Executing delete for file ${blobName} in bucket ${this.containerName}`) // Check separate object store instances if (separateObjectStore) { From 261e78c64b9b302291267b408b6853c13abf3f97 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Fri, 17 Oct 2025 10:23:37 +0200 Subject: [PATCH 15/28] Add placeholder for deleteInfectedAttachment method in AWS and Azure storage services --- lib/aws-s3.js | 1 + lib/azure-blob-storage.js | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/aws-s3.js b/lib/aws-s3.js index ad5a14ca..bb55f30a 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -621,6 +621,7 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } /** + * Requires implementation as delete of infected attachment is specific to storage service * @inheritdoc */ async deleteInfectedAttachment(Attachments, key) { diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 74442010..89839924 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -603,6 +603,7 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } /** + * Requires implementation as delete of infected attachment is specific to storage service * @inheritdoc */ async deleteInfectedAttachment(Attachments, key) { From 5c23870600cc84f38fbbbc4da4df7518194fd67e Mon Sep 17 00:00:00 2001 From: Simon Kobler <32038731+KoblerS@users.noreply.github.com> Date: Fri, 17 Oct 2025 08:52:17 +0200 Subject: [PATCH 16/28] Add CODEOWNERS file to define repository ownership (#274) --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..cd81dd46 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ + +** @cap-js/cdsmunich \ No newline at end of file From ad4466ec3506e4214f99980d9139e0ca964278c7 Mon Sep 17 00:00:00 2001 From: Simon Kobler Date: Mon, 20 Oct 2025 13:20:35 +0200 Subject: [PATCH 17/28] Refactor AzureAttachmentsService: remove unused attachment deletion methods and streamline draft update handlers --- lib/azure-blob-storage.js | 185 +++++++------------------------------- 1 file changed, 33 insertions(+), 152 deletions(-) diff --git a/lib/azure-blob-storage.js b/lib/azure-blob-storage.js index 89839924..8ea6967b 100644 --- a/lib/azure-blob-storage.js +++ b/lib/azure-blob-storage.js @@ -351,54 +351,6 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } - /** - * Deletes a file from Azure Blob Storage based on the provided key - * @param {string} key - The key of the file to delete - * @returns {Promise} - Promise resolving when deletion is complete - */ - async deleteAttachment(key, req) { - if (!key) return - return await this.delete(key, req) - } - - /** - * Registers attachment handlers for the given service and entity - * @param {*} records - The records to process - * @param {import('@sap/cds').Request} req - The request object - */ - async deleteAttachmentsWithKeys(records, req) { - if (req?.attachmentsToDelete?.length > 0) { - req.attachmentsToDelete.forEach((attachment) => { - this.deleteAttachment(attachment.url, req) - }) - } - } - - /** - * Registers attachment handlers for the given service and entity - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDeletionData(req) { - const attachments = cds.model.definitions[req?.target?.name + ".attachments"] - if (attachments) { - const diffData = await req.diff() - let deletedAttachments = [] - diffData.attachments?.filter((object) => { - return object._op === "delete" - }) - .map((attachment) => { - deletedAttachments.push(attachment.ID) - }) - - if (deletedAttachments.length > 0) { - let attachmentsToDelete = await SELECT.from(attachments).columns("url").where({ ID: { in: [...deletedAttachments] } }) - if (attachmentsToDelete.length > 0) { - req.attachmentsToDelete = attachmentsToDelete - } - } - } - } - /** * Registers attachment handlers for the given service and entity * @param {import('@sap/cds').Request} req - The request object @@ -468,119 +420,48 @@ module.exports = class AzureAttachmentsService extends require("./basic") { } } - /** - * Registers attachment handlers for the given service and entity - * @param {{draftEntity: string, activeEntity:cds.Entity, id:string}} param0 - The service and entities - * @returns - */ - async getAttachmentsToDelete({ draftEntity, activeEntity, id }) { - const [draftAttachments, activeAttachments] = await Promise.all([ - SELECT.from(draftEntity).columns("url").where(id), - SELECT.from(activeEntity).columns("url").where(id) - ]) - - const activeUrls = new Set(activeAttachments.map(a => a.url)) - return draftAttachments - .filter(({ url }) => !activeUrls.has(url)) - .map(({ url }) => ({ url })) - } - - /** - * Add draft attachment deletion data to the request - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDraftDeletionData(req) { - const draftEntity = cds.model.definitions[req?.target?.name] - const name = req?.target?.name - const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined - - if (!draftEntity || !activeEntity) return - - const diff = await req.diff() - if (diff._op !== "delete" || !diff.ID) return - - const attachmentsToDelete = await this.getAttachmentsToDelete({ - draftEntity, - activeEntity, - id: { ID: diff.ID } - }) - - if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete - } - } - - /** - * Add draft discard deletion data to the request - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDraftDiscardDeletionData(req) { - const { ID } = req.data - const parentEntity = req.target.name.split('.').slice(0, -1).join('.') - const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`] - const activeEntity = cds.model.definitions[`${parentEntity}.attachments`] - - if (!draftEntity || !activeEntity) return - - const attachmentsToDelete = await this.getAttachmentsToDelete({ - draftEntity, - activeEntity, - id: { up__ID: ID } - }) - - if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete - } - } - - /** - * @inheritdoc - */ - registerUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) - - srv.prepend(() => { - srv.on( - "PUT", - mediaElement, - this.updateContentHandler.bind(this) - ) - }) - } - /** * @inheritdoc */ registerDraftUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) - - // case: attachments uploaded in draft and draft is discarded - srv.before("CANCEL", entity.drafts, this.attachDraftDiscardDeletionData.bind(this)) - srv.after("CANCEL", entity.drafts, this.deleteAttachmentsWithKeys.bind(this)) - - srv.prepend(() => { - if (mediaElement.drafts) { + for (const mediaElement of mediaElements) { + srv.prepend(() => { srv.on( "PUT", - mediaElement.drafts, + mediaElement, this.updateContentHandler.bind(this) ) + }) + } + } - // case: attachments uploaded in draft and deleted before saving - srv.before( - "DELETE", - mediaElement.drafts, - this.attachDraftDeletionData.bind(this) - ) - srv.after( - "DELETE", - mediaElement.drafts, - this.deleteAttachmentsWithKeys.bind(this) - ) - } - }) + /** + * @inheritdoc + */ + registerDraftUpdateHandlers(srv, entity, mediaElements) { + for (const mediaElement of mediaElements) { + srv.prepend(() => { + if (mediaElement.drafts) { + srv.on( + "PUT", + mediaElement.drafts, + this.updateContentHandler.bind(this) + ) + + // case: attachments uploaded in draft and deleted before saving + srv.before( + "DELETE", + mediaElement.drafts, + this.attachDraftDeletionData.bind(this) + ) + srv.after( + "DELETE", + mediaElement.drafts, + this.deleteAttachmentsWithKeys.bind(this) + ) + } + }) + } } /** From fbdd785e4f4fb7c633c443fd27e6fd3e0318fa5c Mon Sep 17 00:00:00 2001 From: vlovini Date: Mon, 20 Oct 2025 08:24:49 -0300 Subject: [PATCH 18/28] [268]- Fix/Delete cascading attachments when deleting parent (#269) This pull request addresses a bug where attachments were not deleted from AWS due to incorrect entity path resolution. The fix adds support for both `.attachments` and `_attachments` suffixes. Note: this is a temporary fix and I suggest to find another solution instead of hardcoding the children entities by the name, --------- Co-authored-by: Vinicius Lora Co-authored-by: Eric Peairs Co-authored-by: Simon Kobler Co-authored-by: Simon Kobler <32038731+KoblerS@users.noreply.github.com> Co-authored-by: Marten Schiwek --- .gitignore | 2 +- lib/aws-s3.js | 200 +++++--------------------- lib/basic.js | 149 ++++++++++++++++++- lib/plugin.js | 28 +++- package.json | 1 + tests/incidents-app/.gitignore | 3 + tests/incidents-app/package.json | 4 - tests/integration/attachments.test.js | 22 ++- 8 files changed, 228 insertions(+), 181 deletions(-) create mode 100644 tests/incidents-app/.gitignore diff --git a/.gitignore b/.gitignore index aaf6b5cd..cc008dab 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ node_modules/ gen/ .vscode/ -package-lock.json \ No newline at end of file +package-lock.json diff --git a/lib/aws-s3.js b/lib/aws-s3.js index 0e7552c3..5046e9d5 100644 --- a/lib/aws-s3.js +++ b/lib/aws-s3.js @@ -77,6 +77,10 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } else { logConfig.info('Separate object store mode enabled - clients will be created per tenant') } + + this.on('DeleteAttachment', async msg => { + await this.delete(msg.url); + }); } /** @@ -376,54 +380,6 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } - /** - * Deletes a file from S3 based on the provided key - * @param {string} key - The key of the file to delete - * @returns {Promise} - Promise resolving when deletion is complete - */ - async deleteAttachment(key) { - if (!key) return - return await this.delete(key) - } - - /** - * Registers attachment handlers for the given service and entity - * @param {*} records - The records to process - * @param {import('@sap/cds').Request} req - The request object - */ - async deleteAttachmentsWithKeys(records, req) { - if (req?.attachmentsToDelete?.length > 0) { - req.attachmentsToDelete.forEach((attachment) => { - this.deleteAttachment(attachment.url) - }) - } - } - - /** - * Registers attachment handlers for the given service and entity - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDeletionData(req) { - const attachments = cds.model.definitions[req?.target?.name + ".attachments"] - if (attachments) { - const diffData = await req.diff() - let deletedAttachments = [] - diffData.attachments?.filter((object) => { - return object._op === "delete" - }) - .map((attachment) => { - deletedAttachments.push(attachment.ID) - }) - - if (deletedAttachments.length > 0) { - let attachmentsToDelete = await SELECT.from(attachments).columns("url").where({ ID: { in: [...deletedAttachments] } }) - if (attachmentsToDelete.length > 0) { - req.attachmentsToDelete = attachmentsToDelete - } - } - } - } - /** * Registers attachment handlers for the given service and entity * @param {import('@sap/cds').Request} req - The request object @@ -482,128 +438,48 @@ module.exports = class AWSAttachmentsService extends require("./basic") { } } - /** - * Registers attachment handlers for the given service and entity - * @param {{draftEntity: string, activeEntity:cds.Entity, id:string}} param0 - The service and entities - * @returns - */ - async getAttachmentsToDelete({ draftEntity, activeEntity, whereXpr }) { - const [draftAttachments, activeAttachments] = await Promise.all([ - SELECT.from(draftEntity).columns("url").where(whereXpr), - SELECT.from(activeEntity).columns("url").where(whereXpr) - ]) - - const activeUrls = new Set(activeAttachments.map(a => a.url)) - return draftAttachments - .filter(({ url }) => !activeUrls.has(url)) - .map(({ url }) => ({ url })) - } - - /** - * Add draft attachment deletion data to the request - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDraftDeletionData(req) { - const draftEntity = cds.model.definitions[req?.target?.name] - const name = req?.target?.name - const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined - - if (!draftEntity || !activeEntity) return - - const diff = await req.diff() - if (diff._op !== "delete" || !diff.ID) return - - const attachmentsToDelete = await this.getAttachmentsToDelete({ - draftEntity, - activeEntity, - whereXpr: { ID: diff.ID } - }) - - if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete - } - } - - /** - * Add draft discard deletion data to the request - * @param {import('@sap/cds').Request} req - The request object - */ - async attachDraftDiscardDeletionData(req) { - const parentEntity = req.target.name.split('.').slice(0, -1).join('.') - const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`] - const activeEntity = cds.model.definitions[`${parentEntity}.attachments`] - if (!draftEntity || !activeEntity) return - - const whereXpr = [] - for (const foreignKey of activeEntity.keys['up_']._foreignKeys) { - if (whereXpr.length) { - whereXpr.push('and') - } - whereXpr.push( - {ref: [foreignKey.parentElement.name]}, - '=', - {val: req.data[foreignKey.childElement.name]} - ) - } - const attachmentsToDelete = await this.getAttachmentsToDelete({ - draftEntity, - activeEntity, - whereXpr - }) - - if (attachmentsToDelete.length) { - req.attachmentsToDelete = attachmentsToDelete - } - } - - /** - * @inheritdoc - */ - registerUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) - - srv.prepend(() => { - srv.on( - "PUT", - mediaElement, - this.updateContentHandler.bind(this) - ) - }) - } - /** * @inheritdoc */ - registerDraftUpdateHandlers(srv, entity, mediaElement) { - srv.before(["DELETE", "UPDATE"], entity, this.attachDeletionData.bind(this)) - srv.after(["DELETE", "UPDATE"], entity, this.deleteAttachmentsWithKeys.bind(this)) - - // case: attachments uploaded in draft and draft is discarded - srv.before("CANCEL", entity.drafts, this.attachDraftDiscardDeletionData.bind(this)) - srv.after("CANCEL", entity.drafts, this.deleteAttachmentsWithKeys.bind(this)) - - srv.prepend(() => { - if (mediaElement.drafts) { + registerUpdateHandlers(srv, mediaElements) { + for (const mediaElement of mediaElements) { + srv.prepend(() => { srv.on( "PUT", - mediaElement.drafts, + mediaElement, this.updateContentHandler.bind(this) ) + }) + } + } - // case: attachments uploaded in draft and deleted before saving - srv.before( - "DELETE", - mediaElement.drafts, - this.attachDraftDeletionData.bind(this) - ) - srv.after( - "DELETE", - mediaElement.drafts, - this.deleteAttachmentsWithKeys.bind(this) - ) - } - }) + /** + * @inheritdoc + */ + registerDraftUpdateHandlers(srv, entity, mediaElements) { + for (const mediaElement of mediaElements) { + srv.prepend(() => { + if (mediaElement.drafts) { + srv.on( + "PUT", + mediaElement.drafts, + this.updateContentHandler.bind(this) + ) + + // case: attachments uploaded in draft and deleted before saving + srv.before( + "DELETE", + mediaElement.drafts, + this.attachDraftDeletionData.bind(this) + ) + srv.after( + "DELETE", + mediaElement.drafts, + this.deleteAttachmentsWithKeys.bind(this) + ) + } + }) + } } /** diff --git a/lib/basic.js b/lib/basic.js index c467f5bf..a9d9db30 100644 --- a/lib/basic.js +++ b/lib/basic.js @@ -3,7 +3,7 @@ const { SELECT, UPSERT, UPDATE } = cds.ql const { scanRequest } = require('./malwareScanner') const { logConfig } = require('./logger') -module.exports = class AttachmentsService extends cds.Service { +class AttachmentsService extends cds.Service { /** * Uploads attachments to the database and initiates malware scans for database-stored files * @param {cds.Entity} attachments - Attachments entity definition @@ -173,10 +173,12 @@ module.exports = class AttachmentsService extends cds.Service { * @param {cds.Entity} entity - The entity containing attachment associations * @param {cds.Entity} target - Attachments entity definition to register handlers for */ - registerUpdateHandlers(srv, entity, target) { - srv.after("PUT", target, async (req) => { - await this.nonDraftHandler(req, target, srv) - }) + registerUpdateHandlers(srv, targets) { + for (const target of targets) { + srv.after("PUT", target, async (req) => { + await this.nonDraftHandler(req, target, srv) + }) + } } /** @@ -185,8 +187,10 @@ module.exports = class AttachmentsService extends cds.Service { * @param {cds.Entity} entity - The entity containing attachment associations * @param {cds.Entity} target - Attachments entity definition to register handlers for */ - registerDraftUpdateHandlers(srv, entity, target) { - srv.after("SAVE", entity, this.draftSaveHandler(target)) + registerDraftUpdateHandlers(srv, entity, targets) { + for (const target of targets) { + srv.after("SAVE", entity, this.draftSaveHandler(target)) + } return } @@ -202,6 +206,7 @@ module.exports = class AttachmentsService extends cds.Service { attachmentName: Attachments.name, attachmentKey: key }) + return await UPDATE(Attachments, key).with(data) } @@ -225,4 +230,134 @@ module.exports = class AttachmentsService extends cds.Service { async deleteInfectedAttachment(Attachments, key) { return await UPDATE(Attachments, key).with({ content: null }) } + + + + /** + * Registers attachment handlers for the given service and entity + * @param {*} records - The records to process + * @param {import('@sap/cds').Request} req - The request object + */ + async deleteAttachmentsWithKeys(records, req) { + req.attachmentsToDelete?.forEach(async (attachment) => { + if (attachment.url) { + const attachmentsSrv = await cds.connect.to('attachments') + await attachmentsSrv.emit('DeleteAttachment', { url: attachment.url }) + } else { + logConfig.warn(`Attachment cannot be deleted because URL is missing`, attachment); + } + }) + } + + /** + * Registers attachment handlers for the given service and entity + * @param {import('@sap/cds').Request} req - The request object + */ + async attachDeletionData(req) { + const attachmentCompositions = Object.keys(req?.target?.associations) + .filter(assoc => req?.target?.associations[assoc]._target['@_is_media_data']) + if (attachmentCompositions.length > 0) { + const diffData = await req.diff() + const queries = [] + for (const attachmentsComp of attachmentCompositions) { + let deletedAttachments = [] + diffData[attachmentsComp]?.forEach(object => { + if (object._op === "delete") { + deletedAttachments.push(object.ID) + } + }) + if (deletedAttachments.length) { + queries.push( + SELECT.from(req.target.associations[attachmentsComp]._target).columns("url").where({ ID: { in: [...deletedAttachments] } }) + ) + } + } + if (queries.length > 0) { + const attachmentsToDelete = (await Promise.all(queries)).flat() + if (attachmentsToDelete.length > 0) { + req.attachmentsToDelete = attachmentsToDelete + } + } + } + } + + /** + * Registers attachment handlers for the given service and entity + * @param {{draftEntity: string, activeEntity:cds.Entity, id:string}} param0 - The service and entities + * @returns + */ + async getAttachmentsToDelete({ draftEntity, activeEntity, whereXpr }) { + const [draftAttachments, activeAttachments] = await Promise.all([ + SELECT.from(draftEntity).columns("url").where(whereXpr), + SELECT.from(activeEntity).columns("url").where(whereXpr) + ]) + + const activeUrls = new Set(activeAttachments.map(a => a.url)) + return draftAttachments + .filter(({ url }) => !activeUrls.has(url)) + .map(({ url }) => ({ url })) + } + + /** + * Add draft attachment deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ + async attachDraftDeletionData(req) { + const draftEntity = cds.model.definitions[req?.target?.name] + const name = req?.target?.name + const activeEntity = name ? cds.model.definitions?.[name.split(".").slice(0, -1).join(".")] : undefined + + if (!draftEntity || !activeEntity) return + + const diff = await req.diff() + if (diff._op !== "delete" || !diff.ID) return + + const attachmentsToDelete = await this.getAttachmentsToDelete({ + draftEntity, + activeEntity, + whereXpr: { ID: diff.ID } + }) + + if (attachmentsToDelete.length) { + req.attachmentsToDelete = attachmentsToDelete + } + } + + /** + * Add draft discard deletion data to the request + * @param {import('@sap/cds').Request} req - The request object + */ + async attachDraftDiscardDeletionData(req) { + const parentEntity = req.target.name.split('.').slice(0, -1).join('.') + const draftEntity = cds.model.definitions[`${parentEntity}.attachments.drafts`] + const activeEntity = cds.model.definitions[`${parentEntity}.attachments`] + if (!draftEntity || !activeEntity) return + + const whereXpr = [] + for (const foreignKey of activeEntity.keys['up_']._foreignKeys) { + if (whereXpr.length) { + whereXpr.push('and') + } + whereXpr.push( + {ref: [foreignKey.parentElement.name]}, + '=', + {val: req.data[foreignKey.childElement.name]} + ) + } + + const attachmentsToDelete = await this.getAttachmentsToDelete({ + draftEntity, + activeEntity, + whereXpr + }) + + if (attachmentsToDelete.length > 0) { + req.attachmentsToDelete = attachmentsToDelete + } + } } + + +AttachmentsService.prototype._is_queueable = true; + +module.exports = AttachmentsService; diff --git a/lib/plugin.js b/lib/plugin.js index b2e4f96b..0c0e27e2 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -44,6 +44,9 @@ cds.once("served", async function registerPluginHandlers() { if (srv instanceof cds.ApplicationService) { Object.values(srv.entities).forEach((entity) => { + const mediaDraftEntities = [] + const mediaEntities = [] + for (let elementName in entity.elements) { if (elementName === "SiblingEntity") continue // REVISIT: Why do we have this? const element = entity.elements[elementName], target = element._target @@ -57,17 +60,32 @@ cds.once("served", async function registerPluginHandlers() { srv.before("READ", targets, validateAttachment) srv.after("READ", targets, readAttachment) - + + srv.before("PUT", isDraft ? target.drafts : target, (req) => validateAttachmentSize(req)) + if (isDraft) { - srv.before("PUT", target.drafts, (req) => validateAttachmentSize(req)) srv.before("NEW", target.drafts, (req) => onPrepareAttachment(req)) - AttachmentsSrv.registerDraftUpdateHandlers(srv, entity, target) + mediaDraftEntities.push(target) } else { - srv.before("PUT", target, (req) => validateAttachmentSize(req)) srv.before("CREATE", target, (req) => onPrepareAttachment(req)) - AttachmentsSrv.registerUpdateHandlers(srv, entity, target) + mediaEntities.push(target) } } + + if (mediaDraftEntities.length) { + AttachmentsSrv.registerDraftUpdateHandlers(srv, entity, mediaDraftEntities) + srv.before(["DELETE", "UPDATE"], entity, AttachmentsSrv.attachDeletionData.bind(AttachmentsSrv)) + srv.after(["DELETE", "UPDATE"], entity, AttachmentsSrv.deleteAttachmentsWithKeys.bind(AttachmentsSrv)) + + // case: attachments uploaded in draft and draft is discarded + srv.before("CANCEL", entity.drafts, AttachmentsSrv.attachDraftDiscardDeletionData.bind(AttachmentsSrv)) + srv.after("CANCEL", entity.drafts, AttachmentsSrv.deleteAttachmentsWithKeys.bind(AttachmentsSrv)) + } + if (mediaEntities.length) { + AttachmentsSrv.registerUpdateHandlers(srv, mediaEntities) + srv.before(["DELETE", "UPDATE"], entity, AttachmentsSrv.attachDeletionData.bind(AttachmentsSrv)) + srv.after(["DELETE", "UPDATE"], entity, AttachmentsSrv.deleteAttachmentsWithKeys.bind(AttachmentsSrv)) + } }) } } diff --git a/package.json b/package.json index 9b56f62c..40f6cfeb 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ } }, "attachments": { + "outbox": true, "scan": true, "objectStore": { "kind": "separate" diff --git a/tests/incidents-app/.gitignore b/tests/incidents-app/.gitignore new file mode 100644 index 00000000..b92ceaa2 --- /dev/null +++ b/tests/incidents-app/.gitignore @@ -0,0 +1,3 @@ + +# added by cds +.cdsrc-private.json diff --git a/tests/incidents-app/package.json b/tests/incidents-app/package.json index dd1afd1c..afdd011a 100644 --- a/tests/incidents-app/package.json +++ b/tests/incidents-app/package.json @@ -22,10 +22,6 @@ } } } - }, - "attachments": { - "kind": "db", - "scan": false } } }, diff --git a/tests/integration/attachments.test.js b/tests/integration/attachments.test.js index ede19402..bae0c867 100644 --- a/tests/integration/attachments.test.js +++ b/tests/integration/attachments.test.js @@ -147,15 +147,33 @@ describe("Tests for uploading/deleting attachments through API calls - in-memory ) expect(contentResponse.status).to.equal(200) + const attachmentData = await GET( + `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=true)` + ) + + //trigger to delete attachment + await utils.draftModeEdit("processor", "Incidents", incidentID, "ProcessorService") + + + const db = await cds.connect.to('db'); + const attachmentIDs = [] + db.before('*', req => { + if (req.event === 'CREATE' && req.target?.name === 'cds.outbox.Messages') { + const msg = JSON.parse(req.query.INSERT.entries[0].msg); + attachmentIDs.push(msg.data.url) + } + }) + //delete attachment let action = () => DELETE( `odata/v4/processor/Incidents_attachments(up__ID=${incidentID},ID=${sampleDocID},IsActiveEntity=false)` ) - //trigger to delete attachment - await utils.draftModeEdit("processor", "Incidents", incidentID, "ProcessorService") await utils.draftModeSave("processor", "Incidents", incidentID, action, "ProcessorService") + expect(attachmentIDs[0]).to.equal(attachmentData.data.url); + expect(attachmentIDs.length).to.equal(1); + //read attachments list for Incident const response = await GET( `odata/v4/processor/Incidents(ID=${incidentID},IsActiveEntity=true)/attachments` From fbd352737fb6183b994d49d8a7e5ccdff7dbf034 Mon Sep 17 00:00:00 2001 From: Marten Schiwek Date: Mon, 20 Oct 2025 15:13:37 +0200 Subject: [PATCH 19/28] Only have one sample in the plugin repo (#277) Remove the xmpl folder and not working sample in favour of one sample in the tests folder. Adjusts Readme and Contributing.md to point to this sample. --- CONTRIBUTING.md | 10 ++++++++ README.md | 4 +-- package.json | 5 +++- .../app/incidents/webapp/manifest.json | 2 +- xmpl/.gitignore | 3 --- xmpl/README.md | 13 ---------- xmpl/db/attachments.cds | 7 ----- xmpl/db/content/Broken Solar Panel.jpg | Bin 450769 -> 0 bytes xmpl/db/content/INVERTER FAULT REPORT.pdf | Bin 26000 -> 0 bytes xmpl/db/content/Inverter-error-logs.txt | 24 ------------------ xmpl/db/content/No_current.xlsx | Bin 9392 -> 0 bytes xmpl/db/content/Solar Panel Report.pdf | Bin 55782 -> 0 bytes xmpl/db/content/strange-noise.csv | 11 -------- xmpl/db/init.js | 22 ---------------- xmpl/package.json | 13 ---------- xmpl/srv/service.cds | 1 - 16 files changed, 17 insertions(+), 98 deletions(-) delete mode 100644 xmpl/.gitignore delete mode 100644 xmpl/README.md delete mode 100644 xmpl/db/attachments.cds delete mode 100644 xmpl/db/content/Broken Solar Panel.jpg delete mode 100644 xmpl/db/content/INVERTER FAULT REPORT.pdf delete mode 100644 xmpl/db/content/Inverter-error-logs.txt delete mode 100644 xmpl/db/content/No_current.xlsx delete mode 100644 xmpl/db/content/Solar Panel Report.pdf delete mode 100644 xmpl/db/content/strange-noise.csv delete mode 100644 xmpl/db/init.js delete mode 100644 xmpl/package.json delete mode 100644 xmpl/srv/service.cds diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6319573a..c571a5c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,16 @@ Should you wish to work on an issue, please claim it first by commenting on the If you have questions about one of the issues, please comment on them, and one of the maintainers will clarify. +## Local development setup + +`./tests/incidents-app/` contains a working sample with which the plugin can be locally tested and which is used by the integration tests. + +`cd ./tests/incidents-app/` into the app and run `cds watch` within the folder to have the Incidents app running but with the local version of the plugin. + +If you want to test your implementation against the BTP Object Store or the Malware Scanning Service, use [`cds bind`](https://cap.cloud.sap/docs/advanced/hybrid-testing) and run with `cds watch --profile hybrid` to test those changes. + +If you are prompted locally for authentication use CAPs local development mock values of "alice" and "1234". + ## Contributing Code or Documentation You are welcome to contribute code in order to fix a bug or to implement a new feature that is logged as an issue. diff --git a/README.md b/README.md index bc4cd10e..d5bfa71e 100755 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ We can try out the scenarios where the attachments contents are stored locally i 3. The `Attachments` type has generated an out-of-the-box Attachments table (see 1) at the bottom of the Object page: Attachments Table -4. **Upload a file** by going into Edit mode and either using the **Upload** button on the Attachments table or by drag/drop. Then click the **Save** button to have that file stored that file in the dedicated resource (database, S3 bucket, etc.). We demonstrate this by uploading the PDF file from [_xmpl/db/content/Solar Panel Report.pdf_](./xmpl/db/content/Solar%20Panel%20Report.pdf): +4. **Upload a file** by going into Edit mode and either using the **Upload** button on the Attachments table or by drag/drop. Then click the **Save** button to have that file stored that file in the dedicated resource (database, S3 bucket, etc.). We demonstrate this by uploading the PDF file from [_tests/integration/content/sample.pdf_](./tests/integration/content/sample.pdf): Upload an attachment 6. **Delete a file** by going into Edit mode and selecting the file(s) and by using the **Delete** button on the Attachments table. Then click the **Save** button to have that file deleted from the resource (database, S3 bucket, etc.). We demonstrate this by deleting the previously uploaded PDF file: `Solar Panel Report.pdf` @@ -189,7 +189,7 @@ To ensure tenant identification when using a shared object store instance, the p ## Contributing -This project is open to feature requests/suggestions, bug reports etc. via [GitHub issues](https://github.com/cap-js/attachments/issues). Contribution and feedback are encouraged and always welcome. For more information about how to contribute, the project structure, as well as additional contribution information, see our [Contribution Guidelines](CONTRIBUTING.md). +This project is open to feature requests/suggestions, bug reports etc. via [GitHub issues](https://github.com/cap-js/attachments/issues). Contribution and feedback are encouraged and always welcome. For more information about how to contribute, the project structure, the **local development setup**, as well as additional contribution information, see our [Contribution Guidelines](CONTRIBUTING.md). ## Code of Conduct diff --git a/package.json b/package.json index 40f6cfeb..deb8dfdf 100644 --- a/package.json +++ b/package.json @@ -94,5 +94,8 @@ } } } - } + }, + "workspaces": [ + "tests/incidents-app/" + ] } \ No newline at end of file diff --git a/tests/incidents-app/app/incidents/webapp/manifest.json b/tests/incidents-app/app/incidents/webapp/manifest.json index beb63f8b..880edcd9 100644 --- a/tests/incidents-app/app/incidents/webapp/manifest.json +++ b/tests/incidents-app/app/incidents/webapp/manifest.json @@ -124,7 +124,7 @@ } } }, - "initialLoad": "Enabled", + "liveMode": true, "controlConfiguration": { "@com.sap.vocabularies.UI.v1.LineItem": { "tableSettings": { diff --git a/xmpl/.gitignore b/xmpl/.gitignore deleted file mode 100644 index b92ceaa2..00000000 --- a/xmpl/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ - -# added by cds -.cdsrc-private.json diff --git a/xmpl/README.md b/xmpl/README.md deleted file mode 100644 index 54444c44..00000000 --- a/xmpl/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Attachments sample - -This repository contains a sample CDS model extensions to demonstrate the CDS plugin [@cap-js/attachments](https://github.com/cap-js/attachments) on the [Incidents Management](https://github.com/cap-js/incidents-app) reference app for the new reuse types `Attachments`. - - -### References - -#### Incident Attachments: -- Image by vecstock - - broken solar panel - -- All other sample data in attachments have been generated byusing [ChatGPT-3.5](https://www.openai.com/). diff --git a/xmpl/db/attachments.cds b/xmpl/db/attachments.cds deleted file mode 100644 index c2b281cb..00000000 --- a/xmpl/db/attachments.cds +++ /dev/null @@ -1,7 +0,0 @@ - -using { sap.capire.incidents as my } from '@capire/incidents/db/schema'; -using { Attachments } from '@cap-js/attachments'; - -extend my.Incidents with { - attachments: Composition of many Attachments; -} diff --git a/xmpl/db/content/Broken Solar Panel.jpg b/xmpl/db/content/Broken Solar Panel.jpg deleted file mode 100644 index bbc70420984440fbeeee79b58d3b6f7d56433398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450769 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

Q2XJy19OTTN&m*PpCGs1|d*xTv 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

HUnhw&L|2UT-bj z?cS_vcCAe;m|-G(>QwkUf%A@e;C;H(()8y@rH+TPE9Y>#C2G}FvdIM)S@ya07BC0Q zPYgDksplVEqdxr+7E4UETt6Cf>u>HT^dDOG9-~grG|Niq5os8WjEcycigAp9$2mNa zk%NQOhf>pN7gAd6Nb9w(#_z)@GW9*a&rKu|dT~#NQhYLyLBUbRPdNJE@zi6Xha1V% zc8ITvaR}pbNYRA{YZ%8 zQQ9DvPid)d6_CRmGWyQ(s)*3BW_G|FXUCEHk72;(m!~>-#z6|P2bFvv_qsZE;oCa| zSDAfiqeug+l4sK|w{qhQPUi8qjsf-up_4La4(-mF^J?p+T%7Wi2`-pYt>&m9pNk$@ zm$pwHR(E5%mrZ+J_;!_&hMf40MrEmQm@JKwNeT%76N80ra0gGebgxD5wy$>J)zp`@ zIO+YQX9Y$2xx3fv+Yx2AA=i!ubCHwzjyO5<&-wTrT{1v-Aa(uN0$dhmt6Qi>1Sw#5BXD;SoOATgI3v$ode9EO*70s|7hNme2{L&E94l~1 z^O8Y62flp$PI_a2@`8*_>DbtH!bq49(ftj5hHaabMl^lZ}j{1B1c6f zvxPi)@^SUg9Al{x6-NZ@tjiO!k1Q0G7|wD)BaeKZI*>d)&{16?b2U1;1YPnC(SSe) z<&hcwU~_x~_+bqBw3=RUzS!dl=+jm4_hXIp^*(M@8thOLcugBsQEfh6Z3g+N{*> zyZ-=shJ?O3{kiZ*xFg^FIu$tTHYHTZDE(u0Iv&FcpqY`*7^o^qI0q$p9N=T-+DF_D zJ;NDkg#%DQ>#4U6^Uc~d#{`N3X_a+@ntf$>o6(A<<5KHQ2#Pfl%#t)XSk(op4fVgHT zSx3zI{l^~NVAAyGNW7&&=_8mU#uh114%o`9nPp{CN`T0~IN^k>amgU_@*h19dq$*z zatAo*8JrhPC@g`Ls8vP8WCBM4-)RU4;j`>|k(N3}#x;Ha0Nmr$X2w-Xa2shPk~eQ= zB>bfF@6>`IuGy+8X=#$zcBQ7&RzI83rLK{^dPKlY_S=f9R8h#G=tH zOeMC8kVK@=DoJJ{si`@)Kb}Sw{*DVBE>Y07vb~jdc6N>?9Un)~-(YIp8Cyr7%8&7P&2oO1(C zor@t&riEhV?4?Twr~*%TsCx(osET@4YH5;6N#T}Mo*IN?Xx(Hmfh=r-M0ni_x|PDn zSYcZrr&Y|#q>368BxLg{Z zBUi1P$c;^{S`6!N5F$r4>?N4h-0Bm&ng;cwt;tC>UaQftUNwb940Z8VR8t!5DQl)p zML{Fd+pcrei6EIMMIB6)jT!}ZwZ@_(N9>)Wx6#(D_1fc8U7_^a*>tsA?Y8YZSq!f( z(^+o5PX+P-VMwQjG>PPnIUg9$G9)gh*V;1G1-_!m+M8eT`U;~{C1$F>-1RkV6g`LOpAPKgcBJnfw4tu7uF|ynXGTMHgiy_C(|T6X zC8vp|NgkGuQNw&R%&N^MA*o%djjjmeb~;+|AVRxaYpcz-@E2WQsjF=SNh(<9yIfku z07Vs1nC#C`)@VYev08t~&2FKspEve4Hi)ZLcU_X|yFT54L|4R)+&rn#kT z)bwA%;;5;`uT;?*JC#MQN*laMT|K^@^Hork(9Env#*vbkZkPh9Y{!u2dgMFo+4HlT zE{Rcbkg3SKhc&H7D6*PExt*HsUZaBXaJyXo5`H0V&rwrL+-(@O*4-0(xJZJ!qJ2@P zXk?CS2&u1j@}w=%g;~j8JR_T*+qVs*+2e1H5GAW8oyIHXy|r+ z-jhs z+WSn}5p1`yMwL_$T`m?c;dkmeOxF4@mgdq>t(Yb#6B z$V~G!ZI;Z2{bjGFQ$zet(QsONt98z+_)2~%rk-Z&tC!od_{4hDoI0~&4chSDXJ*r0 zG0$xshmU~c4-qS{bP%dJsNFQbRfibjUVKGzM_MJxyJHBcglw6#^ZPKTfP-;t9x^F?|dwGyD!}Y zmfrC8=SfXNSE2qNGzwN5bQE{E`<-{ccSeG;u8-6Yb+ge+E|i;2*GVh1&XLsDM-!|{ zNmausVr&m&LoP+!b8+G!B)$It?%eu)be*qJ!(*~VTMg3HNvCXO;=F9BE*jJ6SM?J!^Cl9N$sI^<}rdaqB_3j0ah6$kvK-Ga3CO6oPdTj^_UcSM0Hu979T8EPt$ zM2_icu9Dm3zVUA!PFb3*nTt9)OEC`F8oOVRyAKEvg0fPw6?F)Y2tcg7ks%IbU~sPP z8xwrN7&yTIZ9G=h&ye_4mCQt$|s00o*{-9Y)Hc%{5G0P&U zhL@*0L}R2chN0?0m35PH;!UgR?7;a}H{4l9QbHm*3_ejH5%NSxnzXNVZ#0xJSv7sS zm$=$Of;ok*+j^RKZhCKQ7Px4aOX}KarMcSaX(6*%DCD-(Eymg`6gAd*3M+El>Z=Zt z!~k5iK4t)!l_ZcmL($05xC=q;R)n@+M$S?d*Lj-dkbsLLc$D3{hQ71@9iCe7PHR$`;(0RI44hyG$e5`M9m zvU&sIyS-h&j+u1EhtyTjOF>h2g{$eQ>@ZJjqiCb3thd)+Wwy{(QliNk?zhy|5|6+; z00YcVNvquf>t-(XW7rw&@vlYz$CR%&t^9D7dXS zcAIC|Z3-_R6P>}+mW#@E7eRItNoe{AVwe6p(ApWV8p_EG4{|i|Y8iFnUMuYrRMT3n zcUTs-$4@A=P#cw1MJM7ZW0i1~^~a*lq?8id#Ctj2L;yImf&?&7-lVZOdbwu+4Or$c zR*L1Vejz)--5*qI{_X3nOAD-NEwZOj+(n?zurXxQ^wYs*hCWx)RG~p5yIXy+`q&b(_8%-=uC{5pZvr{rl*4$iPF8=^#Ke78>cFS7Js5N)QA8)O_ zs-wSK>Gd|0{${kPuZpf_MYG+k)&{Giv))5e#SFD4@NBgaLXp&%Sive?r|D$c{{V#9 zxM+5Fr75m%2qpTB7@2*ahll)W2drnzRoos~)}G9E>-#W%8g%`}Tb+lqI{RI><0VPr z?j_V)bnN!qg2PzX{XJ84du=t!l7=!OrfB6^-A@$k!LW>N4@zeJ>9m02>ltb7Yk!<% z%Iuj@?BRoRKu-f_rhS!(+V!md5Iz{K^i_JJx?O zwuYD`)}K&MOp?bN%Pg@;QdlpMZ0Z`tO*@HI3^QMO zk`D^hRluOmuMloHHEEp)0!S`Rt4$%r+{xbeNdyh#Cqexr3 zPw@R?o}R9nw%MetmHNu{3>8Eanu6tWOLYZ~whiV*nvR;P5m3@Mru#@XiA|oPx)hZw zM5#P#!ma)EF@<5RKJpfyyplXbR}SH68=Y$=r1+iqnANx0ZPw{yxKFON)btdyTO|r+ zr>oO8d9Bvk`*h+a3msLOw>V@jcbxAng^aq&Vd5n@t8q-#0nY7fo1Sr}tir<$H;IO# z&cSJF5tftRq3w>2& zsvY26u{}US3vM~+pU`_)d&(eQ%Ih44x7IQ?mdY>stg6+oWiyCRUjG1Sw!F5C*plG42J1p{Gn2@+FbgqE64@N0ln?|hD2i`ZH& z{U?8KJB0_S=Ixsuc(|@|{8;yr^;=O_s&!q@QQIyQ?@e*B)KyebQA zkJH@@i@1VW2w=n#X7)UqTX`ikYL?7WxyJIlK~*Fd$Pi6vSW=n2-lSR<*>rRFR82Q+ zX>Rul_*O$xr)Q$7nz|~C254w%Vu|T%Shn_cX=9Qo(7b_}hF7X>GB46pF)LOe_4)jv zm`bLHv^S&$J63z{JKz0#p1^3wAV9mo>@F8HF=;YDCDlPlmlc zLrZSdn&R`XFQ_-w)oHyy99EcV7i@9Xi=Asn9a@v~dPst$mkYBbbWF7F-4*C~09)Tk z)Lp~Yqdg614$#>$Q+a878dtvGHi2z-p?hoGO(#`sT|IBrx<;xwx5qqj+zmRqIyAGu zRMlH65gThrr5Q9Cx=ci*4B{$eMvj`A(MHsE`Kk*j^ppM{Z2hQ%jUbV+w!^r^m8h%zq&T%p==FH$eI4}k8dY5j zZ0{%*aG-3}HT=WmB5UoJakT#can?lmde#?>Lv*+PDt$rlt={^|J2!lEy(}_OqtfVI zQ8|L&+-ex4oy(IKzW1;Q6m?pM$kEEDsQs(nNWGLs% zQu)ypQ1 zVsm6o$)u>bMfZz@mg7O=-0=H+qR@K%nmd|9q;)6^t635V>8fN0a{ek1svb8aZ`LIsL!>KFASadL#Owsm;7P)2=sjiOg#<1pJY9;QF0SrQbEv?1s z0erHo5^1jKRo&)_(|4n4xm+Y`SqLJmumJ!p0TPt}@J3HLJPZvpE(oJiy1l94m>vP2 zN(VHYz3w!6pYPiiGSQ@K;uO~=yF+fHn1|V2Ag8O1N~y?!j$f7_ZO(8o3F&lg(h0SC z&oh~`1N3N=t)1b}`f(D44Nd;z8kLfFPev7S!N`*YsoZc!{k{i8?x*3ycFW1L9PM5&xgzT~gDE-g~! zpNA3H&k)`7urL_^02>`tRD=NS5pM}75cU`PIARORN4TgwM0bDZO7#sCM$o}J5Wwe|A+ zxcFyC=eD1t(rbQ-jndCzH5YCav`e;n+ePLdUeQ#BQ-aje5VEOXC2`8`@yDEbBz4lu zP9|xJlm)Ipe$p$EEE|y#=aX_XvaLlLx4N!1ww;w|E~UNQt;%6=?-<+iOPLcNH`IK& z&$csX1QwiPwBg07aXl6r6p6=_#^QG!UvB%F>;Gy5Kq%>!B-{{Zrbm>Wq$ zfun|J`B*z1BZMIqdTl*9ZRP3%f@2T4c{~sSBO~wU$m4>%?8c$q3@YH+>v4L9Zuf^$ z+iMd-Ig0jmn3VLTqh0Fh5|YbhsG2rm{Pls-Bm}M-)F2PabK~fK;1iD{BU!!0+%PFM z{j@aB$`@LC=7OkF;*vo zg$xJ-18~ks$6W5!^v+gYx*+!dvQNLh{x$flRO|EW83Ty>inVf6`@* z)QAq@jZUY*&cBFRlK8b8u6S}>mq$}Z4fH%_j$$_ac59@x^_pi4)8tp~c8>L*j zK1yn)G#80N++(LP5U|lZ;5I^_i+EC?wg){?C9uCuwA}JkRaz-0c#v7xhx4Pu8Lvtu zwqm*_8!0tqB=08R5b1EQwvX-nKKL8|Swx`O9ZQ$C%o^{FV0OwtYW zik2!WBxdy#F~S8TWq@9~kMOn(wG*=Nj*J4c&#w9oP^%l#S&ggjV<+*Zw9ndodWD^$ z;#YTTRBM=|YYQzsso3qPrVF& zrKQQw>5_f<_Q&h*(;kwVSG&i^j%sF6M!TvVL=5w5lS=+@Wp30*bYx1coag2_82aFh zgP(sG1P)I`g(TTP@*)vT%Qr1@uQ%-SBs(Urc#Ltho0O1ol6PQZk>LCOnLl2M6}5R* z7R_hZ{{WOsR*KkeDzeWYjf#>yE`LmsoDb=rzcK~&Gg!1;jYqs1zpE10$SrF=A$= zrVs6iDyYco%a!R4W%h*Bty72(UwiR!dWLAOdJp0UyFHt@{{X`s%(qrttuRcq#-gSv z7G*%nHxT2DMz5dmWE1ts6B{>t9oH?ODt&4m;0ER!i>Y0w(!J$1DoFylUbGLLh-$~B z9l7ongYHGLD*Zipqj{x>H1rQLEU3f`gBf5(2_pn!K0ci*DNwj0m?Opv^$0(09YlPs zW98six|&9w>p@ctl*-|wa2P1gN_?1ne5!N61b?SkjofNGW5(|FcDCRvn z1T~??&X#2F5XscgIn>y*YDswV`{Og>T5V%-tI@VfxaFjdV;i+F3mqIFIs`a4Gq?aB zmvljnc_XJA7iMmOHlWK5MFJH|(17HhwmbaBW*HLj5z7D5+s1dzm!p~s&*c*cH%9V(h4mCgE^@Wxac1}{oC-Gc~e zoKD~;x*WD&p0M(x3X&$su8`yA)Tj1mt; z%S(dH#*A3$N6dk4yKxt!C~674#mf$L%=4^oOMEfLP_q^Rob6R4_`oD*AoGuW=j+zS zRQ~`l=FtSuYAT%c>mFI5B$pMIMx^dr9D9L-`gK%g#-p@AZEZ}j)G{NG03I+8f%ONE^YhbLU_-cSe9SGG zt2JqrbB5WjQ@6;>;3}$ua@odmMghkM^f~wIV=OfnIX5rQC>x|G+y2v?vi|%dwKZ(K zrr<{z!TRKTeKK+M>oJ~^uYl)~>d&`c5Uy!R0E8GB$;m%Y{2rti07(R8!o5s!ss8>8 zf%=8#uA(@2+$|#T(#qfW1zay4IXwH3`t(BqU<63TmYydhQ5cS#CC-(96&QKKc8`6$M1lA^&<>)J%{NSYpV=mKg7x- z0hA(;iM6)m5SZM4QIgp|exyb^9>W|xX);*0;&GDMB;!6wKYq9ACsEjbk%-^t{{X!I z08jn;(lW`%kmVf>y5xbVTv65d`~_5jW08+P^3??GY#raqlWX$4k)De<2~hozglAO_ z49?kn?HYQ?xiWe}jwN#Ti)8J+lV-yrVWxUIiYN5yqIg`4g>@^CKfI*y%g+orI6YLy zL)c(}Fb~>(Tc^G`40E`V!6O4XBOHH^Jzx;8biXS2M&_5NIzrlN$BczyO5+7Rf(BL~ zamg6K80RPL)spinu^Xkj$>H5zs^^bVlUEKn@yxS}wIJrrs_Q8i)2A_1(gxcly5kzu zQBA)9fgAkM@7tI3o;GFxo_cjHGyprq4zM_DpFXHfkF$lZ)b{Icy*Y-E?bJQI))Bl$ zv;GCX%Ivhz*1J_{nu5WX)BI)(_W2xRYs{t*$=!?+&|*o=yQB^TfOzHz6{xUkQWayX zYV4BoxQA>CKdv>ne|nFhJavJsMWb~Vlbj{eh5rBvE2*WpQ#h=(R}ei^lAgK}&`Mem zTrTxx&KXA1dS5dvWy#zHRxF=utQ3s{_!z!lYRb$p#2cS~+0QNS0bT--G9*kfW-7T; zfr1>ehG5El&Olx+W_;e=-+Y@aqr z>mY+-4=VUX6}5R+!ZuvG#=Ctf17cH;<(;H3LyRd5$?}!w3_bJIi5=sXNFRI>%>>ZQ zW`d$ND?C!Gp^FkmRI5gE>d3&TD8PmsNUg-!sR=x2!oFU$w+SviTSKa0TXwy*NnbjV z1s1Ed!j$)@4kRINpeoYcp<06!kL&t%fcmn>Ekx`GOp&xOv43RR*h|Gj8iXlBA$B#m z$UG)q&Bns6$;3tpeAbkWS)3NLR+(iPTiLC0kW*YN7OC|uinu$_UMM5m82}{3s^F;f zWul#F#7`p}%KemQq#G-@W$?%CN#4w`Dm37E8Z`lN zoH9?_eMN4#t+w+ei%d?$Os}YJ^i;6P5=jhlh-RmHw9P-S6#E#f7{eSKbgasxT(GU& za=v=@h%jvoBWyLENhP(h>}zw5^4K&*9W;{MHU9wd8;v^yRcEo;E)p3ckcE|~@0A;E z6CX^UMOzs;80V?ckZeo#-r3jZ1euaP$8q_$lM037wRY<1MLv+!+M*wR4%29MFu2A;02*Kw=1PhWqw zhedG=cNyx|8mA8u2xO?CY{`=8^B$yL<53)LeazO^s>%w=%~f-b=WeHJ2x=_`EjsT` z;K?OChfhOmN{j_WS!EKJR~wk%0z5|=hz5CNt(47OH1(BIJYuG@t<6P6LpVs@LS!YI z(@aWOxnnVKO993lYCB_QIv&FgHk+Nw(OnJJ%UMxvxWJ4A^pib2n)J=tx0<ZF)wc~x zr0EeBWtw>I*Lu3U0>f8Q=G|nVpr)Wg{YE0~_^KP`s?@fsOEbeVK$x1glCrc?ZE3`UIq9R$M#A*wp{f^4O=YwS4P=x_nK>kyh*j{ESlXCJufk2 zSxi*(Dg*0nVS;)dGRH&MVM}U`!rJRDDQxZjw%69FX+=G{vsh|~balqjR}nJDRUIym zr@B#HU{g1!pNx2xN@-&+^Dz;~z8m81^?fD2-9>29J-f13+G`@Kpw!elZ)T;5w-Zig zo~F9G(_G4Fj8d&-rQ?;Dmx%8ttvWE&ck$!GBncg7U0VsI)pU_+x>x*E--)RyM|+`? zvU#f-Y750YLT!>FuAQSQudrFcShs$r2i zEukYfB!Bsi^vD_Eg0|7O9M-vA=)}iWv-XUP)B1vpESYLbYB`W}>uzwxuX}&m+x_XZ z&v!I@zXsjmsAwdkxSBha+u`rH6)gi*P}SQUJzZ{q6|vOYq^G#k)ZO&WB|T)9JM8fP z0L#-2wocNRl*9{@#YWiKx9HgGPpr77t0#L}gxT)R1np^T37kJyJA|!`wM|UM0!YKR z`H28n>qx8J%oOx{Vfi zQ6`49DW-yIx)>5fbJpzrttqrg2m)A^Esgr3)fEffCGPEGo?O(<%9@kI^|LBCm^Exv z`&eg)SoUo|9M;*yToO43O*r-aQ6KW^NJok=@r9H^Rybrq5%iI=rb0@LK&TmjO@Tav zzzHFK=?eR${2mpnM&K!>Q7|S{M4C|%c|AE13z3%IvKZTWIFUfW`GLYnQQb)jR*9+X z6^)1@;Er^K8-7FhsMZ~UScv6DQ#!_E8B_}#Y{ZrPOpWQqf>{pkBaLGaWu-M{sM0qV zxaq3-Y0_pC^|Vqv4{N>KiELSe71B5H_a{tqJ?g#@(M5d~aT92rl5 z(v=OvHtcE(nnZ~LmOkHW*&&K4XuDsjWJ0nfQU3t+V{o}oa)ne<*GMOyM5CJOs-MGE zemhTEZ1yTBQo5?~cXdh>iMe6ysG8(;dQy(ZHn&lbF{w0$r_wh#t=gv9bEK%OijH~* zYADj0zABWaswRS}6D1AEFs`QFw6!xdGS3wyTu|1DDdW4P8GuU2NG9qa1JqiCidQy? z5{8iYeeWKrlWn)RH|Xl(wf_Lb3@=otOU*r)twgPKx6^7FZ1nd?X_1VMEmBm<$;vAX z^gx^j#UyA5ItC1He3;f-O1RABN2j zUt+%7bboVo{mzP=-sGBtRm0o5OI`Lk;;FXYbdI6X5Zv`I{Dd(>F{HdxP*x>Vzx>26 zP77d+adiMo=a?^RYQ>GZ<0(p}u95*ZWAr^-g<^BCd~#osvPw9#7il|rakyJ;R)p?8 zlhGPt4R()jq&9j5=Wy-SEYI@X~x~qPQ ztCCrCLz`8mr%~Lkl(yFJ=RlD47eM5l#n<(f%M@v@qDmNjQ-9VnKk?-PRqwg&# z@gg)Bc!t<(Jd&f}BG`7z;V0sUyA_K^p?fo{>f&1EpnB`2qO#3NO)9KQPd$0LMM+&x zMNni(p{;ltnPUz7)@JLS+CGx(4V&-n6--vXsY4KR0R=}ky;{&zzQvuHee|qxP*5HE zF>1FWW7Iy+{{UoX#D1B()YW$%yuG^Yt>%I{y7}yqTq3+(D{NNjY3>tTC@87JKBK0M zsa8ts1U9>>ToRpPucoV{V-s<^PyQog&7O&YvQvVP^;${=YjPU72g!>cTx%?PvB?d^cXJbpEQccB51G;`dpmMcR(O-(;xJotD*<^nZtnT4`@r zT9_=>EloVMHIh{=%kcFVIi6XXmXcbS>64n7+xuG*P>C#14Ji=l=lFVo*`&&#q#X5wV<<1;_!c6k4V3 zrg2*qC$1nK;eTi^z;%k6{{UmtdWXMX85erHHL|LGGut{_y@Ry(i|rk498*`=^(82= zf5H`1--kCdZIb^0S#R31LdJA(j@t)h&JWxZg_A54I3=i5+^<5-3+6V8m0(n9?t*nJ zKouHf>>1z`{{U!D#vZJ%zfbV*@Zs5?h6{DlvW`kUYpUoV*B!=|nwg{$Q|cRSq6!T) zcS)m=OAX4Z>osW1O*2U%l3PniVPR5p5eH9cFItTNxyFKye61#hU1StXe%D0JJ>O+`#&sPx4(UG_?6 zrxET(!k)I2#o23Z+$Aeb)RjMAHKFP!Si!6g`n?iJ% zIb1wcBQkK*k)t_FUm^X$nA#E&pTsE`lqc9)RKN}o)#Sj;{{SAnmi`}nqS6{BzOztL zIXZgb+$+S^jU9iQnzEf|in;7?)Lb;`J-S+pg*|P?Hl$agY8rxOt)?Kq@Fvhh^t?cz zbT5^!%(==Ie~Yje{2~es1(#984tL)`cJ&pLsx2%|rs3 zu{uBsN|l%dDOuzRdJ5g&x2A#YuXX#ODUU$tJw>S*DXQw8qSbAj(8iRB0i3;j%MB8G zDODTD8lXBWZ^qEYcA1}(lsl6pIEt^bk`$xHa*Px~P z>u2o!lGA;^r+a6`2YLH(VzxnRqq))POC8=`;CB|5(_c+l_&+Nx2nrmj>LQff3M4;$cZYO2k6g2lm0xHhovE zbrJMx--X=?XrQX?-)nEZ`nw3$dzIf_-rrB!N~DajwN{R_hrQbwSJx1`ODq*dL&#%Q z-O?ekwx%gPId7|yC$z(?sa>roOE4#a2E#!2(>E^ySD%f(@?GfbEIM-KX6=TZ zmCQ!R+j}J*nrZFix{5oc!W5FW=`?8KGhAh+t9+N<9kM7JB1s>`Brie(+)@7kz1`~Y z`0WK$UXBfK$hd#bwJbFkcd9j$K%K;^snl;AG11XqYA03H7TS2m(HX1eO8EUHKoY5( zf`j>_whoJy67A7FhB*ea-}_mj)*|7d)}u~L)Gd0`)v;f!q`8)=n+;V*vl&~3FEY~= z8N;%ePr(~Olzj~ZRbqat$mj1JtW9*@uQI(sNQ0lGxA9j zV5`R>y0SAV0Fc81TpKauLH_{CG#<(QsPD0A2lJ!y)+Y;otI`_$tal})(wdr0h_l2t zS?-d0WHFjGKk`$&pD|@7JpBd-T^7#T^Ri#XE7k`!6(=tj`}PY#(Y>@BF9 zD(pxEyRkOTAwKkcJlSglOIa06 zl=gZiqo#_czU1?D=6;cX!;BmO()}9Rs@Mw5OOO;?)q+Sa%r$uR4TI_OCuMpb*~3!P z#U$s-f}-_jsEZ4y?{I5fDO0L@WvZxtBD-^KX{5T|^yRg!9qsMJFvS#=Fn1%i4&vn` zmZ~YBs=QZOqo|67C4xGo{A7(zIaGQblkmNCD|k#rpi_by)it zwAKzP)M`M(S?vHj@xFA(8(C@{FRRIuwQEJ&d(2+4i#234;wsU#z%+L`437lOk5AK( zDzu8lTo+!LpGGDm&h9$BYOE5UXpHI-<^GRaMs|Os*cjlPR2($?O9cXsE?8g7yVl#C z%eoYIi0E%sx5l`MK!8gnM1|WY1{FqRk~s*>ewe{i<0qvGl9NH*T2g~rEN-1FOZQWO zj>cMP&$23BST5e%FSjx4_YSJvV700#7b}%gP+Xe;pO%_JvP+zS`F^<> zJuR38L~eqr{g6&vA*8q|-QEQ@y*?dcf3#~21)x@%y25I;)PV^Vp1v(1)y`Hxtj?$9 z#uyKOanjC>(oePQ{qJVkRB`Z&=4MG3dXC1*mbSXmCEG8>4bJl#TWS&uMZATLV77p) z6^K$KcEb>=6lC+kIOO6To{3WEW1Sew`d-*X9Uv%gInd51?$F!11bAwuOVZ0(@@mUZjM4)vJ%M} z6=ftyPv#0UkUfb%ex1uqwaas*DBO;B8f8v<9$s2%_-5nmmmDZ9r!%BV7L89sr)k!o zT3u=0t=&>cqdVD7#Tec)P6KB?-2T0Ea+^qB+@wb9OW0T{bVeQlZ08oFFkHPdu$86sZ|(9gJ|Ng2Vym9CQTE+u1U7 zm;(`*P=!~i+RaWB(Y&6>lGy1Qieu7P6{{S5BDeWYJ9rX-c zGhF3NtQ|$}&7$ab#T^}r4@pWwBaTarM+%{%rid0&R47tF#s`ll&M~%*)7wA8VdAI% z0Nt#xa?C(+*={tCNWzfVn;KE3y;_b#c`t5n*YbFSb+)g*YAbbI6cGOa3Zj}R74Fxk zEm9Ge21qHHw#UYHi4T#=ou{MrSE2J5$NvDDpIj(iKG$sx3ubMhFpp|_VSz3`WE;7; zEoRHlgn7YW>|ev*X8V_0-LK&^I+I&g&n;xN6+V>Fn%SH?R1{!UW!y5MEP>>&CgiBrAUGraKjXI zjr^un;Xy0I00s#>5C^_bS71wYLf{*kRjBUVF8p6n9Q4%0+xyJ)_p>8iDq=V82WxwI z-Rncr>$^P!7Y&X0OPxAL6@4@O+gM7VJ90}EW49y6PP#z2uU99rdU%%76JTP^%2`i- z(o6Gkn7wPSpBm$`UFPf^T(_M8TRy4L%a&*%R-UFfHxdNU4DZBi7%UV&pQ!4Ii3v%k zbdRq(X^;#l9X`(Vkl`MSIK>v;ExHDEG^N9}uGEOy$=!QKr>iknm$7OwD=gHtg`*Gl@1SQ|Mj04?S(dvH-l5Ak>YF zd0Lb|Dc;nfQ!CBr|w4R~jI_OPdPNwzE0)sGQ|L$k}d&J<%g&Oz~>IplQ4 zREpOxnT~RAXQW)P12zxZ!Mes-h?Xta$~$yuYN`jSqX-Y?BpmqjjzG^CBgfUGur#5| z{{SDM>@mp9${h<>7A$;u-T1wY?V7%>v6s-0LkK%iBOTZo$zVw1jxp!&(*`;o$XPKi zlTci6An_FijzYgElr37;DtP09z0|1y??4d0;1R=|XD8e05B@sDCm@T0Im7hVuf!>m zouiTx3wg^b;A9b=4t$)DK3^R5XGRS|dAQGBLr!(d*?Eu%-Yjm#vTZ=&T;G$mwN$9y zqOskPgeT-Dl5#l5*8}bJ9W9xadjn=`=XZSUK1}fDTWJwPK*T%tR)yTRUU!8w_ZJQZ z0?0txRB$|#&$s@5obj#qyKo=@AJv^eUP6a>)J0&_VB?z=%!^DcYxdK&i*1Fk%4?=Qjcb$c6k zpHX(wvc6gfC6Z)%7L=iiGOnpCXm-EM0l^-}9(l+z(%<; zW_Bd`W-L$K{`n%$9O!z~uQ@v4M?6XcqdT_-Lj>yE%6zGqj9jKQTWs z3^hTdnV2ag<0tkQ{+y57t>AV#9?0SNWPb=wK7{`O z=k3+xfpP~rMV%Lj@A}7Nru5aBRH+y_UoFsAAZH{G9)EtM zNa?*l?mzx7{{2WEHw;%KgSY#~2aI_C06u=59^+BkB0&v3_C=>!O88ReM7vdEoRd5| zNyw(C1J#RZJSi-#fsirPy(rd$n-R}b$;J3U^AhP<22_+#vx+^9F4-S0s!KIBcr#e4 z4C4jlx73x6z9j?Z*gxsiEQI4cmXnMf* z4n-Vf4>QY44@(sE&e2Mb1EXzdJ{L!WH*O zSA)k$zJnBdnAakT<_N+Oe+dcE(ktrmkj#u;`CtG50w~kf0uxXGfL~b^`;|hrjz)so}ibg)AtyS zWwub@h60$Dcx5UXeR^hwQIXC81=P0CQx^o$z1MeQ@yWIeigp)fBQ^wEPu1cHQZHpnLk8G*B0ssw8)<;VQA`(;waP_pgA zet{=B{5l33Gw%)By8~7n=)`g^o2O36tD;OO;v|Zc`$5TTiZ`7hlH;Im7Dtu~<$bEp zJt?J{qT5$kt9C@LrZq82luCrj3&s{q$0=QoBBaKTt8-M6g? zl^4S!KX$F7Kj#~I+0bgU6QuI>CH3z-mC^MO|!JFI>)V>_{ZW0 zz{cGIQN7yg-(G>ytIb01hd@a+alIcMyYJ7X^vV-x>e8N-at?psly}69pyw< z+PjQNS(kJu4G1E%4sBO1X{~J)6wJ!eD+Fj1{Mx3a$ZWJQ!*R9LP#5*%BP!_?Oc-if zh~qIjm{~H6Rh>>r-WSuzT!2QJmlEFKc57F|POdeE64OFpdt?Wvv_frHFJqS;pdqc= zQi#q}NEu@i6$^rQmD~X>h6n*?$X4724o6F&v7p{GPNsvj(mE=jb@g{hBQ8^J-M~UJ zj4nFM6JShXz_|mi9j%&f^?q{=iqCVrPfm**zr(0%>Ru(5LIcRKMInrm z#Zjc&^B97V7onm!)OLt2w)VqW)&3TGs4aSa&r?_}$*46Q*4=HiQq*jym^EapG}Sav zqDDhWB`E%51t1=-66vETan6t4ZC|Y~=_e&Ayzs7lheF%Qr1Xul8<4&C7TRw#HE_rH z4L@kPU#&M-Jug&EZq!t2lnghEm#MZ~t(ElJ zfou`obu(03T3^9ET~*S0+cm;S)>^t@C0&k5qo%K|juQ}_$sP!YtLJpD9o4$(3+2OE z&)e-^silIV{SC6Ubl+|-^>wuoLhV^gV@fJbKNE|b@>g!7n#o0Fw$noylD@gZ*DUhC zWSw*S&dys(KUj$nUF%HWw1sSxm%BWcnN|KnEJ^89ta2ptH7!IYN=n3!5YtZZOEN`1 z*jTK|EK6h$4KbaOBD=9WN2W9LNh&}i1!Y_|a|kXGK_}ECm-86u=g2TbDvm(xih+pT z5;~&oX%xpmV)R@e3F*8q{l`{zj1N#|M2*r$oFI>a>mw@|gM%mG-b8#6@(lW9c^mgW z6{R_lL@8$}3|UY5i;N%)0T9-rg*gNRv^Y|rl`HH>G9-PaS?Ox&>nNwGp{tGKlA5lP zc_}JjsE#&~Bw1l)mM0P;B9vv3S9+HD`T>rIu*7k!9K)(DH=_(1&Wc%T*(hSC)Rr}- zpu31Ex1~IF@a&G=Uka=?+j6~3RK|wZmGg-!E-s|v0QCaS%m#UD&6AsN{0+Tq&wct3gpmB(zmZ z$t5iFY~R;UD?cZSdPJiq6xY?b3!w+xedoSR;yH<_DY+yZNw04WiS?Bz{9qL4k>dwi zf3W@6)N6E>mqXpC4Tge_?{K5O!%1Pd(rMb**{SX_+OO3%%Y^n_iu0t@l=bS=QzXQ( zWgTav;5PTFUg@AarJtKOgi;oQcS6!tpin2V-V5XGmu)Qxcc#|8_0Z8>DKzah`q3Y6 z?N{#PSuavt5dhQE-fS?@!>6xkit$y`-6`dyqo^QC%z>M$<7ig5Ux!UTvkf7l`-83{ ztg%&4OK{hkuF<3`wBDnM7|C+7u8K>g1@6S{AuDXZM@v$kfe$(z2-61Gi9D1Kkmlo^?;%;fEIWr_wA*ZYcFo(p8Ko_hcZ*ehiq)a)(OWeQ70|5} zb!E-(bvliy^%XSrji~AF_9e0G)G*WP3YcoD>5Ot%ot}xgI+x%GCX}G(UZYAuY6U*< z-TTz>hMVkd-pQ?W_O9S+d#%>pJ#X+%+;=BgT(t!you#O@TjH{I*6((nST3}()ZFcq zHi`-7wO(EeZmiT-Pr_R0p^in$lrn+BRKe@JMs*rcH*G^%sY}a%9}PjQcTH&Jorh)O z53HhFWn|X-y)@R^p&S!_4z`|XtD~o_r>2sUX=r9tonewUHPo|6=?z_~s*1jm+8VeW zk5(=cJ^V~GedVP-Bt{aIE8PWObQ9qc{{U~h5#7$?&1<%34%%x?MLqnv({NDPs)Z%x zsL_(XJ1x$+X{c-2W1PqlZUy8K7*IT_z$u*ck7Vri0Xa1)^$cyDU&cUQ$V? zvT8cL^wgG{=n}MXQ$1{opb@>wH(ad8{8ZUU0PN{(MFt+yFw~*U6oNX2h8@cK4?T=Q zoyI}pRxIQ;wj%VS-jV3XU_Y{VvRW5bK|Q0oJ@@Zcs1k{^WR|1ipg5yv-uYSzK8ifBl|XXG^uNvh(~OxZe_bmZtTnZ8r*)qcnHk z-zyzQt1V~op{AC{bGcALRj3-Tpq8Qji{{Wipm14R3E8eSzu{je$c(f;0*qm4J zyEzGRNN@waSk|M6&H{Bea6h!e;u?wQyS4Eda?zT4zM5Ja-ka@puAj8_E5!|A60CQ3 zr8hlOTXBGf5ZBPw(MsN|rBsuZBLiZ3Ju3UN*rz%Dh%2O@827L1pSu9 zpF>)&9nZKyH7q-{r3^N!9Pm`pB}F|=w)=Qwps1&&lhuZy5;)~o0hLQ&bjdp#YV9z6 zV)rOL>S_%S04Qi4Gt%W{h$%@XwE&xBK&1oFWN2U)R{sEK{{V2WHoJwx;p<3f+G|L+ znComeOJm!g}PblHCDOQIs;fw zW2B+D!kU_<+1kxpNk+ehlD>L6KT3kf2#x2fk{M|(7FvsSq5}n7w|o2%LD)*{O`o&B zakB6+39I3RuaWj$zK(Ak-?;!^O-wcZkv2=xjW4S!gDT?^lRpPRjU zqn*YfVUR+LStKafpYYaR$L{jPG)L%7Z?8kOT)y$p=Uyp!&-p)YsNYuAcX$_5~Sig4`jHo6|HTi zRirp*4&e4nwv)-Jz8yPpKBw*_1K%NU{)+mVr`3wt8X2jD9*?w1OQv<5mU}R(sJc?u z++(h%T6kfvpstd(nw-~*fjd22ueC9;o}@WdEpXzU?`lTa3rx7_a+@y+3aDZLIU7*d zyQ;i(r^PG<@v%n6l-aXJazO`e5G{%c?qY0CjMa)x(Nx3w$3xqEZh&0s z+UV9c5mz-Pfz(L;21wZfSB>{1fq-CC6>6p>dR<5$49Fp_z__h=RjU$T9dfU_l6eQx zw(X_#tQ3m7PNxiROCF!R2L4^@1R~p7?Ee7uE_BL((^N^g16v33y+E%tNQ=)qGqWi~ zl1*qG&GN|5vk_Z6i0Srj+cZNqc)knCxOH*_kENeZaWsx|FQ3 z+$DlQp(KqmQdA)38i-gJ=8WW%9Ei%_Opb?{l`hPAwRswKgYtsqrhJVn8ITn$ndwT1le2cP zdmT$xn~KKnH65ZRYCne^Wo3)_pL4F-f3^0gk?LfdRb46IuQbt;9(XNKyVq1i+gvP> zM#+^K^Nxi?^3+H`E6>;kL{}qF2zgJ&I-1(5iYZYD#c#LPJQML^dc#rk&>A|wSc-^ zBoGfS{JCcdE*;aVyjW{3ow~22)7Dx2LiYPbDqF8!jH*nqTK%Bnt1 zn9oDiC%ahjnyimPG+WN{(Z%N#q-RfOQ z+CJ%9r~Fm3U+8LwwOn4MCQ0I3%_Klj-)S0U-8D7Bo@i#B)~0CWmLwyko7uZNZAuwE zv9j@>!rni%RKSi9BR5*mtlY9cf+Ro>{53g|s+wf5mtB}2sud1lr0FKp}# zPtv}KOkwRD2Ct&{>jG0C2y?i2e8hVe%kP2<$Tyo zsZ6oZTkhKI*e{wg`;nzP_u8tnd+mm(RsR6&X1dP^dd(AcsaVCq?HAaoWT2#~rD};4 z>Qok+3;rQsm#8aIbFq0gEhuNcug9jk~iy{BlMvC>5c@ zNh<9Il%rP6+dHAAbj^Z;PerChaY!T-TJm|Iyxn41(_&3R@}s0Npl#8v=@}TN#yBIV z_`4$tYG7hal;UB5@1;RVuk!*%WU(ybIQ$*GF(j{6tSm&VeUgPGP5}h5NIa?AP-*`F zbNh38zFcS2c3oXxt6`nJV@GhPKaPdAmTi$_M8yaJLMrE<&}?=pC0})k&>o{}Uxu`# zHQAn;FA%izoWqk_)~{z5(>RPQ8q-qf+Oq_0EjWfz9aRLV%8nJ=ddUm$Sd}|lZg6r4 z^Vc;svy%KRm~mQ;w#-@T;yXDx#Lgx6l11DQLp@l#Hhwxqh0|Tg)B2av-7v6S(BKpD2b638ySU(w3#Xk)+bJJ8_v&%OjnkODnI+LBRLpK0W$` z5pYL1kzjQ9ap^9*BB^8y#XylflFSr?_dnh9&VHRy(Ur%?hr|Dqj54%+3r6l^V(Rn zkHL1i?xd|e78*-!L=nuW4(u!P35hU}Gnx&npbB>_`QlLs!d8qVKMhqp(uL zPpNBY?FCQ@Z84|z&05Rh5>p8EHv_p{l~r;H1PmUzRAX(uuzzP5m|~~eLW5R@paa|&~6RRAOLuNX1zy=v+ zk#a{E;Ms3SP>`{{RXVhU9y|im?WYV^S^NBCU6OU+7NL z`qIlZ+KW)kvVkV!St?F>%&yr;V;p>mv~!R+>(aI^!r!c_N?iS*1LvC#G3DED(o&D& z)E3QU0`+cSzGPO}N1fW=yxQZq6UhK~w_Dt?j*^I#R~S68@^iQn0LRlAJ$ASoB1%oe z0egT2MJiiPM}=d7nA;PRL)usd_tme=3URDPBAN;|YOD2Zj=OSVnafN9`w^3m&4cbi z=fK9ZDN_FcghG)20LpdN)&OZ?8_R7K0xk}P&FOZ19P!Sv$_-qUk~3J!)5W}iaCc)M zV1wf$K0StdM>8ch&%D;ow>gtjeI4VjmBx~q_kuueK-I3)aaz0GgP0<;YpEraCBkP` zW04~^K>Fm8N7KiWPp|{1;9RtCF|*Qr(hnvlAV&<#Q=J3Kww+m+&goXFmOxTS+zAnf zBb97}lb>Vn?mE53qqIjiGb|JD3LQf?Z{%)Sq7?3T!)I)JvlRClC?eAOrOUK+)GDz@ zG{ISv%&G==Hzmdo1Ci4ZL9u>Sim*1ck`CP zxqRY@iFD0-lPs(13jT4%Ksbb)wT^8aWY>fBRs_8Rzok;E(dpOhm;SdYU+I5eNp% zAh}4%iD#uQ!sD)i^MVU@uil`vo0#B`#JTc(4CmY1`eUMD49u&w6-=wZ-_KJ-iDuRk zBSy>kI1%5z(PC}&Rv+0sN z0rPo2z#k_WysO8;v8kCN>Fy)Nq3tSwKABcW0D#Mu4WBsA9C>LeAI`&XEVNDdqhzaVYQrxGRgV0j6 z@#_|LvpH#(6`>vVHS4V_$*3GZ;==y`$|Y1UxMDaw`OZDOW0HLN=st{)?rA~`H*22C zws7)W&;3!-OPwWr4^LRJRlzcqk}1(y3X(X%82P>b070Iqg4`Prdg7UP%iz;McTSeF zw$DdTY`Z!;Dk`XkSK7posxqwKPX|1B$5zYD1e()2u=;4;OWo2G{^@NP@cjC+d-+qU zyBFVIhMUCKEii6%7P?t|LqguPv~nUbW(YYOcBvq#1xdmD%hblhlAFmTo}i4aZf2KZ z9R|?#H5vq~Ok6XQI8 zvMjL$G$7L=`a#7i7fOdPM~IJ>tHo_46KtuYfPsS@Oj$3C_~hlhpJB+xM;&c3E|cz% zc~<(7rmXf4M~Y>!&S6!n)b(<1JZR84QAsACt!Are%uz^riamk3Tx~q#KK}qr54K2g zEoLn21!>gT4yTQiDkg{~mo9rMS@Jz*)G*P1(sb_$YBXZlDpao^uG8dW*?x>Xt1eAO3ZT$eJC##Y!3wM70?Zo&^J6Td zBY<*G(;oaWn%ZJl-B2KA6yUidDl=BLHoOBZuqNi*D3q6GAcM`ROdBg!wF*fTPKGK0SY!h*~LR-E8M{{W|r z3v7ixMhd)wq~kfq9OF13Z~+{0FxFaYjR|X7wGFL#+e)jMmCRIUo%Wpk=mXFSx+m20Zi6)1taUjX+W4Ezc`~rP{7wUs46g=Jp&Y1VYS?j8&9^06zW? z?bmA_eY~AVXpMTk#-p@GV>--8&ZJ2C7_M=Se!WPM->DKatT@zmh>?Ri2kHK#dH$Vj z$3xg)cu}>v9Q@437(C}3e&27eQI3bO#E#VPPWzH5q?NE=2#n3f0pMhiJ-5RRrF>)-RQcK~oe7iiKzN)E9qH4d;J7Fy2aArKvcY zF$&I^oeqr)h&Ug?0+8KKz-P|St#g6PmY+&uwKi(_FEk)IGD0Luh*>hSEk!GjRzJwa zSOyHcOA&_Ye9W*c#ZA|Q{SQ={UYzOU1*8@GqkHbx!Qo{sePtBsJv7e*h)yL#hFtg<{_r>>pB-&2GDXW| zIOWUDsZ7jD?-RRTRbxl9@I92FhsD2K>Xs#{udA73ETJWNk-GR6Q3+<4Ce z9WgWWW9<%MU!M;z3yh4QKf9qCeMf+PFl7d*n&nLeCGJTsa8nT+b(1>1%8rp_IEosF zC8dvOAVoVeu13O&6?$Zir_w))BNB{i;~|rl*C#h{NK~m{!2H5oI>@bzFv!Xk8OH8LaxsI@@N*pxVUEH{l)OQZsSoob z0?381$T&YC3Z#R_13z)xYvf8ge=mdi4L zc|8)xL)c?Y^n7XjL+b`qdJ9(8$W^UAlt~$Snwy01P{&UcY{(@s)JY89fMk=Hk-P)9 zqKv&W^VWPG1nF}B0Ob*vx*zdi z&rL+JR8dZ2W=5!u$ck!U=hRSxtsHA>@PT(#@S56&u<2K3?Id(k*Vw4_Myq%wX{)I& zRaAC}R+Y!{DLkoh;Ye-8_IFS>U`?O-}K*YIfc(NaT85VcDkjoKK@YOuRm;i8_cgQQaK zsCh^+lafj3X9mO`xFggfRP&?uH_ibcGQ?c7ej%i&S*3YPl0!y)Y_?sUT!xg$&dduo z;&KjSEOg=5q-&W{MvUY~>J~!k7vvA0O@P4yM+>pCPRRnCfN(rs<5Alm3YTIXz+*A_ z0^u0S?#jD?Afzz903+pfDh^x`BQe!TXpyB=VzPlVZrV$5>PLdPF2IB51I7+yNcg)E zK~~<1eIN@0N(gD=R%OOA%Mf9omAzQ-cs)qH#-p@BzMa?iI~6F?_X>D5E|Ga#%C9HPJO~?rJ&cNQx@^l$RN)YU*Hxka(qzhp@p4=(`T9rT!z^YqH5% z6(ucYW{1>MQqteUz!cX$pR0CSOYOd#CC*og9-ie#YqpxY)tSp!j`JvT|rhUs_AB>l9sBHrjSs6CK>6Z*(4J})YUC4QYsi-gl?g-pm@xDjU`y3 zF|3U&iWRmf%OItviFWwIZ+M8#GR2n%97xL@4`GE$yFqmZGOZ0nX(8uwEpt3!+c^>8 zN6p65gN>syFOBD>V1`dsqd1sulmZH_k)pb_s%rUJ< zsE!m3B0@bwH*M|L$g1=%x4hHpnlu+mU2AEu-1LTvvT0g$*XaEOB?pHQ04Qq*8c#B zD^9hvTXa{(KX2)~rC@p%q0?RF)6-H=cOOqG(^gSZ)?4*897#*6Xd#Z(MLJrqk*$2% za>-9^x5Z5zdraJ{@1uChPfPTDX_Z|lwG1gp>!y`j1Gle{-7 zihld)Na0x}YX!ENzOm?aZL-}nRKVZxwZaCoMd(}Sx6N>I2^1RQR;D7?YOX&@l~t@MsvQe_ldq_^4yCpxhMhh!1yJrl3BtwlQMy&-+njayMqLLSSfYAd6v zuKY+XNd)T@l(zYqCXOuDO%Q6MGf3qhYcHGHyD~*YO=DoKTeSlf1eefnIc^MM*)?R`1-)#k$K^6m%=; z&sJ%xY9NyD3~N$m*+Ev#Bv8oSnL8J*Qe)HkJU8eP_=f)C6iE$0;2O2Ehw{FN&f<^T zrZCHowTO_$x|VJkb%7HOpZHJy&z%o?(H5TX{9@YmR-(Awq_kIQtpiHWWm7%&ip(Cm z_SEs#*)5V(y}~JLAzI31dOL!%u!>Yw6TXvrU$kU_l95K}0;vT+S*ix@jq}SWx?g5& zED7N!Jv)lTpLrxclps~P2Rg^5G3&4F-uQ2#vI!_}-O;boH_b;!r0)90gorg}%L8@!6QAcZfdU$HwZ;j|)+`}C+pkeKWW+nx0 zU)eR$vkvrlqHoffTochGl$4<62p|${;E*UuXQWFSi~C0Y53Sb-m*L~#1G^s<8q!K6 zrJ?SR#64YQ29vqf$53I0J!7SB?>(C9JQSogHU7z9ps9Shlm?ZbuA2wZO{QfUZw6Cj z@Rr5HCB;n=qHj)M2g*3vjlC|fc4lotl};8RIcSq@8nn_FwO7W!_Ne!A-r9dd)OO3^ zQ$#%tz6u*RZZz}*QE4=zm{l~k4QqE56Vbyq3{Oc7wW#8PNh4GW>$Lf8jp(eCiJ7cb z*1!^2jYf_smVyCFcEr`xphzd(I_THC`4L~LJ`=SUb?(#Nejz)b-M@%S?R@n0ms)%N zsJYFi=ej`C%LMfn+Ny=K7e%O-64F{}q=jbnB9yKGJnh4WNgbJm!*!0D1}8kn67jIv znCSj3XWRp4a$xueZ>e zb5_*1WR7s&l#fL65$VRuAQ&&#Z5^uKr5Ly`@u6w0Z@iFSsP)D@T$Hc65~}3I?m-Of z#i^4U#d*4aYX1OZw4K)5OWSVO>Wyn^sIIhBTrbtnL#6628hp&q-r%6L*R=PTZ_s)y zD1V4mJ)(Iff=9$WuKxhx?WZyZ_8=DM!#3yb$ij)>Pz+V z{ZxS?q^!JG+%MD3__;zV#XWsZM6puUye3$ohFIwl3~mC4B=u5~!CvVKxMcfUXj{71 z(ibt%_89s2+0vd>{5r)X4YEe4r&d^*B;MYnO6Afxq5)QLS|(;JgL1GWm7zCUM>PTB zVh}~a9KjJc_Vcx!@6=S2->f!j`)z`f!BeOzbu849=}I~~92JX4E$)uvRa0)Mx=~ZR zv^5nveoE@PI&a20tV&!Jm~&F+_>47US+^2bdSv0~{NC4rqRm|N@5AN(hC$yR=UJle zE9xCN9GaJ~)~klBhgE6ntDUaps4fD&IBmKV+-hj9_f&zTq_x*srnOmgsG&FXu6`wX{*%mTc1QvK^%78+1~0Qg7Zr~J&CF<^-pZB)Rfjqy>G@&RHn=Q zAU|%}n54CL$rR+H@-?>(adRhTO}aKp6bZONA?cXbwx(g)K5H)F>Tih(d%a$a?zXnO z)K$pURo$D^+JcJ9D2jp!YbL0%QBbX)N^05&sg~hU3Q0jte5SP9QnL1ySBteZDH{W3 zOzeOR#>~RROFN`*3Qz(-Y{=HSxd!7*^vio(Md)4h@M~5oMR($@wR74olyw%1l?_>< zxZCUL<$|u3SmkIMnxdXWj%qpJm-$k~G;z9YaM7cJp^{XU9n_GcqDUvORv}7-!5qPa za9t`X3YvO?zMPxG#Umt*Y`Rd(*qvc)C4x}BK1 z%>IzwEcSTnDjkeV8!(dXp*1mzYjo8#>>@B+<(7?w&Z-H_O!`L4+KKfzNEjPbf6v7I zT7MduIW-M|YQjHNH!OXENV(k)m2B<6Gt5i| z^lcC^y!95tSR}qs)uI?pG_tpy^?c`UhmA>PvJ|M32wPk7Swj&;vwAq8h2&9(nEnsV&sJ2vBHAO4d zSYuTYDoHX%s_c0gt(~<+choF%B+=^pI|adW9aOH@lbEWvQ({7h3@mwOY0iy7+Ru#5 zc}+wtovyIyKF?Xv;bo6WTa@1v#2C*E+LpN_xl~bB$i`{uBwtBnKv1aYRP5v@_>wUx z_D=D9*`J>$=MLgI{{ZN}s5K;OORuUY))bNYqLO>W^2>6zG^O5Wx7?&>sD?HyWR{(o zpnPB=1~}P!G)sR7JzcIFI)V);L6=#qZ_={_Gqr8j&BHh05)GTT_g!NX)^^Qm^;}Rq z0=m%*F4x;?)QyofRXPH))5$PZimEpB%Hdf<9P|fFP8acNO6y93Da*4Xm~mJ!#-p@E z$7$?k<4B};?&s^9FKg+k=8dGLdgyBPBco>&@mlGf<&LgqQxtL3#$k328G+lH1j4aj zp@k=qJer(n0JUr$HJDtf9^UU_Ks_5Y@94d=zBK>JXtO| z^?hz2cUD}a)X>XEbELM(X{m+N@R3{TWVBCDAZXcICRd7h{WjX=i8(t+&PQH{D~BX# zkP8~MN6VcbEgn3dX{vQIWlP>jYPccoS0bZ^yhSP%ze9H;vHF7Ns{R;tjCx9YuJ+X3 zsnj&XQ1+i)BfL*FHRnrQ8cF~rcxjwE#~=LNH5}Cv%M3n=P3b?OTQ_dV`kCFAfUT_m z0KNbex853p0dv_%>irn>+iZG14(2H0H=2xlsxPNh8)&ZmcHdUr6G`3eQ2ZP3E-ygeEjQ(#IdD zp!Pcl(#buiFY9qugv>E~0<@Hq3+#>FNeh$L1p-5?FNhV-8HO)v!2> zKUe<%Fn^+^a zL{HtUwCbT0Ra(Nb3oepXBu}VZ!dudfUQfbBArr~zL>ZZs5T&CmrA`W5aB&an#{GWB zwU_d|HUt|Gc@SdESUauR`wdvPX!@!f&Ed)-TyC<2qY@WTMJ!}tim_D%fB+nyZnhFr zZMyY$xMpy31%;ZW&w9C~p@+1ad_!JwBFU|_-RYFeD~fhhXp)WnI$um5l|YPzbjirz z9G|!yU4n@`GCg1j4t@4di(Su&3nsi>9~0h!}zcC_16GcLh~z!~QSKG54TSTE|7j7I+eETwFCZokR%Fnp%To1CE} z*F#DH`O<{&i@Bn^N84*9Z9Nu~)72f<)=>o&HSxi_Pf$w|?RTExDEu6069r;7O5!p> zUBn)^xs9(mHAN^3vzv`F;ZsT;G1g1$d^s=TRF$)PrO7TIv90;UpR4X#GeJ^9{o~g( z6ty^0N!y(j^2;v$--o7jq(6(P`IK%uY2to%xmGw=>ZfO0qi@}`quPpSAW@BusroGRr^R0ew5uT^-muEXj?;UmWmcLQVkMhY= z`1_qq-~v*nq01B}a8vUlj~hq7Z!NK>S4l*#4~a^F8nLH^GuAl$qqovSdc+o>Wu)*n zC!I*)NTglR__6L@sgTmx>Hh$M*i4d`=A&aRMD*-iV3ugl$jrDd7Z@jlp1R$guq1G6 zI03M$9Z!WS9*vxFTSsrs&r(@s2Gyqw`M#MB5$&=X%}-7E-A}eENmJCQtE-T+xd)Sp za@-7LWar!K(_h`UKz9CG)3=s(v4klex%yznR)9TaYL3@Tf8eO0s*426 zS{O>h3ziV$!xQr0_#du1DpVX=Pd5y{On?pEDsj|a3oWXUXxx5Fx)ev6ThuTAA^y4AJ6)ATXP?I~d_ z`@Yo!x3$DL4t$Z2CS+|xrr@?uYPiEosNkzX9JDoRlg1Q}oB-j9?#RXnBX8-`IcgFO z3+GIZvCJzSQkDuAV$FBdY2!d*o_9asvrKDdsnuPeua`(_RxeZhA{ibkIc4R&IEwAr zxT}Jvf(YC9%*G6|~T{SE-`hUh^r#Ug1GOn_1DL5bkLmZrW@B&$_niu>a+%~gYn+DN^iD>jGU9TrL zeV{9=09yH*7rk##D-tT}n;x^JN{usigwp`O@^H9Xgdsx(sE<38kC-20f=TIX9Sv>9 z3Cpz4r#PZ&T>w!*uH=pa^zpw6!JV&F zLs7O!Y853X8w+D^uo&a_Iy=ao&W@STGHX<+7nKNCpkrM8|yKsa}H z?4yBRx919}ukJSGz+4=h`{OEnzo^Pjvvq7civq;oi zCbw!D3w_oJ;*u$nts`tM(Yck_VF+E#l6l$*JRX)}5hMzO0CO}C%+k7c<{`A4shgb4 zmvD9AZX)d;n!oKW)jg2y9QD;byQ~x!DuFz8RFtlbQ(0d!NHIp}6u^B?l$HdfN@QX( zxkVc10YjzxC^E;^Z4PK+W z)?KUQFEv#1I9<-+1F>?exR%D|B$LZKGaQrGVbPPXDt5lS403+GQzP00XHY@QGAqxw zSZG*esgxurUD$!Kc|4Kz`=5WP{qjgpyjz_-V_{oYm10A(>Gt%()WakvJTni>**FA| zj1Do5dG^OV^u*9CTo&**({8IhWKwF0L>e9;N(E!_b+&Lm~l&$vlPQ zamV+G_VM=Vmq#_dJcp$tUXnFyu_eL!#KCB_(9_Z-%0f3X??EXz+B|Pyr|L1l@OkT) z$Hkgel=L>PwWs&1vpJ5NXW>euheJ3H`8lq3clq8Nt@Jdvw{?=DjsoP+GfT4dN%o+p8)Yd&Jox^HKuRM9}(P>a5Uonf97c;b0iWGS%k zXxUsdoCVH2XPw*tFhS40_{T-K)IgHJfLswxIGA5ynvlH7Su7j!0Bwp4C#{zOOj~7Id%fT7B>z?R=9)Zr=-y~>HrLjvRJc_O)fzoHhDa6 z+>Jp^_{ij;omL&2N{Hj*EY7Dt-sF`SH!Wq{8o z9b6BPPGCd`m0^a-;}R|khEa(XNE`!@508KA*Q3Xi`jmp;wYx@l>fk$LR;2|*kdWwd zc*gOJ3^L~+!C!3}MEj zwmK{_xxz;5et}6p(;Z^Dw`=@_W)`KcvB?G&kDvbAgd_C~LHZs6>O~B6J%{NFqqWko zZ^YcGVkkf&BGa%Z&&Zh1k7oUPuwW!<+LPj9G0^r$M2^J(`J}3>fA0v9V~p@f089MA z`u_m!(QY*zqA?v(>qiO?LfK3lF~qeEElUu%{_7L~9Ov)j*mWFgJ48tDCZ)Q%`Z3Cs z)Pryow9vy61!mk-NU{3Bc>ezYx7_ttNmr5i#PuAzdGO=i&D&nGs-?Ho)K5_0f?8=_ zLfH0V3+2bxr%Kre}jITep-;wnlP-%K|q-@|^v@4EwU7!qZU55>Wg($=xJpF#1Rzjt{ z!M#`ZLyqU~7iZQm2sR+{Fi&B+QvNmw>h1!9DN9DvnprC$E9#<=QBN6C(10>elq53v z4bvHUlY1K8-MyR+kiKGB%Q0})&Xzj)wIWCf+iGbf{{ZXd()Q&TB{jN$Q3#4;JYs8$ zpH)ny%yK9yPyj%{>EEoC&_6Ns(V=Ik+Mnj9@Sm(Fk5g&t2q-ey=3dAb!6;oHY z=VoxUr(^@wLXo&|a~Ir-Kt7!r*{sBk0C zo-i>}T~%K>lD4j@s&#F~N#~lOoHp&>G_2<(ixP4aWC90{r${FKSI+tW0C>NnC&@oZ zP2iSqmviPeQa`-qK41n05SH=|aqM{>HjU$`siu-Ssb!K0cA!a6kjhjjbvsBSdMO)8 zJY`u(d>PUW%lDs~(A%~(7&5aUZ(;Iq+El+2^CUsNmQ63J8ST23fB1gkP|^MiQb!)^ zaj27QX&v5Q_$7a=aj1;OBZrMuiiMR>vw%ieJP__A59O$eEx|}9Abs-~>F3EE zu_0hsSz>QeMnmeFqR~2)9-F$5N#K_*j z4%E@X=`Qg%;^hP)2HmnfptcB%bn-70MXR$|^{%6#tfTIZguh;CY}Vs&I+9av(_O>1 z+r?ZjB}e}Ne3IM7sJiN)D*DG4Q7gxZ^G8mnyZ|3w)$G?27;=po!SvohZ>I2 z1VGF>m$7+CAC{{Y5Xu01NYJM4=iNmpr;N5N4w$`s&!3h=R{x!WmB zoIpXb2ayNDC}W}QFuvFE1+A=!66lK_gV5C=Lx?U;k zYQGUNd1|7gq@UIi1Y~qM1cELI=NO2_@2hooprxmxz3OdAdbCnSQBe(^>vy=8gf1@479l@77 zpLB6}8(#qU1F5>L4`G2yk}g2zL}^hZ69G+$Bvgpu6(8iwQPRfBSg;}CqB5xd?NX_1 ziH};66Ymh7WDgiADN?=Em3`1pgT;aEM`eB>wJlQ7XfD|5eOq9?LmO0EC)2f+nr3PU ztLST_nt$SJOG#ZvQ7sKB%OxdZ)=NS}5>+f7q->^dZOBMCnqC^7jlQ1%c;#VS;E7$0 zIWPj0l_ff_TCE3 zH+I$$th7y}9bXZ zshobMI~}0!xBWv0X*vnP8&hkg z9;$z5;p}N|^RNS8y~pbS2+L8Bts&pJozecs&dA-amACy%++Xby@5GY99QtxSLwxR4 zx|6wDZtX!&RWn*ytv$Q#rDejdfYyhl9D`Elmut7*2 zVS`*&p!X;L01@oD1G_ANw9msg?4Bi-0ctrMZ1MT_{?a{l-XD+7?^!#$X!vgJ@5AM* zNocsV9+B)*RqCx z;ohn3`c~0>Sa*7M`XM|tmB^E<6&AaV;;K4`lt~3dQ$_&k49BDxxTE$YC=>9dMDnrW zLz~oEA4}}?2KLecI)X)OeE~g|%-a1`@sIG0*~%Jf3x{^CH>$*{x?0VHw>Bv+vC&>A z>13LgJCz+AG}ih!?sYJlF>;lvXknBqxMVph#>U!{Bih6xH#EuZ#)7%mH-{#6R$JWw zjQ2<{V_kDT1}hG){?fCpbexs{01i4%f?ZQh1>n|MyQO)keMJqb+_e?c>Mb>-t>1;w z+M?B4r)jQrcPk9FG}rAu_U3k5m1XYDMp{dHJBE+q$Xf?tQgf-T$PeZ8ncFH@{giGI zksbB5OXU4g<>z$%Fuo?co|W2nS@&~S+N}ck^>sQ*!7J%VES2qYpPqfK+^Bzv+wPYO6+POW zto4-;)Cp;-=7g*>cn0_@&dE@BZU;}D;zgR8ABMX4YM}1-aq4c}$9-RBOU2u=_DQcg zYO;zdh|Kzi<$RC$c9hk&>%Dz_&r#kgG^M`NsU(rv)?TZCnfhp@wbtnQ`PwpS?by}IqjgV2`ig~r8r(;Cv#Q&HWDyJh;@9ZFp%(mlb{ zkSF2o_j=21`i9}8uU0vS{{UI)=A((NX$8i1J3AUlfBJv|^;rqeQpAvJk#JflnUt8m z`-(GgBl~d5gouhS{mj=o^08~ReyG$pxnQZUo|SHIT=Xd57`2AGyFXL@RQSC>~< zi7uB-X>E5=9cOK7{{Z2wPGw0BhrQiYJe6jl=_o1mmZ_;|1obtwPp4(2wO+psSoaH^ z_NtbylF6oFk=sh`l_T~^kgP;xL#Pa|QP*dC<<3p)nVbhQXK+`*gPZ)_%NoH%ea?pe z03;eyzE%qQ>bh2?p`z{-P?{}&roaN_Mz_;ev9_+Wn!32_YGS>Q;%jfe-*2}2g>AxH zN-mRIJs9sZvQ#j!ehMXDgpi?oH)BP38$ozfodrhK1X8&YIJhRY$_2HLZR>QcG)`+=sK%d0H=rL|VlRTEYzZZWs1J&N^DPVqxkXSu9XM|FzpY^9dH?G=+El}wa- z$z%M$j~(6~YYt_xFzfB2-x75^VmpPTa$=S_RbWAxBLF0BGmXoFcAx=s;~3rKbq*#P zZnO;Qq>5`(7lf%^>Ph4Y@QW|oZ3o_qEjwzf3~!?Jw6yR`dcSMAAh2jDte2rvrfKVM zQQnnfyx3=3-Bm1?OHBpS_*2zOR|C>cqNX+Y(^wdvyTVo`PK1@%68^|G4jdnli>2@q z>_|=6k^$?jY2mBHuPtA~HNNj;yveBbO=obaR`vXUNp`xjT|3*#U0rLt)7Mf>VD28E zEm~}vk|}CUpy~Q#hSxk6Ykdp)bD86`e?Xc#s4=xtl^&8me>Zl9;^rN6M(hlfwV`uk4`9ar2nhQ|bUT3T&EbiU9@PpEA& z(yCS0UF{G>T~PMPg}S<~dWkBVL9uZY{7xz{EB00i%;Zjv0eZU%MM}piB+EV@6%E?a zg?CBQPSX|BTTQF4b*-tj9;vu%nmXq}O{wZG)mNH%zY!6Z8hIwGmRT*8N$JZKU9xi- zrm3c?rKJ@MNi3lGbxMHh!#ki{q_%Y81CA8oP`8q7q@J<$fVy>_o_OkL9%^}_VDU=> zGD#bu$lB}kZSoyK!vF)4xmF=qSXke_T5$gQf=>!4j<4+%099a5ApQ|zbbn(tM{ubs zZo0nTOWS)S6pvQj%GEN{>H9H>VG@aJE!9FA>*7jdbV)2UlTDc-^#a2aGxGaRUR40} z3^f}MVI;c&@Q!|3I-Q$8H->*~UiV#wmo(t@p%#ZrrKhkRmx6+Oyt9H*J<=#1zynX4zH!F0;_tZ6Lp`Url=d#s>FFY+gj%#U1XT6$!4Qq=E%iEz zsU*8xEwvRfwL(Es!b))F80GZTX0fs*5Zx&o;q>M-(wuB>7W(Cep{A)nPC34?IWKVS z-O0GrR%?mmpw)FCV^ym>w3YL#C?CeDotx724gsE*YNINaj|7uirA`SQ3>4QwIkhv^ zo$VI%o7VQ@%Dj$L?n!x}y4e;nSsZdxOMy*rreQS&N;XP76*1;H6~K_-?P0X30EX%k z1;`xBLA%M+c8Fc4_2u5mL;=Nh9E^Qx3aq>sZ|_FL?uJ4;M9h$qQ11 z=hIa_qh}Z-9=f?*w4@K({kMGH?)tq&>)>O7+J1~oOaAPIxjyAu?`mAMMqSJ8{-4&C znY6aF({z`pT^bjH;YYf7CMtt;F6y-u(umj)V{|SV3vN{awe^^D9{SP?eWfMzxjFX2 zX?!`^Uv!ezVQm-+4BWpv#BXfTUlCoL(Q;et)@JXoVd#rg(e|&owKI)LrU;UrSgJc? zt|oZzcDl-Xm{z`;k}8i%rmmifl4V7;SZh8~5cC62@lib+5SeEG$#BTMe9>^eZ zt8*vS{TlxOh#Ny>%letpt+TRoz?vi|=H)A?U|bfnHgHj)yT_+Hl;)4NcgxlG^<+re z``SHbX{{ag(-22;mX4y9(Im}DZ0^0T&W}p4)leFHK z=|0X(=FETp0I1NCxv|(3p+YqzT7l1JJFs>art+O9(UXNKiSR9H!(Ks%B{!uT^Sv4e zzdC-=V!2WF-j7S(?=4SF1>U1m+kX+MEOp8uG9}W*aSHV43#>~`JTb=+kVzb}mK(cS zO_#C#C$1jSUNFqzD}9}Z*l=FF?aP7MD%#r<5XdiQBMh_d;wN!hFnZH18jK>lYrQ9` zHMPc~^(Fdxnd)bjpxY#kp5rlbYgV~tdZ(_#i}06Gj^lOroxWcs03 z-ekLd<_8Rt=dSV9kr_|TN z^i*aT@hr_olI)VJ5i6bX;xJT}lM2LeyMNL-EtN#C3>s5;F2e0stuhvC$6>N|H0IT+ zlA%n}TRm-1DE;pq*L*&FI_aG(4njH^nXIRW~emYe&l{Dd% zrHE3sPWa zD(PCqv+gz1v|XR1raus!%NmDJM-iTvv>m>RMTwR)^@JwVZFQ`wj-DwYd4Gt{MvnuD zVM&niwpvi)e*~2!tl;r3&976njBdTDfi6cxLBkE0DGy7ywR-7GMPAgO6@BIIJv_Q+ zv^rjwvAw+?%BHG?$LTX>HO@Jj)tOIgc^QcY^(Nvb!4%57JbX)VmN% zjTq+LeWDgj?FA43a&x=hwxJX?eQfbuH79ZVN!e*7uhx38FB;yVeMy$GxZQOPbwJON zG?KMCv#8k{7~+UAD!3pHnpQ_@PgYt(3k(2BBn0cloZrRm9M;gM;omkVHcRkK52TcEOUtKenJ6 zeXcqTjo#I?aT6O_a(VhXw<<13dX}kds!nVo7SVcw<*%#2xus=obg#Zz$9X0IvwZT; zB&6*F8;cWJHyy8?s$*Dmq}8k3osm%8O}@QUFYqZy ziWy4eVjv2K&o~*+BZHC9s>WW-2i1it-s(z*q}y8`onfLd6EsVa-D)*!prt-h#f95U z)S7yfmYLO?eLTwEgq|`}KPxHVyCQNE@EsCWI`8>KYh~m5*AmMjYugf zsc7~L<8kmmHby+0=YR)HBH}=~1DR-QTB=*W@>V}irMOU_{$t1(AEC~CXRSIoXK`N> zW-i==_C%M*RHZ;HEk|un76U`ySBUH_rjhQqYQIXAGRXm9xzDndC&>o@pBO$obe?8V zpR!Ge-3GZewQU`rP+!Y!r2zFDIGmX4o!_z%&)f+r&_QRAP;Mnb$iv`|e2iy2@t+=W zdPJ;TNndvjX7mYP5kdpki*sj=g%TKZM3S@tM)uMxT3=!jgRP^>HgR(wWs-T-0zUvyC$h+@{jm$u{Oi=8+fHO{Zj zD*YFDFS=s5>CWodDy+4zN@>k;ftCpwOD_2XD9-i`^CmJB6&!RXJg`%4kf*-wZp3@0 z**$n#I&PmQG4B8`a=-yc8XBH_B3rjy?YB5mzQb~-og9Z&ibZkrDv+dPGO!<*5$*`; zf|U!ULzpAw83Y>;c^8B09p2?MkV7GK=Z~i?mD>A^yf%VHH9c{ zo=>F+a!WmWtEFaI4Od5Pfn$bPQgR}8IEKxzJXOMdH%0m(gr-cLp4nD^t_ZU22^x4L|dbN&fYE-zP8L$QG^X=`4 z8quvd5XmR29x=8?@D6!XjHx&rkMZjF8jjdVWeCjneOd|@?G zK^z>GBf!RS(A^)GV9flh!%H!?USy@*5Dv6%035BAge#?rsrIW{HwNk?*|cab{yQCx1&tarG@+S}cN~mz0QcvC z_sQd=b5iL8c#sm;Z~;6Cr773IM@=b?siFY{9DxKXya;k^_ZmeD_|EvGwRXF=T8PwM z%?({mzM=-JrKk&E1dkk%tu+$)dg+*$qg5FVoR9-!hMt%+%IIkYLB7YePNVezyT`ct zJF!u-`lz8AU9OIM6(*aJ>nQ|EQ zUpCj7z51Puw7)MkFV-yWd$@@*p;?S_Q^IA9FjZ8LeYbI(ANTbcK@H$$<6AjCl)I8F zh7mEzBY-e)F_WDC0EZdrjI_F2Ansh7XvBDNyEIWVFrX?4C8)-&^U9tO!5nb4LQKi? zE2+YO0RucAanHZ&V2U6@9qHwJcAQamUb9tZW$+n{B( zYl|MnwGO{J((@!%+CNw>`rL8n4;QNc0Kvr`#8%u0Cm`bl43XoU z`}p?gNojB{Ko`@9(@)DdDrRKoO9nKl?d+~sCB=CZ^JfM&TzTE{`OZA!>Fw8|$CS4P zam@8lM`+`c5?j_tn*i{{pMN`e{ki`D4!4#d666Z!$}q=6*$?z{Y1t#3+{ItwS}-7% zpJ0qiH)GUBIb}H;kDQOt^iK4%d$|v?c{q0SR(KTQ%~h412Mq~t0oS8+!D)*%Jv=hR zK~}^pAOg|#-p@CcDhy$5xo)r0BS0zAqsLbCWMr!OBkgGe9BdErR63RONrxZcc4!Q8Ty+f|3vHS!dOd4`9aVz5h}8-8 zG6QD;TXDuZogWY4@AH?_jBV@Ge!(B>fHQW_F*h2#~mVad&V;jTTZGg9;y0qvGiud14p zAG9ylnlMS14Rsi2~#falCkzG+9(LIFJbtuw)}77sn-AXx+d7{SVl5`oA&s0k5`Z{U>;d}{bB;g9sS+h^3*BqRnYUDFyT!hbS74= z4SFbqt17W$K~@=tp&|&cy{WNkdu?8??Cr{H&AyRZrtP9`42!HZO)^RuiHR79xqO4qcLrfSspizM;T=};RGc}BXZ%lbeTw6edH-Wc_do*5!Z}dHG8;- zS0$wQ80eJK)-pp3GE_++NTLy|JcNX8%BsA%0XA?6+U@|sJ!)xsbByn!<4@urSds1B zo9+e13$1MWetTsdrk)zRoVST7Y|~Lv+$Wi7Yhq8?92 zyz3n)Ym%zNb1+iVtZ%6_ymBMc)m$2eaaVY<&m6Z6L8zsC4`dFYCc}hNJ*$?nlbtb=U|vNvVF~7I^}u<3Z)E zt-tNx_D%dtYT7CrmbP6d+S^rq91@YJE~dWwMI@$n6t&hHa5F61UChd7kRgL;IdPRU zUX#m9heHwkhj?+Z$^1!%68kD=9lc_L24!b-TI7~?1agbRpg*!Vu=-|I{{ZNp+`U7r z>#694EoGZd#U-kij^S8T!qoH8K~;F7Nu)`dm98-)IWm7Y40FzHUrcex23;$`12v?i z4rK0&R`!N+dk#Pk+BY$t;U{~u#OGMNIv?Sm;eWGBM|IQPtr40o&B`wQQ&2GGE zYt1AANkpkjQ6Qq4<2bD3%B;i-g3B^YYNT}_Ho zl549sd^Bly=$^X=a_{R9*I`}lGS;=UNxjhcEvK{DrL6wYf9(>mcFxre!p}ab?H_5R zwRX==!w|Hz6qL_J1hrcF*HU0f1$|`-$wP2HqnNQ!%E{%n=G>UB$@F6f2pW5xmQ88& zhjW;IjbKT%=Fufp46HUe2A-1#{n^A{4k409@X(jaSmY8awkJf0&V8LC>dIkRg5q8^to1Ysl{{X|Txj(wE z@7ElJ@21{|Y+(C7Q~(KLfa5o)4CBC_Vu&ZiU%+q14RubD_^<5K{2cd+ZBtV|ocM<9 zmAJvCBA%}1lIhzwa`beHkjVy}rfWT-9ZPOV1-i#UdDNA3)8DRzVd)jo?mUu zZ2SX(Js~gY9?1;&Da>WwmNpxZCy!brng!2 zuf*?fESCL0S63~X;ipV+!`y8xXNJ(W%WdAAR^9E|c`i3t>FTu&?kA1>j@#N^j)R4_ z(TR_M-@XY_u$hni!sxwkawr@^t*z+Kq8^qn*K8Tp%j40oTntTH)zNl#qeCxxJ|w#d zplFR&lkLX6?zO7rZIzc&+vl>`^yP~AywTTLHEy1heyp%wZ1*bLELHTE23C=;6jthb z$?nE#T5hsRV;*?!rxgoTNl02rEqVe=xyW(JqspiD0=978#KK+@Lk;EOsQ?gKr9mR1 z-qv}=FrxVB*P43SR~Kn?zKQMJwX~N?2`?6FTix!pO;1M(J=)uFy|}NSuadY)EPkJ< zO)Jjn8t*|HImX$^m<4lxtVn8yP@`vSWm>(QM%XxVa!KA&LP24?rUKP159O~vLNL9B>X2zpEJ1tJgjYp)ABYIOJkHJa0Vf?5nrT-~A}$t;(7MODwy5pB<TFU)Le5972B4Kr*?={neRwYJiw;#y- zj5pl-HQNr@>FO<8e%AG!>!Q6<->pJk%F!fRPQ|LNm9*5COruj3=nO)d2XKr5mm=q>aAN@ zMNz75x0|H)_~fFsrNXYZyjv(LDkiOJ8VGBurWWgJOl6uXD|*sU!x~H?rwSE1A~a*6 z>@lT1TynTXjyYPIHA9%9b^Rt?zZU%UmvT}`#c{K zW{~b?r_!H}rnXhnU95K~pcjodd84JfSTA(Z*3wiz;_da@5v7z-P*c5CF@~|JZShbo zOmr<*PgFd{46N6@iU$B1RI$_=(f+X_Shm}=zPyH@_WH2dbw2+9Qcl`x3z|x5Bbug` zjuz6Ip0(hH^DvUW8EY-K*QL3%mi=3QTA1w=cFIbTC8x0@zlcKdNjW7&faDDaC$l_j zF(86Hk`=@#5qsZ@TCZk-M)j@tIVo%C>TOkVPqw<1>8GTc329@D%^dVK8)~Vif!bK5 zrKyfNB9j4>5aD_RsVnysmHpBc;PAVn0YVGf;CDO~Qr+2Ulzs@v0Q@sl6%7o&q>?5l z&+-yz>Eo`WP&o_HO&!L)kF9Pj(ECMGG4*AO)K_UrK8(hRVfatp;ug!3CYGhXvn?nfTpIarFp&6Bs5p2F4LHCCeTlzPWN z(BJg^uKS~O4VE2EUw5IZvDMeyG{14Ix4GL+=-aiV)zwhl=`Ye;t#4zxUMX$bir;Xr zfoivy+A~{S{Z7uo!fJxB5L}<;YdGgaXd44(2_NEpwgTUknU5|6)xLj;j@}A)Ux(h) zSi3W;CBE0!!+O?({{W&D{xqYmj=IfNq4h=hdKyacB{NssZ&pg%Wy-~Jnrk((-t_J( zsv`kAH*@%qaWZCb0HsKM8H3zW*u#F4>j&(IbQc$Iqcc52fo!6^>g|23wYA7qYkf(4 zy;a36Yex;%zM`gz+|{)$ah5A>x!h6Pt}mY*weO;T2e95x>E&HA`KnQ>s$95>u_v6h||5Sj_s~rxfAM}HIk;= zF1_qVnYG$AZ*XmvTGqR*MW0?#wPWbY3cFKL%(XWfDK7T<+6S(ZlB&@`Q1byLr?GaL zx-J@5E}Am25^&Re%7RBNPPwm|*`i*E1zPU9g`X~}jI|J}P4~CAmz#Isejl_(pY49T zis^JQQTGxWeNm~a>1A^*9NIHh-ga9pcgLBV@fJF&H>7gX%|}rkBxPC7Ho=%r{-Cin zU-@KWx8W+NYV&Ro0or&9B{JAY4OZPLDLsTej+q8*t7f{tYpqMD>L0lmT|sld(@g&W ziWm9nGfOmz9zjiRa*$A@@tB;Y1w0h;Mq+eR8;*{bM4lmOP@FXrM3x1zaZ_GgHG#ck z;j*8ReA=4zLrtpdS!_vZUN|c4Q<9Yyna8b3Ir#x~jO5eQ6c~=G6CAOy4oidxSIo%C z%)a_}O-Hl>Ux;&D!}82jnSG&&DqD25D94Lr1^a0B5zeDc#a|Sax>9YGk*dj6r|R5( zAb%~IX)Uuh7QPgHr6X;%NdUvFl3;X}Vo;LlN~@wtJzc!%o5yD>w?x5pkdkk_cX?cl z>7O%G0e{3MiG&pqyc3~ik|`CDm4OO(2EiQtK=<-`0gjN=R@LQLlXSkdz3Is5>8iw6 z3k`YoXR=ojH6*I+@tGjbT9#3VRhliOa#(}77u54tvpV487W-{rCU!EZC8_WJZrOZ{Miaj&p>{Z>n_@c z(9_RwVG{i(X6$+%8f%|+wcWQzxJhR=3r#{@byGA^E116xPWxzT>D;KA8QmlRvqamF zhRB}8o&FgsK+#E1zK$+a;=sV3plY7#X_@Ya*?u6jyft)I+ZLFbqBw2eflXbhq>AZ% zl2nxXRf|jMtvf)m2+}bw>Xixuw*Yj;R~Bs!Ce{~h!0@xvw;~}t-p`g<{hJL)z0yIb ztwcQ9pgQAN#BNP>slHGtR{|Lr!%mK+Kx%l-DOouv83OWhcq6W!U2=){kiyQO z&qKsg{ah`_OoB*YO>z&E1x4@=t3D#?DC?{`68#ROqI9XT>%BMX+HW>$$QUFQ(O%+c z15?w;%j-oXtQjQqzzEC$8%u2ZIWH_EcCv8sMqbiYk!NadDBl${5uM>fV z#5;?9H&yLi=+1Ai8?(I}*xM^>@8aR77*y}!veNBJq!9I`Zx<)~K|7Ci(0>F`d{p+A z;=e@QwXTfRngWAPcBez>U^HFY{{VB<(2AWQsce^F7OYgM)3mos-AE`)cX2f~lcTs)N^O$cj9-V-)z=6ihQoONFPnr0 z&lJfNQq)n(76!>-iRh$`$DiGp+8B#8pe01T=~5|s7t)Xjp4p@sp@gL`;oT)nT(;<| z0L@3$%b32G`xkAyM{Bt2O?z}TcUjceT`R6tGF~qH$*#2eaHM&~-d~QJ#ocP`J+`E6Cuu&V zFuTa8*E!QNM9%^s*-WJvfDY*+z&`m7<+fl9R0uSsLmRPiQtxwNdPQJ^Vh<|Em{+Ya zt2LgYlIWKkwdUtpQf4wVwH0-9vy$x6F=lQvjN~e=0mm8Z@HVu(uez7#)Zo)P0c%28 zotm1R)@sxjCm=Khv((Zi>phA4X=#q>+{?_MwutZ74P*u&*lb*_IPmPNLmz#u80z`PoWgvJFQMss}5#R(Nxf#9=6r{ zI^uV3^W0~$$79v>aoxlTwu1Q@gsM__K|6uDhBlUA3z7WDbojE~dr%Sy_ z%&WRstwDgDneI4A~4_VRu6(%FenYzcQX5B=No&7$dP$zIW{NCsnO z6%o3X9Ek~iL(q3{8o8S68q%J&G!FiZi@TR_K{x~sPoHi+fM?sH9BMm6b4rs`okCSt zExKDU!j>&|&hUFdscPt7)TOD+Y&SO~sm^x-JP_P_9C6mnbUlVFDoD8lnGn(34%+s+ zy>`hc^_7x}8u=qD9m*KeDbj)+Q=HSds- zW+V!ee6P-z;SMFXn`Qtxk|=D>=Tlb|8AC0n;ttaUFlmiNXrD=H4Ze+2)&h~qHa=!a z8B`!R;5Q?k*vC}N%K>oDYF()3E*5;?wEorxyxy8PYPWSCNovb3=!M~G#Z(SGRA^)p z2UCu4r0{*S{yg*}9Sm(W2m!$q%r;|KB#&A8@(9i%##KRP83Ww%KHpveBaEJy^rPC^ zH&;BqaF%0d1rh-ZLikU zgtJ>UnZZtNP%Yb+9M1@pwC(ari4g%{SYvQ(DE!2hAm@?e&j9pCNhExm!L6QrGOsl? zECp0RwKcn(pQ(ng6NN4Eo+@}?L->ixvGr4#Msei%Ircup9<3w+yhsVukOyg`No1&y zkd+mDAQFDoSBm}LzVlhTPp0dxcUz<}Ri!OWO0=^g{uY=-%+fyNgkTkR?(#^$IbOWS z(oLeQW%Ma00BGg=G|{b_829f&{Si#61n$`dX8zJki=66gd#z~vm;6%vOlnU3YbwDF zRI8@wYN{5|ODi(^tLi#QaGeVhXPt6lE%QYbfDh(xJ!!M{dSwSpa2KT~U3=hBc zM=>b&3L%AoJiK1xnS-U~m=_>ckiKBoM4}PT;urJeE7TIr|N02kJ}wde;0x{4OI*R3WQ~q!hi<=92}Fo z90QEw#(DPYz2y8!?H^cX$3xg-pjl}|k~^oS;IY{v{Ji+V=XWDNwmzK$5s0`wkT~^^ zEnIAfNZbYkWr6Yezt0}uUYhh_sLx-o_R0h43iwZ9eq_{A^aHNZB|1`7+X#5}OB`9t z$jt5I!BV4hW0GBfad}Hg6e?4Xgj&s*ZR-zdT9it?MAd;g19FKha4{xaJ9T_@{d_1_<$G$WZ z24s6q9jZfClqB4ZbBMgVvCA_P^(6J!#}yj&B1Uy0M|i4cgziTpAc6=5NIt}PKfhag z^=Pic*PK#tQf}PXKOWrSacWx3j0$;CMz&FHUsv zjv*NE2R}oB{&@cY+pRZLE|NNoUA&)(J)##wY^|9$tP(05Vcklh^Znug9zDnd-^lBJ zjpxZea*AQbJ1WH@nwr{bbtCe#ZkS^P{{Ss_DgB&dqC~LNXRls-db=ZEUUGALhWU1D z#yg0t^yu5_XR4TBg;ZGJKW)+$e|~X~9Q$>s!j-Efh`oo-His6xS>agLhR077iT?mr zYKf+*60rQGVtg!L-rN@LT*q?8&TR7Bqh$cR7ZaMOy zkN*HnbGy!PcpP;^NbamT{LSEvq;N)XPEWTu{rZt3qPFP_xB)mg{_x7+w}(p zA|w{tbv0$W2B52sp6zImx2bKeP0*-p0MyQ>)TWVC5U&#ql1WlYJsT^uRfqggD?A-d zdgnqO)yfyl?9}2XrOF-E(6J1w){ahEQ-i~uR+_TkqBS~7sHIP*nY8`I)hnYaH)e)^ zmMYjw?J=m^J{Jrbyzet3hdMuJT5#J^66TZy>dYOp;KB*1=|Vb2{wOs&sViV_VZfel z&<8agO(f4xSqzlZrd8pU3P~G`?hLE}%HR>k3a~taI#Q%99{N;|ypo>~A+l!Bzja|> zag;kma#H8=oMnQZ03t!%zCg^332%QG0FpSzJ!s=m+ZL!4d&76{Q^ld$g6TCeDC9{G z8{=+r6!J!R1y8BS@OI|_@@MG<*V#RfOTEP$y}W5e&dy14;Y?nQZ62nCo9O3xppF`d zB`qZ(RFt93Ir12Pbxsc8a&ixn2cDXAq4A4+La*1>A#X)B_ItJZXKdQ>(9T@A3L}th zS1Lh3b|zJG<0R*vPZ;skaj5N$n41E6qq@d{hGch;7GR8U3W1aK$Op;f3=_v$W29mg zB`mcj6rrP)=A9pEA~U?QDI0d824+k!U_j0rJ_ze=)qE=KKS-?N;U@T)W17-DOc_#k z+gj8|QB_-MHj8votdrJU=cl)tc*5mnYI?aNsg?#iwlomPzyXj+;~f_sWw)_X7@Md9 z`OuyPt=MA%Zw2XuqR;N2oa`yH8LRGFihV!4EMj_4qgX+(0>I0Q^6 zO%G_KP*j^#YI~{IV~h!Ii&UquT-LVlXpe3k!q*g^k2a~TI(E@=S=LHDBWAbKS)5l1 zqc09&sHmfrDg9_sR-zXYB!x4#cR)S!8HoV(bhX}v*y zoPYw^?UmJLIZoia+LkB61z6ckg>k-2j1II`E)qTbOf>!Fr9LD^`-?V0kNQv2F28Pn zvs2=$xL<{qZ5K_VEzb-RO;1an?7qVmDQ#$Vy$5gh zYYnBe_x62u9pSX;Z4qeK`ohlxh-0=}EYnimsk&b!gA6ET~Zf0N`SW5zA9n%&fv%Y2FEBctS8nJo7mFTV_hQ z#h=EQIr_K6$UnN`q}7deXk&pSwSNkQ;gEAlNPFhRf$DK!U{k-HkkwtO?6$S;Z^bvo zZPtxWl)kM7mF=A@8ZI3}a;ktqX`r!3Q1faFjmjI8l!{@6gbftatz@u6nH0^DIkYy^ z??sl`XhJ?c(h^*d&dt>I&p6v^VcIFq$`%SqsBOr!vJh~hvPog7k&rx-2Egc1u_cr@lY+9E`#>m+vkocGI3Vqn z3X(w0>B^+ng>x}u`xo$m@k8C)x?lT)+zZEVtd(_e*H+u9?zIVft4eC9D-s2yif}2- zEo#wKQ5hbkTB11SrwdU{9ExJ4BqR&X6sWdD5=qp%Jzu&6MBMWI!HBJQQcLAv4QZR4 z^N(C~FTmDb^hSnDiKV`X8#r%7A#I@Eau{R{8lkG%ULMG8dCiskweKJ0IyW$GONhQ& zT9@Fj<1+JUx%PKZMg5#V8MO7kiLu&hE_XP7AG?cxc$p~aESiF8V!L*-?|x>ZqNjr8 zD_UzV7wgsj@hmo*WhE{3%G_y6S%chr~l-hV>7E}$3 zwcU<9vV%DkbtHfr zY`5Gs9X+Zsq`Rx9E>;SArNW-=Y-%lLl(z`)G;mW~rlPp?zY79WANHMxv~gtdMbU^( z5~-?Hx?6bAwc9$!QH8eg6Z8eGI%ul^V`?y0fS>#o(; z>D!%><5yV)4yV&scK-nAb9k;~S(<{FC~D5z-x~2v3esqeUlld5UbPLIOKEHD^tMaI zYjhGGl;ca2Ek2bDFn#rcl(1lGrVK%$dY-6NwLK8Pno*zhX?S~6Xa4~BnCc$2vmUIS z@mqT}0kViPABT?SwLG<&rjEy;bmSU>yGGnKUb)m3t39TM_geMrk>w_@y;j<%qNTbm z7NE6RZn|_#&FNfBs6p-!q~asiVW}&_{{S%rDIbUup7`^;OdM<@yNiX1hOdVc4M;tT z0LQ~^?3R?KDS6fUtGJquzfV+E(^)hi@B&DQ_P+h8Sk8id#F;q1bulS8cLQ-3jnqXj~rkW@zW9ED3*P`A1X<3@hpCN8_sUF;S0 z7Hi!s_G`o@l6k4CX=-P1jZS5XSj3?VK~fqS=_?WCrMc1pT|{1rrU~S|#-p|hD?qxE zIj9eueS)|6d<^boo{J$LWU^8%Eot>qNR1>}ocg6AN3N-9U?djx0}@RvbUlVLNEaY; zAVc*XTud5A^;uEOY9p1mY<3bXWz`8*W}Xm4SZEqok@9IsF^+~a1hjVtK+g3hnSv0k z)Nn|FqpB`iYGop(bUu^sB!d$O6;z1AoH*CXv|BAldQ&=PV!~!<92&V%}F+l?XznuuH8dHWu~=LELQ7WmP&1ARN+i2p3n(H05CrD_kZj{xxC`1s( z)xRiiia~?_UPOweuSERZ_b4#oz&NDKT{QDvazWv&>?EN5fn$$ z5kqkzT56E=wJ|Miw%uA{sE(p1lG#kpPboxEYG${rLaGCXJ#>5a@PTG!YTd$ytl9tJ(bhZV*GyIF zy?=JMX;-)0?eJDriYq+TLanu3w(VApB^_<9j_aptuQw0E(%xV(QAB{_%wXYx>Ts8f zpX${b2~F+dH}c05d^dMZdA#yRuX24J&55d_ziU>zX}VcS@Zr z+q*5&l_+ZHV7lo_d1ut~Ra)+Bmb<0DQqG!BQ$=^87W%mBs-dF;;$h8U%|0Tx05mHb zqV@$;e*)y#m?$j<%Sq&*cw}{?MY@OLAGw;QmKy}O`1H<^rk3QE?G2%5VbXe9)o-{} znyULuR5s5}uHj{RmE3KYdfS{an6Vniu;U#Z8xUOS)WZJ&-z|3ln*wai zQQmaDakbs8@+;HaAab)u>!gvnWG7`p%^Nj6L^TTVNd&bJO$@NlA{uc&Bl1hu+xgLf`mf>A+ zqXB8@!SeIdvbI-Y1Z!-Ws_obebK6U1`oJco2JR=q#oEry?Us7v@LP4dYE2s@29EEh zovGAz7{HHDYRV~MmitL;C0x{LolzI7N2slBPyYZlCBC+LnA%wkQ%OxzN|e#H-ICfP zrR>ez1vk1#LDt2NeCf@Q;Ns$8{_zVyV#R4vYyPItoo`yaGTyW_)K=ux8fxcHs`Pb3 zv#s*o8>F`V&m3z7{@hE|S?Yw2u>`I8ir{EVR=fhhV@33Dl?!lB@{H4j5s>p#hPU{H=_0gVv;k`@{}qykaNX_kFLsUkH%&r))K6 zcPf_MNu_RgqYyODtSDfHo(mj?Fd=8Wd0TeVl> z0zxHJctUJYnB3&-jh>upO^~})_>YjtMtVsC^~fLZ$6YiKC2qM}^^BgLsD@;@OjT0< z03WG5vq-J8)UMoExne+if=S53c>}7}p(q%rB~6(FtFOeKQGf}sCy+5~J5}&M-Ok}w zK*?*4lT1v}Nl&V4E*hVx)S%E>AnO{VA4~qFCC*9%hG& zJLOn$E3#&$ee%}#sNdMT*FFG8t-YN1Anl)E?CGw%m8)nd=zSV`dYi_uyFp^p&oqm@ z;G(otNRwZx>LOZ&x7*}dD{AFMN;oE-MMKX_dPBCS{{V$r(NU70ujS6r%=$mDaG{F(ded+uHJ1C8-nx#{1&Z|@JQo^iscIstRjAneMt*FW>}05XMNBj#JuWDE z;G7Rgc6Q7^tHMzPH?kbpDi(fP*6~VcKevzJX7}686)$6c54GQa{wFmxW7y@e_e=PF z+SjJ5*wHN`y?a45y5nQGK|OU)r?k-1&831QQDZ#%&X3k&VED1`uf#XS=9945rtTJ{_+irG%VnCcK=yL#wz(tJ z6tTlv1Dq8DfjS!pmpZq(QnommDDonDSnPeeOA0otpE!JU{ z#Qy+@xVQw$ZBndM540IUwQ)nEQ(j)Td^r4IcAmSo3s0kB?Y5qwxkKn#dz+)-M$j!^ zHAPJwEk3HXswL~U`i8cqoqc<5qKHtmp1hRTW~ZizzYM*pGbN5Bw$>IYo)ldk=EA;?oFS#^|u$BR8@=Z zHQ83Cp5q*%uHRWtQawl|qL~Xp_;-p(rH^4Tv{I>DtAc$KX3xmtNuG#Mhi|l+IMv^% z)tu`dceQ19hRzQ-j6yBEQmxWU5O<1Nob&67^>*xCrsrD~MMQ6DavEvGDj3R{W_OAr zLWgn!raoR9IO(vMS+F^<2`94rbMUP)(^cJYOVAR>lRbuc_CzVFwKeCrQ_W@3`f%yU zqL*a1+Srn==UAjDawaNcr$-#3$C9X2ADA3%(S~FU-H+5~)yp!IGG_8EK>hiFdUe+E z1z)P;)m2hg-)5Q{yy^qo9i*B$2;oekLfFSA2o!Qo0LNOEmiG(s40ZT;p0?GYm_(_v z99n=Aoop##ZupLFHtUs+MX5o)6+5D=r)}}zU^5m&lq-?JJZB`1I%6*|L92(m<$T;} z&KG0LbfPzbzI|28HsJ-DbGea37KZeuSR9DN+ zu?MV2Fi^Z9`&t&SXGLoMcy>WHpVs#}Ia1$uifYJNmNbq;V=}f;6e-Ck$UZ)wUI-)$ zkU5s|je0N_SRBY1Kc6Nn&5p-lrlx}ZcDT!LIZCMP@yH{%)fU4b5#%x>9D-O8k2uFd zkJ?YR2+F0XdV^CT#sl^0Hw{;%e0==h=kJ|mT%W-wp_bER0icPYZ~3Q;u|O(hTnvy) zFjK+%4ztmLvnzn9$?N5bc%#&S^#Yle`D9HV@2P^@E}CoWC0>`1RL)41);0xGcRQ#5 z0I^TGZ>YvW9R<=(9VdOJqjO-~-Gxiqmx5U6dkhp-RcSi|M{2)3Ra%kZbvK$wl3H79 zxZ1J57Z>q!FH=Vj@8!1P1<3<4NgC$lY6$MUJ6bhFal$Q1=D=KEyGZ8dc3@y?J44*NuwrP>O4P)yWz-Sh9U!+k4S-pJJ8(}0 zkG46->yLc(hzcf4ZnUS-^r9-6ma?K$DrlXAu#Lxp>T&|6c^r|E$5nK3sIL)j9@S!o zIv&Wa{oU+GX*=yrQCC@RrPJD;c;tBQ6o`>QB+tSZSoZj4#z7o0_6Mtk!jMl&_Ugut z&TDGr+U2VZCGlqEiQQiHaxYfSw66&3K(j(fePS%@`;8r?XK+;xE zuqqLj%WlYDa6E&bZ1i~{A=FrEXgf@C*wSWjgoLQ8B!rS$t?aXwwY%CRok^+fy{6KY z8kbVeg6BOvvQW`Hs+eVosO)^xZXV@z+&DD=J+jj#pBV z6+iuf2Gv-G0GW_U$`!!dHc;V%H#iEG?o!05i1=$wTjd^yw6>ANJrYdrqJwz0?Zekk zpC^iCr)>~^5?bn}jJD9hoxyA}mRt;ebvuDm#{iBAJ!>PXAp1B+>11Fj>>#@4Tt!?ln|STH;s9{~I3JpP?Bmd}^W!pWMmR+(2ZA1&17NkEqF#IWMY9~^;WCRd-_ZdC_2RP*9 zrpI!Rc#_M`(r& zbUsUX)0}g%)XbAghBa_QWt@-)ILSVF_Rrk)WX(uw*DB=_TOD9j5c-92HvIK%VMFRw zq?S}ziR7*fgsOx2hB35;03X{wPN)*9KI%%i>Dc`G^o@Oa7oqB>g44~1Y8l!5flOqh&+qNQCI{L8Ky!bQqm~}zf~aMc){bGXQFyl z!-17_$o_XUr6Qh=c=`VTOd+bhNGrA@g9sQ

~nRcX`j(>M(dYIJ2XJW}rG9G`@Gv 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�qtGtX>b)spps?soIH_;A>vXEH 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ëHI+<3jran9n$w+UtZ3CHG)EY0unruQZ1S|Pk0eoWb5ep$M#-@JFlt#Ss`8W zQs&dVzkSkR|Gpq2u05<9hlhbok|2>t(|4qwB$xLgUhGd;{?nb1GmB*A*VEp?A9MxP zf9m%Ywa6iikW5)tnm}Ch;H1_mEk&kEyT)8K9M=Se;t8l_qXayot*o2ZHSRV=VPW>c zFjNSGf$~bknuFe44S!m#39PU#s zXn%a-!lymYD@+r)8^)lz~w}y!@+K?s?bjhNM%r2I%S`{=GwDi605In zG=~>?xKHcTUJpoJ$(+^Hsg@(J#1VxuFjV}uBu6^AGyhz;X@LEZn);YbQeqgW28Vug zuiB{J2skv9U}QMpP+`{3^VPd=R4TS21QhuZmY~AQ!P$`R5}ulgL;p(z*#DJ1{QKNI zNZN~*bQBVfL4A;Oj!!|R&NWg)B;ZGF#hJNwg4v03RkcVgNL{ono6F~wy_VcBylBvG zpB(>$GRm)^{GmeT$Nru#Oo+;JTR!`H53=cIRiyQSv`#EwB!C%65@AX)fy0M3WXm&} z!J=}B;RfzySAT=M1d4#lFIqn#Sd$To0+`|N(h~}HZdpKqP=wzNkkJ}5_ww9`37w;h ziYoWc;*G9c6dk9K=*L#4-&FabDD04bPZ4#bBuN~DV{d|N0^h4ZH==LwFW=)S0it0d z1sl-^zaS+~8unYs~c!Tz__{~LtJ zZC<%Wze-@9aUh-q^q5l2+?grF!)mDnAd6R~ejq_$Z=+2V-lkBFcdek+B zLrxitF&9W&Lnh9m@Whu1aBQ0&%NbhmMNN?zH}?l0N|9f!iQ6a4E^vlc2Oey`E;4OY zS*usIYm4}>=x<4M6g#8w`v5cF=4Y20x8IXgw0ll&5?gzY>f!HthcOdNlPCIb=@TwJ z4aY)@_aSV3O{_c1-q#(ry*I0gZS=IeBRz)y*azJ_C(+3Z#u(ng{uY4O-^k;MG5=v<@~=gZyMV@|3lZ&D{;!-SzB?~^RasW z28k<8n*E{aMXgWec zw83w^sp%MwV>LV}bCt9JX!cH+pDy-FoJ1AGJ_WONB_Lw1r=+149*Hkcw)jqH( ztv7e5_k)HjlL^J3_&Qv+Ua(AISDpxTKLj-wSb~R)eJI#zZW8?6+%GUw5>i<3{I&`& zpG8>7xC%g3>kxcrkFcv_)Jk8rKjl`@`bSpZrGC)n+R5!A@;i=DhSVM=_Yn~aBYjt^ zabK}-sOa^H8`S0Hq1#-jVrIQZ(w>I3Qx-hNxh3m{5VMI6pMGtvsM5h`j%9>l;fe2; z1(f|sKqOLYyOCAeSErAVPxb8!vV`~HcklIKS3hkI-+ii!39(_8sJ&@v-c-R__PN-* zt!-+MG0dw~!&~mAEXnT`vHSt--a#Hiq&+-eV9Maj-(N-f9zR>0mJi!_jpfliC4+fQ zYksuAC2ZZyWe%7ups8$KTq^};p0t7K+!TfCaoaM|Y4?8bSuFWs27b%3I!MDP5OFy~ zgy)!SFIuHWIww8WdnS~1;9yFup%HcR#bJ&3h$B^$PsIOZ5pv-^lKcA<5N3`^jrM$oq6m4mdX>4&O>?dwsGgcp}SC*`!D zIc=K;g_(v$t^T8pxP&-;Z?@hc06m6_IQadkd_Qo6@| zMcf~I!;IdZZ_E{J_#B3`HQ=i1vZPpH=29GkiZqowq~wXl?Kr6hrZzXgnj40IbqouU z>(kx#7QtUYR(_Puc#!9bsvzfZ*|5gzV7Y}>QH3IhY6=2b=A-Z<=rOabq+$V`*VfNb ztuHeND`-dHNj0ggtlV=GvpPIdZ>d?)i83TrP!YoDkNZ?&x@HxN!yq|Ne0?6p@q^rg z{Hwa0`RY(SMyWAL?K|=@FTZWY?ZoX5lP@OB0fmoEcnBriWlisfxGn1oa9Mt9Yo$BL zQ#W%gy`u$u^4*I%uByAJ@=4fFN@LM`q3%hV%s(AHQ&$TolSj(4_&&q#oE*Ek`4@1m zQ?CzX@{qM~IIrf$IY?)UrD>j&I;-r+@qo9{%RpGg$%1<9=^K~2!_4V~>FrqP@i4vd zo|=Tg1mf=5k(nbT&9D5DBGZyfe&p+?mL1<(^nMDRSIh+5KBje#RQO$1RGao^x@xMH zFczohEX%_LsmU;EFY@+UtF!#r?-dn2IIZ7Y_M>=2!;J!lFHW&4=%2AXUB}AIc{{6N5 zd2k1{p;(&>zc4vF7mPuzVvu2nn6z<{C&cYdjPyHqhxb|O_99JTU37JTZ0DvUPk!5l zk@5RN2rI*z$qTFmqctJl=T=Y1*`~~Fa83$O_T8puwyLblU=!onMrh^OL33=K>e+OZ z(s7#e&D4D&?sM*@%FaXRvGAPkroBB?@&gJsSA{H8V?X-F+#0kYkNB>-0};g(0n{ps zWKhm%PTB#fG!!@x57vBoGWVnBsIf^?{IbJ{ZOyF%wBzw%DN1xx1Y72&x`I^s5zC1Z zK5E?%Sd)+`oB{TEYO+U#+eml&e(#pUNmb-Mj|I+bzB-l1e{8p|0j{xlp3OlrrWQa7 z!rRbL0>>~RcuQt7R4wbS^}G6Ljy#2ly4GMM(Z|lvWmt@wc^}(Fn=D&DV!y}RI|@uL z?iQ$eNeMhBL4npzY%J5D-%QAO$;uQbAqR-Rd#{aifhJJkPOhW5t_<(Z27OB0#VgO$aOuHSbQufottD{BzXc}5`-N*+C4E$ZLhH)i zGI5B$+t`?0G832?W__bSpuJJOqhGBE_%d@(aU4pS9{QVwp$U~KTJKyh%ng(NAdXzP zs}?g#CUsn9c^ZsWIzLu>hovAZkk%y%Mo_HP;0G@@&+|4C~_1aP2=gc+L> za*qpokUgEnj!r%|m}hYvoMYxBH03aaO&KjYe=zBa7a?@7pwC!IL1P^ zDu-c3;WRtAOm%opZZ%6$7D4lmy*?RdePh-IQP$F2HVMAMP(L)~N?8t=I}ho|4k>A* zCZ$2ewEYV}Youz}RDQNKJ-F5oWM6XH2Tm%RN|qgcm~AHGr;XA+A(JTB6t^ob;V-w~ z)|AAROTM7zptiC3%^^|u*kCvO3Ym-E+)sjzoChQp@-mndFq`vYUkh+E77F%s{S~}^ zH|iMVZ20qw!?h572BJ%@w=Zcvc6myQmVTN8ZX4vJ#ikjCCs*bhTNcG;%E4W*FFo#g zl;34vdsJSOmxI8Zi!bK4llXo`41WPkn|;rWQ;Y-!En220;2KVyNtc?+Oohyq*s;Ab zaCxRIhoU-dJwduWUGnl$2aZuQfDm>dG5R0im5Kb5Pp?83BxNiyIQmFU7OsR7TbH%t zPjDLfBV{i6Zh?UK?&hl+f4V}zrOhS5X;}iVFeCg=ZlAfiOb*L8HKzSOIxl?6JRQ2o zHLPBIexj4(fV{?Uj5MKHI^UB-KL2@#df?@zWjoY3x*E;pKAHDkXZehHY7-;t;tuTF zTo|sQ@AuU{_TyuJZ;0hBO_gB5SIuR+oALH1lk{eUr z*`~=I>*w!wSyRwDg0IGhm%KPQqosu?${s=&b27z)!p=Fs7mYf72Etd-J~OBLrpGqSsJW=TD2r_aJc}p3v-aV! zC)Y4(l}D{gZm*0mDH6q@=!QEtXlUHTj;qz>$vzAE0#w;>wLhnK0q@_g;379H4$UXGOy46y<~bF(q{W%}#6N}+@a7Hj$}UAYK&Dn>%aTmF zb-j+1AGq;q9Nze6hl9WP{%J+MkOeT?7#`=j+8@VRS_es*o+(KJIKvK)w0T=Ha7T6N>tCvfD2xPJkw2=AG6NwYp9xM#1M!$c&{kCB>y*lqhX z(0uMl_mYV%Q;yMcolIR3;b5r61HUi6R~FV~SuEcbSI2?;npu!0^UU0rdrJbXdo(Su zN~8CK^0m`Ti1ITTdts$SGL!%H_UXn4f6x8WhC_N2c;k$V-aKB=k#b`f`_mD1T9-VlWqGLxFag9b89j#e1mfr5Rbz{5JtTgg0`&p!71p`4n9bYa=|=2Wwu0Tt(_ zj?7SQY}m8c!u*5j&ZRE#Q@~KqiJ%5+q3OD(6;)|f(Ly8CBndpn=~FGS_;OdDs>hZp)I6iUO!{3ne>Mx7AvSiZ?KGkhVVQ683FP0W_(Q!auf zA|eZFAEB?(lECe*$I6Y7q7zuFZ6O@=rO0pcENmb)RRZR`9$PO6ydBC~w0o)iw93z0 zTtSu7np@OXf1puYzu*~fShRZpSB5^UOs$+4YA;TEx2-XEgz4KC&86uab3X{OGua%p z6hmAWa9(vSp-O#(RA^=Y#zjYfk6_ZYtMPgRF5Oj%5vV0?jHr|uj!m8`|j~cn&d3reZp^Ew;S5n=vPkC;_TTr zDiE6{iU^+vWtvK3X)2RUsxnD6Na9t42tTQ5cB3eWP>QSWz;tZ6iM2U-B)SAbC8q`* zbSwFlzkq0r1LMzRjco?j3*)P+@uJ(8+U|X(d~>&VX|SpT(UjyiORk#;c*`^m#(_=)PKjEPk=6{ilaWKHY1IU$$jw`pm}7#q7$o)&yCEbDFFta ztLwT(<}@9j1o{63-1NLU{|P#^J*K^P`;g>{r;iYY{rc6^Z+(JWM%C?2?M3oMg}%SW ziMgBYdD5;VamTPNon$!fQRYl~rgwa4YR!lWllxN5Q2pyrWleIYKvdg%3T2=uuD<;Y zL3qn-F~mxdk&gXX>Mx-D+n|CM>T`@m)cBVNrU}VC!iO?dwyFzhqUK|s~PbjcEA&G$@g)- z@;2w}SuF6Jdh^ksxispjo?KdQ+7W0euw07AQ|)%MuF820;hs=Fy7vUj(HLy)1q*JyVW|@`_;A9UlA3 ztq}WGWHt%Ib1Tc1fK;jb@ahQ*S-*MTCXY(Jxk}xJeGxVc+0uzYLkc7-6y%q zIPRjx-BF-L!`2Z|cw;P&O}lX=0ZIzWW&nR}vb>gcdT}=f)0CFx!W`Q%QN0L@+=3)Y z=;ccT*p|o>m@O3@*bC3({JsaeZ{i$+k}wK zI}z^21{l=)el5cN!U$Jax&wfyY3GQ&K#XNh-sP}ktb>y9O+-Be1^8czTNg?e<&LRu zzm{3Q*$@5{(UAMX{;4uxmQMLEU_Dtg`X{nrIun(wr(scj3=!AIq~+06Xw~b(#YS=9 z6ypR3o(w&rIVwUCzhRZfuUD%w;Q5WpjNxv1yXL%Og1)exF%>>egtoKnq6Mc+hP5{G zfE&V428WwjuBDcr3fb4pUq(?>@5dC8+giNeof`qxM0)rTt3M41{{$AYDi48;s62hd zt-a7W%N>vQlJez$rct%+mbf*+Hy-|Y^UqgWMh@7)efa7x(8vb4!%H78<~E+nlqpFn zvS)WzV&;c0()h_Si+SLmm(&aEnl<4JR4W#NWXy`pj#FO8pn1}4-gDfqle)u9d5a+M zc1TOHY0S@0if%KNa%xhUEpS4(>TAl3i?(k>j6(H3@$Cw0vZTS`<0Ykw%)+5|Ems*H z5-6L|aaPK~St`B<&JG*Ne`4omNVgNksBE0rr1V-l2~KMJ9AC5-=Q=&(qSxyOmClzw zcleZ~OVJ-_XobSOzKz@piyOqoOZ!tt;Ehv!7SI05UZcKc*Z0RYR%?T!XcvS;6LR_N znf{?Sr>qjoL3~gADuS9zk~3?IXC9H3z)MXfa3FWdeUZi*8fri(55iVfru|7Mt2Oas z0oiyw^qOZ20T$#|8R%G;cxm668zWqJN}xz(_Dv$fU7m;>%h7tleABkgkSbG7r<%#b z(^~gMs)~{xrf}l(ClO1)OVMFinkG*8Bz$;^rW!I{m#m@o7`kqx+ix+oavG+xFLTFY zVrvTviNai~qCdn&%c-Q7lvE7e&EUM?wwzptU9(6@|J6*18pf`!eqC?4D6be=e(ZE> zogdLv$CqkQ)>P-y0h|Byim-;kT?-8-C0pAw!@!^m4W#%(4Wm^RBYAeZu&0rg=7`f@hLM*QaZUYWp%<9(yS#c%hq6bS$`K0&eMwIaOinj*0R_-=Fbl`@bNi9 zcvDUzczK}>0b5OHi+ohWvb_-t}Z;L zON_rdN$9(5W!dn*BNzC0&L7Ueh0}T#!aP{+!FW(69i@fpcYT(o7Y*0J1980#e*y{g_4(kEmnPNdFi{cQZ5=KDQ@VdR@am5KHx=IU~a$aKj{ z^T$EMH&63$c=%>Z+)$yzxE#zJB+}bHoPOYosnN!py*g^~eeAyKdH2GJT_Ake{x^NB zC66vC`nQ0^@4{c}_MWd0e0HC1If^9$wlp6=h|!_yT&|*C5^q~j?Wr;2q=^Rz&rIs5 z&XI-SMZ%s7`0|8%A%s!+zh=tC%t=J3G5vZdSS$snRlFYbg@GaqtHv69F9R-(V=XADsL2rk8hioU zqyS~{kW6HRc2R`>>>VE89T9die)tKU)UugccBA;!te>>Ye`wY=aDX&AEN~8A|Ae;Z znIVyglhk9#zdH}5y_ic$b#^f_W=Z5eE@w0+h* zDTDP|=tt0oNK^M`++d;8i9i;6YyEO?wROCWD;akt zL}}rUrI%^gJa~_t9^M-b3Uf7CagD9=_&~l9{!yIA4seNH(ya98_q5GPIKweOXSbhX~>r;_%MRh7W`!;^JJlzn483dah^XS$*6xcJTVcNu{j(qBg z{#sc6y>!rNPhK!x4MPQqk40>l{TCu{+#+t!>`zq1?;e8|B@5-@s|!mB?j+7R)S-4> z5UwGOs5aB*b8_YmmExFkp3ZdAn2)R?+sqkm@Uxa5=ir6ix}F+Ap?{SC>uYkkay#{ z8b`msY4@=}cw{84Lg-hMFA&&-UVcBHct2>!kBj?q9w)U~M0{+xw}Z8%vIIhr=WSg` zew$fZ&e6GvuP`e|OpZFlqfYN#h#AUlEo0q~;NSzoD{VPAro1uv_;yQ|bH19F$K7P< zFZiCIa-yvYG<~LBoaGz2w>Y^&NF}{%E#{sZ$hq@3c+l)jYl5x6)&|y(P97WDTKoJa zKR}^RCUl}DO(j(E$A*UPQc}`Irbsr|;pVRp4}i>irl%i7C;tMG4DyD|-OpO`mRT zpqf469!52OFl!6*9h}8~i8w1pjjkE(2XPVX+!z=by_+*J=8)Eu#MH2TJ&s*xS_>%X zYp1AmgGy+WoZaeK`f3&I7vUEF5yF#LuciLRkpsSbzg^Ti7s0X_#!-)SA4)C*eRP2v zne1aY@VF$4?xUi?U&%f{W;eeOZ%`%HQiKYRG-yk!>Q@}og?3Ntqgg2>Ey$=?z z@6gPuX28Drz9%+Pf}V5_H@$k0>Jp;rsor)T?n`$DwAPyFeNT?c?z&bq%zGfc>CajT zdrvOHqzXxfp*H4R7PDS}iP$NC8 zzLBLw*S~HM~Q4NX12*FtRVb19UpLe3C^H8h6KPZe@e>E;vCmB`+8g203cGw`M+TrOR{;$xbcra@s@d3CvGD3k5yFLWSlDs?Kgq2-KP z6nu9OGNqf$Kih$Nh5>ZlpJd&!fT)by(LXxyh&(>%>aBS=UM#TaveFf^EI1S7wN3r7 z)XPCCmIW~)>75*}FUFW9?^N31$Eg+#PbrNGPGCqyUhnHJUf~>C*KQV=mty2%VP^D@ zi(tDl1u{K*zvkaFRnOUzfbKc*O#xWAaX=Y7UXX zHKcN}J~rTx`{7#F*u3o``#{Gov-t|8Tw%E+(YD{~*q?{!cnVShzQWTirrY0q7G+zE86`*Sre)P@5#XwS#rJx+4D|K4^_q~+>s(OJ;HkE1 z!F~@ePD={K@>EzN-H2$Y8X+0T$^4c2K$u#&l(NqfG0zUbP2gKY+QRwr$_^PT z=l%een9FTU!zB2ft=E{g;(Q-cqJXh-RbiUo1o>Df?G@Kd6KT^+5-C3{6Q~)Mz?rg_ z1S8A_4JynHlTnt~Z>a6b^*9@|@wKu*APa`Y>!1OWD7uz>=1~4!BBE=MmS?a;7X*K_ zCmh&Vfw?I!y9qDCiaTP{P1?je$m%~kt0`$WM^Ioj|1^A5!YrMziBj3Lz$tftm+lKB z09DS#%t)gUos^UoC-_G9XRTP+RCvQkVvBcWaS+tL;Ozgdo30A4o|fvDs3T&edq{`X zSerz5cMZg*^rqjzZRv`D=sNYiupTQa4GYFA6SQ0^Uu2>#sI)=nIg-Xs4Qi^mGeZ`w zNc$~oKudkdxqZA{+3^v>3A09rV{+Z~bxFJR@*v?)mTj4$*)pK}_GqJelZ^|ORAUa2 z41PJejObu}xivCh|u^4l}sNNcw9;tDWy7+#g; z;O$tuZe!q(f)DRtXjfKp*76UV;r>fugyMf`2kPXt$`(WX{^|vvyvn9^+hQQ_gsI(* z5oia-{^hTsIZrK*7em4ft8Mh&s7xd7&wnZ4t9W_XeW=BVmBOK$0eH@XBC`Ad?)7V0 z@%1kThqgDBb2o>|W*4W|wD{Jm3mezqjLs=qRVl{DwuR9yUK*GV4hujkMYnNWme_yp zCN0J-U{hY|dg(-VC~G}@tj~-P%wFZP1RZnJ328meNf3!MORuqhNK`ij+D7AD0a0{n z=I|#7nURU>s0VZ{mB?Ipn1?NCE0kD7B)|$-o_!Y+{4)pLfzL_^qHaMI4K(1;cxH znGigxaeT4&0Ptl-`g)V4WhfN!3~f_0y^IoOce|L%X~Xz~q7W1nfT^tY>*ClHwXd8@ zK!u4ZeRcImvuL#O9Xv$0OwlXc-MI9k1$e}C$z{*tvUU`eIc$P>0jX46KxPW+M{n3R ztff?f!mTy5s1^tD+?!y%=W(ZEa3m2XY>W-J4 zo~GLtt#hgk&)>Fg)2J^i?Z8e3zM!T1C)saG8ViP%SPjdqd~SaMLsfj=>Osz4v{$~@ z@z$=t*i;qaebYa5a$fq8tcQttw*!070|=m#be^2Mj6=77fRqOFdXrr#l()l z$D;FiwTP>wL)g%l`_`Pd2n;6IG23ma^w2yH4gIr`^%u~gy!Rs6Cn8@kFq!0pegrIGiZi&G5yU;6<+1p_EPACDeRUTrmBX|MRn(7NiK{4`_5 zc?2b-asLAD4GIgPDi+!_UqYyx%$yJ9$u||t_;d0rzFuLK4n<xa&2?==TAODRz4J8-!_W z>hJHW66niADd%Dw>*q%q8Ju{LL7&O^9+5P>ArdK$dr3v7mj=+b!$dT?`_SvryWl)d zKc~d!@5eRd75b~^!X+Kzg;ivy7il@5XJcQ5F+t8%lEJ_xw#K&E#V(rDNn<&Qiu+4t zqe36MBPO}hMT3M*)6x?iL;MO2jm3hY*E(aoC`mp|0UxqMC$KAbQ6?M4+gOcWrJ5-N!?WCp#{XTz*q$+Q61fw z+X{*jVKwGDWzpsWDU&eZ!Yr~ETOQJRE5Ja50m6rP1;)qYH080iAMjGn{XV=c2nCw1 z&WJ`_Mj$-)&o`(Rv0NS5o#D(vUr4PGSiNC9|4U;)TUMGBfAO>=sY`c=dus1~Tw>M>LfO6K0EAdj#H8nM9UHZ^Tkrm-g ziju_qo6SNKK&U$})D<;1v8UhoPWNf&i*L2^6$U8m80jc~!*m-RlLrB(PQ0cH#=bm$ zyV&3Hoes~9>R9&-awxZ_f!2%0I!7xifi%eXWr0Zri*{t(KH*D(($>xfIVJU=9=-W7 zahrP0Mut*tZo&Adqm5~kx7k(Ep^2@O=q&2qw+cG zS)Q~frggsMWg)<*MX;(br@7ipSoZVTm~a^L%#|A6w{~E9vkHIh1@^(JyQ8_|arL*j zWA#>T)b6MVifYF0#CB7Rg0jWXm}*wcogA>na1I=BG$&Q6fi}63y;55t-^|B=VL?hm zw$ZXYGbve{x1Gs}13$ceRL@)CpTJ2b1vB56Jg-Hec9|eU0+F$F=!j(M-L92{UCqdD z8zrPGBwN21%*FK+ja|Q%`5zS^o~GJ1@4G$>Hyq7agF7XhAV9?nBklkkkyCH|<5)Wu%@X4F={Xk46%m1 zDO|D-Q)$B2m9?c=WPW*x-tNpYg^{CE)P}?ZXGxLLcR<0ZBOShh1{cO8L227D zJC`#u`+Kutu_8S-X4qfAsoG_f%)^8JqmZs?{KlxLbw{Fj1=yaZX0H9hVEm37zl$m% zeO;SBbl<(9@A0z|bts`TR}J0_)5k(}4jQ(p_L@hV7VG=&k)fsEdU}v&S&QKBc3E0G zp9@LhVP%M~iTJ7|6e(*N<&jbF4@7q`#=j+H;6ffV^h&n%>{V#2BqEslBlEhguT|(f zX6M#LzaITmh(*yZiD$Ok|M4q=Y}bx#jLvYzn`kiX_pnRlCxKhbpHE}L%RP&Xu<>NDrS)%zJDr(Jc&8XADkMp%*+?X(>yhF7Re0j(_wOg{{no4;SZjcEsd|-c3>6p!J$_tLooUf zL)TZ~>xaR3A4?|xGJyzqR<}NJIkEeBylo*ZhisK=SQMO$R>os@zR@8~%@uimP0z9I zvMW-~`875iSy>d8rZn_u3)|yeT{{DD;-|_w=|-$zL55zU2Vueh5KO+NQnEmsK2sm*=2?j95u%*RD41Tw(hmohZ8?G;a)UOh_7Nu0MmU2G0WCwlr!Udsm{e z_C45`N@>g*ktP02i7kV&JjCr{xdB||BaOEDIh_WFh}OgMd&nJ)dMgLjD1hB+N?Zs- zhM$_Y>*+1|YT_BruQvZHz&|cIc{+Kd=gs#&)x4BQV!QJuO1rHQ9gVUw^$Mh|_pU3K zf-BhNFoA=E|5T({#Pk%+SC{iow88gORzlUySJA;coWw@(EvZ6Q#7cR?qB;Z z7Bmh~);uB`Tusj=QL;-(84S6>5Thrge3#>*Le(z@?WQsu?4$lHqwB%{@w0Xymg(Vw zoI^z6-45CyLr~ThY#wH}>t#w}i(af%G+Y~OTM|cCCS4?%;Y<&jHwv`!3P2c;NL2!rt$0DwGF3o@c$ zBz!nEBe!3v@7QA^tsf$(Q35H8k}VHV#dg`9`L_N%=a#>=f54U5C`?3j&e{zPGAY8c z^MyuIz3iHO{d}0m6N!Z0JsjTg?H*h`JG$h`>L!fc_K z@sRqMFwJGo2cf!w)7wKIMVr{qu;Cka!3cUtc2xtQV2k@9sm?{0aF*lz|1Xh9<}8a` z=%~W~KlIA~04)E0|2IxSOsK0M-BxX>d%o-5dBYFHy^TRVKDJ6BB%ID|7RlW`{0m4~ zf^IS8ykpZrsR#OLu{KDZ1c=Aee-eX!RRpNKAI^O;m+U02syd=9RE|cZli9&=6H0jy zSsuF=HYm?Y5Dx3|rM-j&F7hwdB8W^&jYlL=aELif-Ys+tdQ`M>KXGGH;ku?|=lvlZ z4hR-u-^1M%w&MI?=I8JYh$C&w*;T(gYJs4o=$8kX)b;%`5sh0>keRlWoTQiQ=5G^{ zGSYH)J)_C7wNk|0`Eov)HYCy>xQ6^*?Tp_vlmN33POGsX-fnrpq@X zYEmS32^}xcJiPY&s{AL^B>bPp87x?{DfMW zG$hF=&6RT1N$*%4wQhXtRhdOa*^?hIyU%+M^IHyjrpO9U(K2;kQcBz1Ps0p(Dxk*# zlh61b(0WO=0gqbO0h@Jyo7-s-0p_BQl8-@re*%ETYEf3^aiIw)XJACOGfsf@R8-an~*`LbrG`D{*5 zZAX*c`{dRLOPl85#^qEgMhTycG)5bWnByKS!adzskSC#izz?L*LB*YmzEf67u=htzA=7a9`$oWQ$cp$e? zBovQgMGblc#m>1?X;>?!*2TPqr>gvrbx$71<=WfQefmc8st}j6CJG@WC(VMT824Qo zpAq)dnazb908U}*{5{{koahwZk4&wQm8ma%u_Ni}4_Ie?OFwQ7Mi9%uS#7O+C~DOs*@DTz*5W@l2{Nd&x1BmPdHsRwjj_}sAhTIv9+ z42Bzd{%kmDj3pl+IraoKza?sj{Xd4&qia<*9orqWW7dG%G4*qH*qx%WrDy|`eZ zgT>@!CM1Ka61wQjm79;zb1B?$ih^s>qko1E*oLA3EmX(e4aR(^QC5zh#eTa7M z17$kR3jP_3#rWjsjgK)kvEV;u_)RMmQqwd$>8WF?n!?PyKT{NV*jb4H!C;Kd7V-$j z1|Ist+|GU(VUYnAZU(}~Ocbs!d-sd0Bo+@orSCpEq<$-(*z3(v zf0gPQ6MsLk2QSm5>!adKOj2pcQ^oua4l*ep&dypvqq`Q?z9^|Mt;$L53dVNmOdxIW zXo43OE(SPS3s{cqL5in$H0v`tRe&grP4LaXd|EU|9k0LBpwre3qPbETpFwQ)84yVL zZa%r>N_%Au&hmXV&;*0>U`i|j8+Pxr8$v#Qz>Q2QR;xAl^is^q8Lp8@oVpz19ggz8 z8-naR)M;z4ct9mJE=5hHvlK1O%DA%a6uW3Ht3dU1da4A#G}!EkIgHW#$5lrcm&5WV z!?w%)6#m#r_?S%@xY|m@%cyGhT1t7IAz}p>qGbUbyl6s>d6r zTQH%zLPxvhCFPfzQ8^S-No;W5cMo@`K}Dx6PNzCC=g3qkgb=4>mvlN{Ac>NioKewK zfPaxYINWwYm$O-{o!@Bp6-XJI5XYdrySo&Z z6ev)nIKkba#i3YncPI|UrGO-@yH! zzMZ`5oW1;7CW9{e6cS}cWIVt3yfUrw*d{q?dVlP$F*tPBt1DXwTge>G_+}E!YcuHEnrHEEEoEZ=XQ-APNvq0*2WZs&fiojpLpXZ+)J5H)KuXUkk>YJSH z?BYp0bfQX2PsRwuW56LXmx$24kJK@Gb;tBiGZ`CO7X`bpyrI0jcpkho-r4jOew_)1 zd22X?5ZZr;pHHVAzLfaM=}pwi)O;KtVep1wc<{MC-3yS~_+!LTcML09ajV$v=JBgQ z+)8{62>9wIUB`R9$ev$ykz9VE_S&R#D!u?-?JeA}v>Pji_tFf!K>>!V zu1Uru4Kwq38IL6;pUjR7>67EfYFW$%PbNuF9C7d^u5APJ8nXc$jL8eB3en+*@fa}K zj-K2omXfig3DBRnmDKt^HPOx}WfnT94T!+D7CALci`2_zh2Z-~?{7ZYFu_Atmn%n? z#m&Tw#b6bi49M|rnXgCc;xkv2J=j1QLodYhhYbyI-08kJj{EO3GYWK)rp zUNRmSkF_szU{za}ne?VLcTaVFow(g>P-k4#YNg1GC2s@rr z{91>*xq41c*(`b1S{MvV)JQgxcq`oEF$=eNAS1#P+VDQ!f%g$h0n@EU$zQ-nTuL5u!mH8)S9(v0mPHwB zPPfF(Q>vsCSj!E#rnuJc)WB+tscL{U(D;HRHO0gKm}nA=6{-WZw(9Fm=-|84Zg15H zeI)=jY-s`7Sm`98ur_|+RP!`HLq8hAQ^00-UI+aBQcXww zYC(EVM-63`_bw~+7sD0HDYEnoj*K=fYCnRpb+o#B7~<_NZp7p^!B->?v?)RA`fj+c zAuQ%MRDFhT@pkFTv@5*MrK%|KU9r%-qp5>Ip@MWGm#SE(x)L+ZX=vwH_-hO_o0+%y zYW(f!I29j!jhjK*n;;JCU9|J5nWq&hd|mT>*d=i}9CMfvV_x)0h)N^FV?z@$^*SOKLi9vbE{2G-V%+c*V_qWeM2+3ip;n8Ib;6C? z1X73jjgE_XY?W%Z8q?M#9Y!EYOY_fW3Vto!S2C^dt95E?uoCE)4)dxN)1HcE)-Rp~ zJyWlPUsv9h-E%z0CU6_uhK8sta11k%{tq)t)!WY-J}#1ALB#E%CH?geBNQ7u;tNag^zVc7KgJrFM-@a7EvF9%asWsl=vdGu2bfB zOlLf?4R6-+SOP!hfq|#+7;zSW&ATWwq^U6+}b2H&`<}`{qW_37CrNbYYx=l)V^7vM0v(>{Dif< zv^ahFn4Pg}X+V|4YOm74lu#A0L))BsJhusGaq)=kk@eQFf0jmTT)MA)fS~uBb~xPT zmqS3}Ow=bMYJBz;&aEmz%|7Cst3v23pp}~Y`IeRA)7$c5`_|R-8THQh{~?4z;;bc& zrSOa&Y}o&l(CmCL?Y4wt9H0I}&{fp0p{;1{PPaT&quqAl)om%dQR4K)rru?o&R19&H? z#%|iuTH2~wP>aYw^I9=SoS?bWd((zSTFsZ1&R<}o6bmf(lw@bPb1iKC75}Jr?p@Hj z(N%6xMPII53vT{nThnREZZX*6IffHbqZX_nyX&KC0r-$7fKALKDe%Ux`gLY-DErtm zwAyg=qojXpIVe6R1-SA>kjXf%a`gQu?B`G2rH^=S_f6&17csC!>W^&@AZLJv>Z(*i zkoQAnCR{l&l2iFkv0Z@uEcDu_nE4_TT&z@mNxT|Ul&{9`np``iZ%nDPsAVe3RW215 z&i&}1eJJ(U8p+mV?tzX<1}2{Vb0oN-HGpU4R8N)%_PmgqE4~)g=(Mt)cubo+eNOr~ zZ5(dlf$v9!yg)H&T*#-XCTMTWZhB+fa#Aq9A99#0X7iX?Y3vq}Qz z06RkJxP-myTi^OHPacyU-*wqH+_{@NLDm9g4(568Wn5SK7ETtL zu+}LWQWyon&MS4k*b1fs-y&Ldr|M^QwVV0o=K5GM_2T=5gI1wNjY#^%aHUUJ@Tu+ogIu*!`fxcE&fmomp2KTn$AN2O8;`kyEj}@UaIQQY1N&ae1!B=q3#;rj zDrwXi2Y?;a3{Tea*lGAuWi7BzmD8HjY?A4$_|4(&$zxzx6Kl1E<`*Q*uep(=7TG&4 zyc#kCz4w&DgP+SuZR_++Kt@IzNeG_W0s!LV}HpbCQ$C3$2=d8s17)_Q_GBGILn6*#%)!JNwzYru(|ip0u7L%0)Q7+=SI>vBup#sj$&B9{_I= z9MLK*eoWF`N+{OjoLks*gyQZpm;bVrBwcO799&7rm9_JcDlMkb^Q*?8GC>Y<;hhM-FAjS(OSoj;U2;63DPN2zTP%wFA9(j$~(P8q~e*Jnl&Sy^@n> z0ZpbBu=Cb0RipvpfqFpKP8o-;DNa&Mt_H=KnT3^#OMYXcmg0WxYHTJWJ|%$UMD34H zD`bDP1Kk)F+p4s)Bu_lnwHb4;WY#7xSd^B^P)-u9X1M z0oed?W*V4Dt+AF-Gsu4Lnnxs~8=V;uzD}_W}$;3!oMvJJvhvRFCZ|37>Z$@B_M$Lm=+(Q1C*| zhm8tnelt!V%+lmu6|i$ZyHUFX6H`%HMXiHgCL2P$oWxat&Kv=RVLzCA6}m>DVz0h4 zF%GPwXxz0T#l~NRG3VEaL-gyuMIew!OtE9-K0Un1>NOfT=%n>6(-Y%{*dXkGx2IvnM6QZFu_ zFYo|G>tLC#`zlOwL)r@ypKPDqqIb_~;>03qDyn(9;pP@?;fG+OXr-p^ZeeBR4R&$Z zIxe-|;w`zKC;J*-!ksZM%B2bc9Ooi_%qb_hkXqwFOsg}?g?n+V1pn6&_`Rq`#s8C> zB3`-8B?*>eX=|TN?$iBE+zRSGQUc05)=Xcp$a`DaE<`+fkoI#V!pukvFJTg>Y}(4ddBO!Y=VHYmn*xRlBF2yFx{%A?)UVh-Xmre;JC(M1?et^<)EM957F5hSL4gab4 zduwa?0lkdDS%WsN@_Zx1Kj9*Ce(-C-!C_&=m!wTA-=Xg7gsUIEu|R+*e{k(8|DDnp z2IHFxzK|`~`M~_9cV|tREo$#6meT)CKQPxH`<@@A%IAvS#==t-XhNT;)rwlTG^DTB zDQv4C?I+B5=~@HFJ?wL?x7JG8i*^}>{$Q;Lz6eBPJ}HOIKLWLehprMk=?xn4Z0_B! zr%4whe#G>nHacN|rWA7Q^XF?f$){&8U9Kde42!en!&}k4zx?xwgs7ubd*$j3y#K#^ zt^fBWJRjf`-1kg-6p)r>NG+BqkkqzDHue&OITGe~SoJKjv+=?!$04_DA)SfQYlDz4 z@_z4lMC$T5zivxuuwd|g!#}qTWZ^871Ar`o^)*=H#XVW%1imMOw|41TijbGMasr?K z6f9NALhHQYtm^k@j6t$!9@1Bb52yC2MWT#x3wxH;5eJ%R)i_ug$sDj1^wt~sa=U;O(HCyp4e}i{YNO@)wp}#gOtqODf~6s+VV@3kJIjG=e<9|FApI= zkuf8J(PsG(3m+cYIHPG>H|wwK4@o0FgFgnF27C>jy_1#~=!YGqvN5jNNk4to!jARrH;!DK)ey;jn@ zEZ)`Fr8R(w5Wz{vjkz!7>IwrDy>+7$a$HM>>lcWH;X_QUWCrFsggAR5h~Z-+ETV@~ z0d*x+qqGLCW_CL%eo?K}68_k{C*igk2e$quO~TL-(VM&X>&fqXmrwuQY-l4h18Daq zuic4$5AaKXR}n{^c6Z9D(D#NA>*YK6A-E1bTK7r=%-)B>r@_IaMFlc_dS>>}NO4cu zDiQ|&&L1FoUgr&x$Gi*z?6E0rENDU zdkz|Znn@Imu57iK;VrhdIouYNLj_jTe{%*V)Jh{y|6+w337;CK$qqli6K?*##Z)D` zd*MkORAo|wv&7HAx>iATT!6S@Uv0Ya_^qlE6mL+Av>2&&p1WTI2{LV2d z#k+U(%gpjCRv4Erz<1jF@gDA+Ce<*zfkOxNC0U#>w4QJXEh5fvFCl>E)iOMg_z00trRmp?lZiTK<&bue+)W`yod7jbxwks`iM8jYAZk z3=|y+U%WOZbhOu}Vk2*5Wu1Nst1*RTOfv8rE9xUZ0I_k*eAgt7F26YBF^ovX;-3?I zJJGLhw0Fp7mz|U55GFQF#si^h8zY1`MN5QoC0(yc2v!pGs1Z#SUGeCk;U$N3bRe8Po)jnz9t7mErD@Ah~pcO(3 zap7OMA;ZYQWtKIe^@`lYH4~d%Rb*tjvcW%x>EOq)tB9Yx^UUasdZ&ZjC(yj$-t9?` z5K$t+Aj$y6cxm7F%8)MJLZ$TsJT`klA)udn(M5%8fbEo}9hf_cDk1WYkPHJyy$=i=k(A9`&>L}NVJ(EIuh!POl+i5H} z2d~05b11ffm<@yiG6iLT0v3G&XGl4p5m>i4qC|cVwGR?;aGm~#;3up?!Rc~ZLE#qC z4$}{OnZ0s@wQrmp)>c(!ltCS`b2B|Nv2)Kgl@XPY(P=c~2Aq%(U`W|>%9c<)OT6;} zbIcRPnb9Vw`j(W{oz&BjUs`3;7|)<=NMR@Adt?l`OS7bff2DG@Qa-*D*zpsS z#Gf0Do1)B2zS!W2=oIlY*+NMB@qn0VmR8t(|1mF^(yAif4 za}Bd-4xb7N?>p7uRG2NCWTzEj2Dzzmc&n&i{bAQ+FTd_u_b&{eVZJ8eF@Pdy!V#&6 z()*uMdfk7z^;y%4pVDJKX8P)^8u$*Coh=RAtr;Lzv{(h*UZFgXl(KbB3THpAICvR3UH5J3s>1d9$lN zUR?djXRW?@+^XgLui%`448@Q~M_4J7abO1FY%zye2-mj)9v}O~+z>}e%l85y^mp+# zLgq#Rsz)4yQr6K#+Ah$+&Fo0iw*}Zq3OWKAM57BH%Cjn344Iig%rOV@IL^uaPh+Bt zP$2U24dmVj{3Sp27%s02ED$^WP~`*pwC-AqtWFQ}=ldhC(QH0aJ0rNf+tJ^VQVx!2 zH7#k^Y_|a;REUiHr1~^+e12HIAAGhc~tg-J@W;EiX^RB$tL6 z>d-CmGDRj!88sL73NkULhuViL%~c9&Lks+Y8k=-}%>fx@@390Zj^pv;y7G$3oXHJQ z?ru%1{NH}mQ3)zRa^RXZ`c)A-sdVzJC>jSbjkeAg(rGH8_nSL8YBzA~8*qeSf#g1v zAV4q#%gOjr9Wn-vW3@q5mQ=I1qNaZw0CqiFBzYqj!FK|`ij&JhN9Tf?w*gktS{$=$ zUbmW|CDSZ z<9w3eE-vQY+559XM)!v4YLOd&dxCMn^=0nHomnV^ya6bIA$TH&Pc@)Gap5|^)ekvl z?+TQk6x6Z{mgF4O6EdA`Zv`tq2JZ?e!)&BtIe*kQU$!#4&!G<%Jcrb`6{Xz+q-JXa zu0q<&^b;h1OdD%Cx6jPaENM?lN-9vB5YEjjaH_&Bn<<1zhoGD}78=hmdjxQPlXXYQG}2uq z2s8-V5!l4zGY-Ti7W`uXA;*;tmx^_b#ea?0u>TnV7Z{Xm1sH$|UvC9@5H3&$J3nhb zs}depa$CF@mRH~tOL&Z_Ai6E^FXUnfz5CHiz>QL`(JdTuCmu^-_~k$^FeE?2g?ym|8qy0kmw?ij#(K0(sSMi9s1ARQoh-TF{ z=Bm`*Ok?w?La;2lI$h1UxP?#!4B@X=-mhr{4>1bk3j4-qe8}OrD5z>Pfo3|?oN7Bb zR?=l8z`Gfvn)n9Vrt&p()H&8p)eBc@y0C*f)xge3txaWzztp1{`ylM;)Dko@byWSnY)v;mm`raH{z6M zGtN`3H(aYTO0dC&VQ9`=g$iQ^7s{KTD;Mh8dW2&@vSe&EZy9eJuf!Q$k${{m2RlgR zu@jjHbyk18@o7b`v7(X20J_(5M!hS*~-US%w z+T;e!Mva;;^S$NGs&Y+Ftu^6>b2u~TK6Am9e8v4YZc02eeD{{0%uXeZ9nNcG3)O(k zwe4D3^T&`*`_t-{3P!W1t{OpAPZ?z6Aq53hQXay_8SRK2NJVK?d1)ronvt!B?U+|~ z-h$;{RB7(0;E$+dWzml^jUs-ZnvDCf4UjjL*=b|7Z+!u{(|6u0G($cE+j}i(S`Jmg z)Z8uex~J~*#2idECTUARlBZ0uwe&lEq1H9>&CF>HW3UeU@VS=6?Be{Q?&Qs{g}j{A zPahimU}T}>bZ-yO2^VVp-O4MSUUK8CU5hGku%dO;--dl2y=u2ly7OsXYTUZ5{dAto zvk)Zb>yuwu-ZHL_J*l*cw}}~w9P*gBkcxhLyt;O(qOt}7eXRk9DA%Q5a;Xt_#@BsX zC93#9Lc-@xP)!xOZdqz!;J5V(Gf#i_0ym`HCZ#mK7`<4|mZ*h3o}!9enmx(Gg~>&$ zsZHho5FA{G)HBaoBUAoJzLL8v5bKEx$}fZxm<}Wt+Vz~ic!I?=f?L*I8i*mQaTo5G zcWM^4gJT-ytV6_&bDYGc=*7lwL>~V`C>6>9xvR~@W07V%FEqwPM?V(|m#%qP?!Cq? zKUVY)jFvjsw)EMOhbf3E#WXh)^BPs29C6qm8O6i72O|DPt=h}50I)(jsluxX)=BSI zA_-M0lGCcJEXIrYFFfDuTui}?SB=-(ftzC<9BP7RJ&H~!6nYO4mD6PxLV*gZ!bY9r z&Vtlx^7A#1rNt`%ovEj{6!uysa)dBVzvZtS2aLTVSwzM|s)AYwW*qaRUEUNjpNJl@ z(lNY_wNtvNCRbD?jWOrq5|1%9Mq*wh)a&stXjOQE@wTnxj!jQP-Pw&lSnHn%u_ zq{dpY{N%jAD29L1>Gg(JQH~G(QE8vQW z{Ro?+PoXJ_y_SY5XvLVd+9ZpDN(lz3&u5`Bka>fM1rq$!$ort5DwnJ*mjs_SR~@f; z@P1RAU{ClYhzp_;8|%$)o*3fV5VxG52&;4*R((&c9l*}Tuz-TOl(&rs1FzsOH+?X7K~grj;rg2bb=9K9*9j(EZ}ssgW+;3q`% z{kgwIGDfotk-#^>#R82La+??lZLG4w?}W6i7;V( z(bma?bisEax#*N_-tvol^(-j8gnHd9@8ZMsW9D7$1Gz6fb$s68l)4cm(b-<X^LMP(JgjbB;;A8{@JPrV8H# zUg3_#$O;;gNziiy8iDqLtu(vne*Qgfi2?VhFGJ@>+1zuRj?Z;(Aa&=S_gtoN=GP*U zgQ|$fY4^@$`=SaMp?*J^v5TOGnqrzxiDuROJbi!-YwO~V=EAY@Hzi%6O z)0?|l4Bw>rGrRq4Z)R7=GuBGQon$6)n@MRzd^-3<9G zETdGuOH3P4r=Ml@xWG2o zO0UQAu{i9jE?bW-I68HljZ~awRTwp&b+4hBL*U>N=E)P2G1kqR0#(HBAVNZRY0d>Y zhicy8KGnHSDE=mLZTEW1Y7)Z4V6--G8^hM^?;tDMB}rneG0cYq_~zB+?FOM(y`9f0 z!*8YaPs8X4ue~qI1MTRV;@e|RKFenrVA>&Ad7TkRY!tRo$#A34x;kF6 zjvW~X5}rf;D@cA^UFaPM-CY{I&?PHJk;+NcVi1q47*mWWN$Ne%= z15L*V<6|t=Jj*PJG|Y4lOQ*2ITx)Ax_j354LQf;Fi&`E3GRW#XwE>6!8WTjOmIht29xT33;rNzhw8MJPE@@g>&wDQ{G( zKi4Kk16filS%xtM(m^?2kAmFK=$R=>2Q{#j12kmD%ezig^H9E*>c)G&IWle3E<`tM zkPtyH&dr-x0H<)$&+t~kZHYS+dy+76x{!NgwBde`K)@)mXeWA zaZQ&mdK+ovdav|xJ55@RulAb(10oQu1nZadgd@&**2dL7wB*g6!*`Lr(Y`||t@9ZI z3D)WuR`XK7Me|wtsY_NQQIihx$n~OHWTG2V+*CBNRMlY`%0LcKtgE*SytLqKzK$=U zoIn5`Mfm@IY%zahp2#OH3OQ~2JzpKd2!+79qMzvgAn@;9!bkL1Z({__4R3#K@-}3k z2~|j$9Nv!BZchex zb~!c%jCxOWgAfzhfEwLj3%aGRB37w651$t1Y8a*ceFum}5D~^b;5X0wovRYOr5)** z{Th9d#^}JNiPeZqK~1)TOG_+9dw>NimjG`U&l8H~PkwU#zct~+74X zIIAE+-;X?cPjo(o!E4hby3`vq16!`jaWEyhhy&L4INmDZ;NT>886f%h!-kc~-}9f( zi8{xo{u#3r#MOSHYWC@%I)0&#<;M7HHV3%a@V%rBeJ2$@<5T%7zEV48Pm8K}KW!mW zaRPIA7L+Pc4hVHjhe947b_nfgkt+$se`9)ahPP@IK%n+eFKx=d%Llh3jyN zr+AI&``mMz&PwP8hXC`@(M%FlS&Q5xS$$C_6+V2VvcB7dM;{b~yc%9wSoOkM5Z?_L z|0Ycqwhz$a<$1y7P^&=XT-U~K8Q`&<>g(j+Y268JAA$vb@qqQ1tW4}(X+Nh`5i&U` zUI(?K+oFkFi|oWOFZB=TE2IyI7`TGbF@(x~-$Tq!b6HfA1%8NWUupAFAwi`zef|hf z80-7`=GQ)VN&6HnFh8B&AK4ePQ<42FD)EyNhTRCkdD+QIx!Z>Rz{%<%<3XZSaA)L~ z9I@8!n&d8e9LbXM^`Bj$KMD@V3Z|cA+pE&a-x9O_u+&5Rh{iYJCP9?K zf}SsK`sL^q4f!^M$vh_z$dbf9{nV=2XzAe+_#jeddfr>}0}f1T*(flT_h+jUZ>R}O zGZhRe?OIsCw1MMh(xTqPO#gVhKA!R=GWR$CUO7Av`}Prp)}pOTGa;AwoNOq4MRlob zi?Z(~L-pcW@cX0>jb8l&@w{R9JO%hDio1Pye26~M zeiEDdQtoXtr#?Xw;lNlH4C4Z1`!V8np>PlaBJdfeLV748`D}Uy9#tN-a&6!ol&gKW zGTKEp27OK3n$i7%UM{@&b0(?a71UmqRy}7zjgzm2I{T=ls!>Gp#;)w{ZBTS-+LX9R zeg$(*g9Q{f%WZ?%{#rBEUsnybLPnk3G<@nLAS_h;Y#hV<;Su2yAjN0kQE2qDA<9n~ z*gL`B%=2E!MnBj)y?uZNi3+Hkb%bx)aO3Lb*mlF&!50z!qQ7;Cq6L^QzN(qVitWD! z6y=|WTthYjIqNlyZhh(p=2~X>l~i8N1S%1TL^sBQ;m!B{ql%x4O^^4enE}awy3Udi z`h}H&HrDu!0jgZ&%kxhc8tZ>p>8byj~YfE)PxMy_27@?Za#VaeyTe>!^*-#%Q}rWQJPAK+kHPwd!pGskm3ALa{y ztN8Xw!ceD@{01VQ*u{*T^f?DypwkyE8KF_ON{d)EQ&qCJNFF$!`m;>OJFNE!MtoKG z@8eUA$#NZg_v$1bKuK{BJWlv)TGQ{}GqX17JXg4>JM3k~MZJ*ytd3?{>{anr3bX$Z zitbA~6#QGIBPy{u6|Ad)OOEk^rMCJx=EjcIUjr0W{*LF?D`N3V`IOXMuyVXEkR9@t z*)an%j22GD18w@rLirKytL}zWFQ!8TH9Tk^6&SwIq!!tNIB?l+t>}g60)ECPNW^2( z8}M-}{ov_A6-;i>#`uNNMtM_*Q+Z=|w$EHe*^zYOUiI+pKC&<)oZb!F3ipinfrWOH zS{F)sk$2f;h8~0RZ<_OSk63f_z10JwdBL|ihWq~z)c?))-o$!?3a3j8{uGG*EgmC( zfTuYn3HP)B|H7%h@w+6fGryOoz7MdZ@`s7ulb=WznNafXkM!~Q7oCYE7;IE{-GBKC z>oRdXP-ck9!%6H{)aqI0a7sepycoekyw)K7$K9;70W$JM-%%(P>y48_Lhv{NonOr6 zex7b#uOF*ss=bAdJW5JjQ(rBvH?%8Ix$ZmNRa(Pj5yD`pucBdf{ z$T87sx`nE0u~HfWtzZsq`25BUd@{I1N^RyJaj2ksvyus|4KPwsV-R(BY110srEqkk z9S;D@Q5~5r5t5hPVST`Yn;cy7%)CT!uXkK;Z zUR*2D;YDVrb6s$ldA(4MiGrKUW-_wGvkF-?8v(w$8ter4+$I>DlKl`5@&g~f3}hEy z)(z;&G=sPYn!#Z*I_T;kV!Gixc=Zwgb7YLIh3tiB`<1Ri63hCsax{CTFk`~an_MK% zyzf+0_z3u-QkB_BnfIXBZK#9RXX+qKf<-f@T}IyW&F4%iR=GQjY=*kh4xLgp&L6_` z=7>1>$&|>6p2->oPF5wS{X+vUzi8gRe+Cr%2}_3Y%fN$}k6$nG4v01=<;(=A(795e z(g?!?c`FRLDK1Lqi(y3O8g#01Dsy@C{r(lTtS6NKByz03C5^dzQ*4U-m?)iU;h>4cfli7t_I_3u+aH^cRgZEr6kaD z6+6NAi7T<**xPU>VfNN;TAizMC0jOR?2P3AMnbLYSJx@N&0z#lGc`2z=v;O9Lt6%; z)r3r4=!~5>j0eY%DCH1Nl^F#qX##YVEb3x%4%8U?zYYkBlm~Q`mCe12oT<;uPz_Cu zMoyfNIzaxGxB4{9!{kfgu7?Gul}~804J>Uj_&nc(x8HS#5 z$GXJqsoBEW>y08aGu6Rj#F7nTn~*46?{ioT?!FYzoH0%M(vmluO#)~yaa$9&t0^@{ zqKMs7F8oQlV$DJLjM$u{(}>A-o6Ebf&Q7JW$7#xr9?K95TQWZW3g+d`FzT+_)<{9G zK@wEV`sRS0zNjYWRMDvaz3Sc0iMjp4b|w?VsFIvaz*{%NZ45BKgr%R8+?wfCQJfF) zO}4fAUvM+>KM&O?4bQu8?yAlo5Vj+f5whQ!guS=AA$sbN$n|cvB`!H;jIX6~Mi~qr zaMG;AOnL=-5Gy;7r&mZ=t^QMj5ib5$J>;qXU{jt(=wq7{YlsA8$l{jmk4$YqSW8fZ zpWapBZPqbr))T2W&qMrVnBZ6`?-aM2n??$XCnoq1$fncZye51npCSj|ZfBn_L>Q1J z7Gqus{?`6Wc@J!+UXg~$cHgt*c(K&Cmz&)`L?=W;U#6@z9hRaHC|=B2K&0<*)M83; z{M?0FX8c-pNhOdbrvhm*&ebqz+p*Y= z%hRI#G^E*B#hm5~ZW0A2!2djTxoM$OiBs-19 zlWbJI%wmee%lsjgC)p&>d_<~G0c-H-|ExGEXY6-E)IlR2w-*<_Ptnn@E^i~?p>B#; zjUcZ^9cE|asLof~W_*sL+XLFd(C~NB#!CIYaUnaWKg0~X8esOtnVIC;!olLw{~<_t z5kyj?!?0jnf!icmjP^c-xVycd0ux%p$f( zU16E$eCGHEus@=>OQDkgkQfp~FAcooR5l2A7Sug1tXAs(im8)0ZU&Nr#iIc?ZVNf%{#ADpb#xN*bwfx7dxyDZeC~ z_+^jC)Y%!_Y<@o~}JXgkk8((OX8T@@g9)OO5&B7Ash0fA_qp#?!gZ8YnX*x_$o+qKqBH6-2dMB=yo0oGmM|7s zlH}|H0+MK!92opDZ4Id^(YQTMo2?xB4keZU5l%*gay-%$PNa%yZy02OSW}7zOyh`8S?zxaai=aq0d{3=Ysd6WT0=Uhrt*A)QwzTw3i0B| z43*;@n4y+YY;W>2Rd*&TdXXYr`U3kz6A07lW~qTzpbTs6Qg1;{9Y&&w>gL!+fnw;2 z!5)WqhkO>{Obh#-Yr1n1OJA_~ z{=iJHESbJb^#p4Jv6?mJTjS7ru&4s+Ywd!4hklg-gyvl1(P%A007&&)(u5eF2rMU| zt=QrwmYMijn5=#sY7zUZd_`sxfqi7fZ7@thU}ZUL*7JqPt~AgJ z->`&A+9>f%q0R`I@IM51^{~a4xR%q-9#f_^Z6n8DGo9ki0`4P{m2+if<;rFApZGMm zj0N;gz04A-D>F_xDrX~#DyG@e*0NR%0v+w16=49-4@(eR;7OiGH=iY)*Lj+`0vECEXV8M~s!^Zg4Ds+~g}p_` z8l=jqLaCyuPlGzxMxIEIQ(z2;}=PQv4Yoc9^;_UaKFC%xJB4l}Q6!_`M z9#xJ`k^Rc4n5=h5=&BY`QnzzbHKgL2nB7W14NPS`bHQh-RJzPtgkeZwSA_?NLh+Rq z@CbNBDWkXSmJZXsUb;?mJ(mC%wds2nD9AYj7vSyGNRo6AlN&Z2W+qD@n=um+-rxG0 zJK1>g$;NNeu!vS;aoHtRVs51c6_xm8OE>$@%45fowJcX>K$!yu0dzNfpRJ5@c%bUV znEj%x%DMv!tpRRmV?i-cAJmVPz?q-^jtSIFZFwc zBtE9pp0zNZA|QUoU645awgGg#2tp>wmZxck<@#u+MkO8W@$`Wp)e2%7C$m($gh&;i zCk{|lN~JBK7-YzI`w^00jZ0if)4u!F+)aw2MT(fJcHNvG#oC)3Eg16xpJQ8)nX!$+xJQ3~U5(ggq(TOs$G1t}>k%EbtmK0RVMtfC7(x%LDX;q6`*do)$7i8cxAp z8DKmw?C1r!K$Z7k>aDTK$B34({5=mEr2+Za{T1sHu8{xAPaXe5hb=qB;^y#6B$r{& zj_zOCMLnMgtS*42sa?z5((KZJzB-DB(cWF5VB?&QD(mrJZ&Z9R7A)Bpg!M>1IHW5s-PNa4guSeu5mN(WG2@O(!)R4A^N#<%ub;dcW z6k)E(pH3I4In-x9MHc~OT#w+Z5KZ;8D<-r0Bw_vOa2h_Lilq?UPGO)n|5sk}f$tw= zpoGmZFWWfUzCX&EQhC)EIc@4J{Ko$#Lac}vuMX5WLIkAaSFSyn7q55v0h+-0JFx~3 zGRQ3;Gq*=c@V_Z{>=Q4CCjeS1%9IBaHQ5*ud$5JbA~e}VN1&MK$N4pPhskDk|A()) zj*07kqd$k@?!|p@XmKg-3@(F9aT$ucTcNlNQlL14yK8ZW;!>=|DK5n+bf@3XZ?k{w zW|Nx`lKaO5Ztgtq^PKZK;%^Y$W1f}%v@QulK^ERtVWqC9(|Oc?{I8Ya;zUdo{T3W~ zAs8bUqrcJEBmmOVxe$#oA3sA1QxLjb#HR~bhzIHr&y*Vr%Q<3Hl0Nr_|x9 zN_JYaPh>zmzk!(~2?^0!q(@l&n_TLd+GkT0zA-*%l>(s?(T) zcF01DO4aD)J^x?VIKq^ggp0& z)=K6QGfU@}gX6fJ^W7W0>cM-x@3mF7iwxUTJ!jz^L^1GMG}((#@kKB#@!K?{gYaB= z)cM37RdcN#+vlInL;S9byKWZLY$EQQ$RwBV4sW$K@hGsqJCpTMUZ99S>sM!g^naQD zfgsL?N1|>*#eTv+TYeL&*QKSwDMh}gKCOk9EpMPp6`K3R^$*%s6@`7xQf_}?bi z`izsJQ`&#J$tYJqW&yxU?&xa0%@?uKNZwVXum4tt^E|m|>ZYmTvDy(T+Nm8Ln(ZB^KVM|pUF{y>jzh17PO>BCo+qbDS2v9aW*HG(s3)W zyQl0IG$OWGCQI>>64y$%%9!uzdzAVQLxt#A#?_yZj{fW9Wq|y$lA?6QP$<|1BY6sE zLDXp&0T}n(AW=Qg%gGxRCvOJFi(@&I_%>$HkWl&Lb%F*bonCbdD!vV_r7;v?xF9Rx zYXUEGDkHg1kS0ja(>sn%BuP2B4EkOOx?ijFwk&f=rHR+1zFDsI(sM$JgemUqM4GZ` z+Wyc0EWz4Q!nsZc6k=On7n}w|ID0>qDex&@(eFTfri@M>VsiCy6pU~AV7v3q z=aKmZuiI;BUQ<$H&KldVqy3c66y%$nM|d)wKnn?DauixmDj z|3@1=YV{;2@cTwmZIZnBhuzBo{!CWMSCWE)#O<3Rg}eXHZV1Ux{71m6_1a_Qpk=*M zim0^0bTgdo{1fXjWON4V10>tE8X3r=TrB6Au#2N^nNzh;iq9`b0kcfRC1CN73Xr;G zsKxn226dDj=5WZpUyGb0zDA=q&^4NX<*N;Tgy!hPZpyGa5Gs6}Zrrp#e|Oi=8R-Tw z`SdM=ob-_Ea?k27V6P>CLbp4un$?|>KXLeV)uJ+gV(V@BGiZ69SXM|ev`-J2;>u;c z9JouFJUe$qA%S?GAE&0IZetsftzB(1`(-s_vqDGcyS=l|);2&0u>%(e# z0^h#8zl_mkvhJf#wUpmea01s|r*9yvK56_U(JMg3(W8O2m?~i{94fo z=hGM=<009-ObK`HrnfQm#0>0bXFA_747;iaTLtZk;PHn)aMOHN!(vGVLBn>Kq9$uL zvaW{w{_uR`KR0U233Z;$qu{3ya!2aAE1*L_b4_cP`)>*vLdtM9;!pAxXuF&cu+K=m z$?AR58LG!IgnY-NA}o40X+)K>COOqYaU+s*uYFxj9v6wa!hgBfe!L|$fi!Qt zbz|ft=14=HLX@wPWc-}ccexvya!q40|0$~06H{+PDKR7_E%sxcKMA&kuRS#rhiS&C zYNGON>{4501RhGVea30(sg|a!)EDty0vF-w+zd*j*d*a3Q5`hb(t5At=N$HdZ{uK0 zhk=QOWXfjLLE@>Ua=Ep|zkpBa*-5QRCb1?=0;g_A;;I7-eH*Pw+~25}6Y~c4^2=4T z(t=4b`j!@%(yFn8tn-EabF{0N?V5MLz1PuN3yx6|ll~Toc^sDnBaGifro7xKwB8Tt z2oV-Os?2^^u1>HOuv5RV*QKyQUMs)95u@y#Dw=`LhPpM5HWTrL(?1%x)|E3jEr~{w z{{D?P>^j_bHKx~jDmZZJI&rwD5bpxdOZ3DmrK^h7Y58qrtzLA=YYks2Zp&JkHwk@k z={1YgP7%!rWyAwz&d04yxLNo&~_(My;lZl%2pO zz5|TbfCnBw|F+zfE+2dFb)ah(7PI6iJ1?;^By-;AJVCCKa!jB&>xq*U+_DK1NET?E z>aCNkDM+=#50PXLGjuJ6%e~(43N24Y@N5Ww`H5vJ;wMf)K{<{KV)y+&K12Ss=d~_p z%i|MY`!5-FIF0s=_^MP(=NUs1-f>CG>Hst@Pn|%(demwz8}Awzkn>gW zA>K8op+g(rxsF99$76(^r(A_}1*2oQ`#dolbE4}*3#%t3F)})*b|NQNo-?lJ$SS~d zv3hutdO<@|g4tNzfG7BwTqjzgv;*72f!rS7b7|SNVWFAIQ?%)v`otNDAw+Q<7VHh6 z5yuI9H0=@vId2r$M2sqxArCeDsm9*DLhP?<@jHKtnW&8;yQ5!Ik~Cr}?q5lVsdqEw?D; zVqXpt8(YK5N{{8;1;s;=+|4=aqM_X-L}%Kc52>EyFIMteR|-qLy_14V^n$Uc-e>Qf z#0mJWI}}XDd|Wm zPG0DT1TSS6XcQF?M{{MbH4T@kNSAW6gzn=2=N) zG)kUq9(la6+>G&WelaTeaYA?jM=Mkab_5Q#MP&34<2Vkb_&I4XyYx`hk-83D#qW}$ zxZv0Go_Rx@3J)Rj-^+`P2^&gYTLM2+aY=3Ng!vw;_?q)bSl+5dBMgUJ@;&t46MkXYIs|r-l=4ekZqvy6?4{v;5m>AZ8Iu!MTb_ji>B2nT`l1TMW zwqi^hy0>SCKkoIX4%vulio%;lscBI=hsWnJJTf*^=NmDH!i7mN zA1@Jhefyt-i(n%F6s+iU-Du3ge|AVrHKp`m_*30mansi+ujntpy`ObMufJyCI;tLm z#%N5LU5R4sv|60{#zm7SpG(LB2R9d9VhOj|UVN&spNSAzT&PHuGv>B%zbgAs#ThX+ z1vCziquhdf+a*Q*OFb}8joNS6uE#r=%^E6&`NyB#Xj5ty^7?^ilg{}~RE}zYt^L}3 zKe(vQKpe)GRA!rkasnz~wZ)_%-gUr#4mX0LE>#&m8${w3TSwwqLS4&QlwmKmpYsZB^%Y;oqDf{*^ z=+%&)KTN3GJc2($+aBE2BP&e=66b@0z0|EdG{Lpu*!?)YKhA)LA*|^^^Se zYcwu`j2xp;2`ZTeZkX58o(J=3fY&Cgk9+t$CYy;O9b0* zN-aq*2LL2QhGZ9>*XnK)rF%w71F!!A{_sNT^ea6+_u&o<4Tb60f5F~nw&TCqhq{VZ zuP1DMd|~wJh=NtjKZ3!)JB(jS|X}#mx8-MAAA6euPef{5Zx6dwO5L?l0y1K4YplyY12ideK@}ZLWd^rSNo;`W_1k6=Bb@5; zF3meg!(V^_tm@I?02|qpGL4@&%j*ejM_;!%6W>tS4ozTLN_el7tFIOC?Nw3A@aZ~w zxf@CS@HVuG1sFk8P78&Vp|D}NV6rl1qXLt^pI{ff6`-&)Z=+q5s@Xd(bFuGDLWqu) zwNKcwi+K9?f}$MmHWdlN3fZ`bH56BS}SM`;;+M69ej{maVD#o?|$RV z23tm-T2mv4tR`n$hNgm~!}QhvMxpLgxduxuN57GG*`6xw?s!g>n|cj3;$yTq@4g5H zF8u}IWj*O1RtiLPPY@3$f(%y&%%S8MENs;a?fL12ES0n+kZ9JC&29W4M(Oi-7=d3B zn1_=>WOjv&wf$i?-|t(KbbTMf%+N>`APi89PK44w7d$6cB+O=wk#@A+5uUn`qP5n- zL6gH`K@O`{4m4JEdkJvkh}WYSi8}B^L3EZP=X0xahw-EOi_wq$CT%I#^+3?;K;K2b z@KFwrij(-kiPqDdpS>VHOE#ZPxpsrnxR4d}vrzv_O z4y2j+w8}M?Vi-2U^;QL1waUk8Q_807zAtKI7~&TeC+Ymf-cj`pA`_t4agASC))Ug}cVx9`_1bHn zHAqSg;O!F4p5{50txXolkP0S4w-Z98N9FKD_M>{(W!>eMJJJlH^5Hjc+q8DA+$)`C zr4$Gb)^Z^r%xo2Et>Yg_>m2HC>hJoFO0dJ>Qsoc$GI_}!uL2^GE>sPNf zILeu|D!V3xz}#2D#@Mvy7brx%eO_a%ebfP`dJ2sDeJK{>RMn6CNgo(-*fM+l+1lb1 zoijF?HNHNz=F?m5Fc+p0yqEF1x>k$?dgy^CA{nce45e&mUP~bMN+*spCL)akJ0Ye+ zUG^YpZA7@t(;S!})b%v!*4)*E-=tQ>>s${)CE}Q#rxQGoRT#!@TIP|90eMt*7)@Ka zSX((L@q?7h@hx0E{%&%WW{w-R`PjE~^2h#Rh3MNiWaVuaYahuY{A0f)NHG)PH{4Zi~~)C)rv)|yZZNTHMMq5vkETN6*@1hdZ;yI zW-%Qg7;M9|jNV`o##XHJ)z&vUJ}y##iLyXCEEESo8wUA+h7{&`OkT4}if;Vl3Qa2r zm{ia|CF+-%&sH|(WZPonGw`TR-UXEbYHem5*+f&8Y=4TH+Lq15|IC=7rE^wB4KI}i zH#6y$X{pn{tv;MMu#6XRtte@oo8u2m4>QU!k%32D&H2w#VHi-Zvanpg3dIURp;C<9 zu0BRaOI)C&igK}TO$f<3jcKplh;21ODmdx$T}%j7&CI-K0YnO7%fJbvMjrRExGjSg}M z3}e}i9#FKKTMzL_y;|6 z!3}kIHI!#W^$MzTqMB1-J{kK449Qj=p7E1X3~~9`*~4owVO>|CLgNsbB+R2#hh-$o z`ZsI~r34;Fa}U^B?^nJ|mnW`OS?A_Os57W3b_!pdzv`o$_WYkhquygvTY%+FyxlZ`+G1%Tcg z#Oxj)r(IN5;cw@izE&~I?_>qK&>h_Y4nOlw`aujd3anfykj+lov}$vzV1#X4y0o}Y z>SDy0&xS9^FND{L2}U2-aELFvUV%^KRHGMY{TYmuwuzyTx1+l8Y#PgAd8#GgyCYt~8qsYRqC1!5Y;Ro@5 z9BqZE`hP#sV*vQ_%J-FpJWhan9_g?9q>kJ$`)FKhz%Y*c zfjIXgu9)M0kpu>l|55?Cu5+66wdGnef=!B&&fj;#bGaXF8GbCo{Y;2{Cq_=3*XvxR z_ZI~iseqxly%5GWQZ2M6LOAX~DxvWf?92Q#{QM7_>!IpkqNlbXi18^sXLO~9QG3eU zHUVLWc?@_^DL-R8-JQl97OEcmbF@4rSfL1f8|7Hp0zABrk;lSOrv_UEnJ0+1KTrQ8 zog2%%YwW%eGU^SePT{I|QQ&Kh4n1Um(#yuSk{$@d70u))k9Y8MJv;?2YKW;c11C-C zZD@$2@arM=QNkfmcgM2ZbU{ZmwH^5Z=<(m-PFhY_ab-;=>!F!%u@?Xc0X@CEaJ_3P zu=u614;9y}NKJhjM}Hc`eH}}-_C7Mly_U^BDnB<1YD*)+{zhS9cP9?c|7h*eWwnEI zO-j#Ma0xL=nCsKd3T&FJQhKc?TC@EsSKfzi2$yV@v_Z)248h!;nPKgWL{z10ylrqv z@AsTaU}J1lU=sM?1a$_Fl)93-tjUbt@-7DMtOOW;A;5iaZ1lLHyoNJ7Lpp1xbGW@m zKG5nGp+eU?OhFsTyuKM1I(H&$Fjl11U03aB{&S!#j%KCevnaA*Hs2L}{+;#?lYLQH zex0IyA##xvK!*`zH9{FIb=`M?e)Yr!d;tN_g-=zPp zX0>k~Yyi)xgYjXR6Y_{1C*mL)w&Yu+XB7JkEwKDiXpJmoo7B~Jed!20vd>xyu8(%^ zr7gN&M(q5pOU!%hi==c-bF9}0^3&eWE9{WLwNzYDN-NtMdpIf!4r3Jam?6)#ZAj{a zsI;Cfr1SyFk7btklfF%Fe`)huJ*O&CoLL}eb_SX9vlE2RrYki|8Zy>o2-klO7AK{#a}sd$9p;vBL`I)7p6hA%!Ko`eojlRx z%)&b32guyR+@s>$N$-AtEpJ&;KLNg4LOvdQ^PH3EXEXUdit!-y4SN^)j@BY28e#>f zP3U}J&%9^7)&eJx!fV)gIJbzX*VN?mUqHvs-cB4fO0vrJ`EaLyIa{}_$LlGy)q5z9 z)|c*nu=tpUQq5Ag?&8rb*&mHR3ijQzhP(bm<+@sADh||hu#*qj9PxB(iBI}T?svzF zVr18Pug$0E@A!U*)C_8fpztGawAt>6_&cN9Yz%^Sn^LAeRX^3dpm?Y3puWFjs;J0f zd#qp&NVo*rXAHWgyEXw1BB^%?6e%A@ip)pN#sF9i^FxXnr>=wER+0(YxTw@__XD4r zFc%h@A0nqNwb_o@9Blov#&&akaZC-28@cafgJp zz)nC*oe^=2 zvR@^k9!)N%pG-tW3BNj4ML8 z@w{AWt1^i?XaJfBoU`|z|FpQ>1Hm@;U1-)`Fm|v_RZ>Q46&TcW{Qezh@gPJzBq)a? zW5j?DDHo8tRGYqkjv|Aj|AZk`qC`@Yqne843C5@SZ-HF?Kesq{9b_#cJ`SF6i7l{< zX4#iuK+G8;i~fEP!W}vSpkabjpa0cGeELM)(S#V^ILmvU8WUL9_vgl2s@n03I^vBd`#;s|2^}r5NVATf@#~G&iLHmSo1uxk?R9S%T{aoCt4$w+t@1-tSy<7lI zG1=dxhkpZYsh8ej zwxqw0I*I>$@}yVbi5t=)wg-A)5C>UKulP#T9Xk&FVf({;h&Oi)e~{{)n@{59c8ibo zl+t6d*c!)eAIOr-(^jGZvPv!c1IVQ7!oT9k%o2mYPpsYs7%^AB*q3<49M`5lc;R# zsc(W6=v|f>o~UB4wj%s#E(af1Le6wNiErk|bo6u>R7J1q?HQB5H}VpmDN|YkumD`| z2q;+h;46?*{4BAWi|38~!$lce;T@Xeg}DAQ2R4>sr7YpyutFwm%DQ%t=I5l*Uoz#R zh~n@pe7!MTZT5IkLQBJd%_DB!49eh|KmL-b-b%0Bpa`B zhsvvmxyW#ngcSY zSfVxq+AK$F{ck}L7RWB$=Lg5p(qLfaE@d1g;%szA`iMl;0Q%G9+v!YKjL+;BdL2(I4*9UrboTU#mhM5DxyT$gz-XtgIPZ#rER0h%3(g z!a}`=HiH6XKk1U(Mm;RKC<2(px28w&3jDaRnVa&Wb||#|RfoiRj}lPzZpG(#`1wlb zlX4Z&{CoSdKMi&r&%5`@Gg)sHrY}}5ejBD5LNZ=R+Wm%O6epki+hsc;EM>=dD7oV) zw0|7se^V_kXloT3n3X`=iE;-swfw+`?1T4;B7f9QM<`^3zg4AH7LIMxk;*>x*`rg& ze*9@1scxvu`2#9XXQiKGrDFq+J)UAG@P%LiO$>ljAaB*hfhDAuS)n$;Um17w(|vUm33ihYDgxKp^g z_xQX)S@~v(Aq9yGM?c!lZF;FJefrxWrPoyIwjoGytIle319&TtcEcko8^=A}Ficja zOcsbwuhD-hJxi%q5ao@Y6K#sNeuc#{Rd=pg6Zvo-?MOCLu0SlRBtxb(Om^)aX{3q)$jv+l4vTfUCl zYf6wO4awv;i^;?nT_z3dy+sBlYW`v1DyRWhg zKj|cVKHfKJQxN}v=n)EdUtJ*{bw-6-jWRsQ2$OL{L}MA6>}k3U6Hnq53MwzN?e%kb z#hjr<+QrMTy2KnT1T@)Qy^-VyciL9w?qmEYON@r9g493y!`XHlsnxM_3u`ixRQHg< z?+Nzlh-8^lNTT&GVC8&;)xSBg=uEu1khAcEC)b1&HrQYH_j`4Ei9MI0(*^giswz{~ zlIX$&5P@*x!H-No#c~z8#$6%;hsUNe=g4Uff649-*Zc{Ivo!Kh*TIt`-P(OEyZ6!y z5Q1ktpWFG4=P}~z+aEvdGR$8%O(V1Adl$KR(;2EV0Q{$kY*B z?Ku9t-I`&auSv{d4dSaK!O!T`icu+g%WA7@T}a6Mh*KB9Y_u#Jsn&Hw?BnO~J2rpoTeGT8^Rh|#B=E)jM-f^lg9 zP%%T}6m#hOyfdDTFx-CC)DrYu?dfPW@VFi^ZGGiU?&||Sx6z}9#bW=!P@;%Hx~|k% zCi}IoRL|EBF<|)`2vs1`VsQ&55C?rs7Ffg*8|CGxPM((#fIOgXsd^aUE1@vFI}*M8 z+SKjc)1J6?imDCs46}E5lM5}GwU~Y9l+dUKHae*ICO38IR*`_=Cno8vLrjdfpf{nX z=bkZo-2mg$w4r7)vieYkUFcF${A_iM`(oaqhK{&`xZGNa#jX?D0Ug;uZ7`k7%}irm zIR+P2%5|XIzU@!~1-)?~p16-2hIXGASPH&3{OMg>#8nAKA5$_QNXR+NB_$|K0`aTL z|B`cOYf`h4{HoF4&v^=)(TDvgXd`j0-okKAhh3)@D-f(jBUR^ZA^Lwhz&h7xFg$G# z1500Fy0v%cz0hTq@1+SO*KzS3O^p&RXw`ujCU?v7bxk7F!b(=9**B0?IjJg| zw{q-kO8I70c`MoB_x#a_8>Z%IcdY*l5K2leOU_K)G4K<=U@b9k6z!tVDR}dmiUW3( zXJ?(^b+(5Ka>ZL~+K_9h@iU;~$LEe85)P|jwJ3)c3L}oHH1f{p%+3K}#i9z!KKm=6 zbkc<(I+X4Qbd-{U=|F|oVY57Xj15XS7Xyx0&@Cd@uIbL&riDt(zG8u<8i$~g`74wB zin^hW1ACCYby@6XcTRU$LdlO>+N^|zqS@AYbv;%PLMbi>9W^*rJe+e*_MnUzKQj#H z;wv`7yVww1OBJzdUO~=T;)I-$?t2Hwso_^&=?$5Rn#Zq&u(rj8BeGu}LAjAJcb@#j zdYGPtV~T07CR7qRG__}=k8;8$40x9w;T7e!Pa|N6ywG@GnKI|G&o0mo1EoU?$`kK_EYlk@=JYxe3Ia zOVzRP2_~)JhqthE@vKNqYLhS3G0->pZ{3hlJR$N8(OShAT4}86R$=O9xEZI>)IE~N zr^KFxof}moY?WfoW|g@WOE-e=&^F78ilMgY2Wqxq2}KVTX>Jl*(mGWo43zck6_hlJ zURF!=T$;RZITIRE84xK*a8XIi%Av`hqVkK=gv{c%cTs!}FP|w^zlhK*(;M1&qv;pJ_9O}?s!7ywjM;(a1z1og^q(b7T zf8Dy6QE9jBXH-}%0-mgkjNt_m!0kabKBY>&J2-W4$d|LUeL!LK z411iI`);0{L&|bw7iphP3&^9pxI>Fkj&QBU6$EnAbrmB@KZF!|MieI?Lv*HttEvK8l!Xl%lFn*sn{z&25OD*;aJCh{2T<;Y{PP;3_5)~R z!-VIDiNSMh+g~n8?Y^?oKdeIBkJ-pDRN55#>o}P#AJoSO8z{9fsY^t=ZjX_OSf10~ z%ed;k{8@e1jO8gM6<1$Y31QAaom1$-P!iyiGF$~@BS$3{N#0%@PUs?Abuy+e%jL-;UXxL^G zHrf%I)3}wfDxb^W6b)#*$r&0QhXbF7uCp4R|(C|jOBCX_!&`xBg zYwu;CrTR{#NEM&eq3|aAUp65AE-(KtfacE)eI#6%r{cj4!&Pwp5AXlaZ7Y7$WFgG6 zLplb(=ZXrkqsXf4hBUbV$rmZ;s{_eD`s~iT*K}3Q#&4ga47&cv+h%|+{6`g&8zHq&DhRMr_3gQf*#z^VvW8zw1x1Oh z{LtD3be(WfAY+vcuX2bB51(nvA<)~9oPS%R+cVB~nDGA zSV26X9_Awz28y!^Lw{(D^Y>__v1heip|d{jFm1k<5~vQUmv*V&m++5EHI30w3!e1f zco?dzS~O`smFrRlD#4N0uMOzFjM3bn?AfKMDbl7*0fa|{54;lAg*^H+ zhIT$y-%@&msx!}rDa=l;&3me>Y)>0}Y!)nu6L+*Y-@*(z8A}Uem`i1_`nftkCVx`% ziVJy?qA_kkyHHtiYfM2q^r_H#9mJOkb*MC~?N9THv)tYyR8is8wubHdjAVKo8xS3G z3S82fjn5{bSx?Pp+pga;h#q8nxTb8}K?|mRe4_IIof%U`!#6FS{)h_{E-VrW9G?z* zw~)~%&U%SMhhMq$H9pVC2cOzVxDINLc)hEd)=ejDbaCnr>RqkpB86d0}I!m zcQ$GfiHA>rikVj(AuQ<$cF=7q4(ZL4vdQz-h2e;ssqu#AiOD92b`{q>e!uEAiF;R+ zn7eZS+k5cg*`4oCK}+F)V^=@K4hxvvi6Ov~D`bYEE-V_Cn18vf*u}xRY)vPB;0e-% z*voSz;yAgG(WCT5k(V3FC>E64>Kvv9O4L8 z%Mh=&o(D!ij6%^J#QDoRsK%|edDL&QO5Rg|-Y>^JbLWY1h);i2^SF$ZjPQs3+xRbx z4}=sX&e$fFE>9Z(D&Xg%izqamDACF-q!vzQpB|Ou0j%+e6doRP6t$&|l(bcJVOre7 zFbiv?=RwZ*o@{!dTuA$~>1lU(LN1T4v)3q06LNV9@LiI}YCL`0BAQ7$+6st(m=T2V zg*gr(?Lc@;g0oE@E%i>3Dks3B`HamB%QUko`qvRlr$%T=Cb&~O{B;7qw`=9OGbcYH zIXk3Ye={xu7mtQE>CMIn1JwNhaqOr(8d~eo!*+48vn(IJ=M_W^u!nMY9|lXjDT`-x z=Osy(J`1QfPdPo$yE~}(rx9``AjBMy9vm;?Gt|-E)4pWi&@23aDK2Kjcco7tOxKC4 zBd*2W&_-!0m}tt0dh&S^%&QVwn;4`f1(YLgh4zjL{{>K2_KkpB+t7D;cM*;dYfy(j zt4x1Y=)U1pKfP|Mma6!$3Qcodjbz!X`9QBrj7ijv>SPkk2B zE&py*hUP{Pt6kdQTOQBnUl11Z(B<{zh3~!bPjbs^WF;^Zh&Nqmd@B~7n!=2~?dfzk zcOnPL8TMa5=c()1Z~B3XM3R%|64=uq=0Xy- z{J(9GNnCq;!Be(oc%LlO`sjlzr#7KCMdzKP+0~lku(EEh4)=%@W(ZY~l`#9Z0D_U3 z5c8BIYW_YG2%gG}ABlhYPz?VUqFw?mZCz@Xm>V1DLdTe0EdroJi9PMWzX0u-B#%IN zXz$>A@?-GjLNo;ns<6;=?_Yp;!{B$q|E*eGX~!K>*xxQ8OHM*?$8&Wm29` z=wxf0pYnywTBp^!%v!3=S|hL6;(~-Ng;M9BXjmtQQ!_7Eo$5pCLQLJ#|0r$Zy%bc~HHhu?!-vz?GmCzo=XneA;!0&rjEqfh2gl5Wlk(s!4DZ!!l z-u}*24rhiUTQw!@y4kRli#ypuUsmWAy(~cmyF-JV=&ieMP1B8RqG66^OPT0(Co3o; z72Oa@d;vw+ksj{y?Q(5wP)=Lz+`;ybKR;u4&3&5Octqt-uffXbx`P6Dx^ z>wDpZznw;3vRxM)q%YuLsR)L1Sm_`dBwP0Fx*^FOn0QmgGg1=a`yj7BH7eO~;Pb=t zBi{e{OAslN(7Mz5^pD!Ggu7EKFicCh?s~}li*f412QHDhg|}}&?;&}+!%L)3>8n_9k9mQm;MdoW|>8Pn-)o-;P8RWy^hHWzc`8+&>V)9mSLXzR(oR^P%D95bTt#MqYt zp_V$t>sEeIspA!Uw^3F`#cG_a(zCs4Q;K7|N3ry#i8D zS3V1`CH0Yn?lvNx-yKbBc?L9Y!Tq`wJFBqJvWQ4&1yEX9 zxgj7H?`urFoHD-mAb8t1)f_3t6##-4q#RRd{y1OdY4GdBmL5_!BGg`B&(%2KtKq+h2_Y%E0BtVvAM|-sTtgZ1e0+5E5LJ=wf(oTX=;Zcg)y(41irlPSFx67f_)cHiq?QP?Kz>vTe-uluaaNBrlXnJ>N;@ckiN^FLUf^) zx_Bu)t1_Ny+#x_qyW=ZAOL0}pm``Osv?QUdSYOh0pQ!N&@2HPtP`&xn$eMCVy7-c7 zPeotgPyP5)s<+?IiK+hrK-4X{mo-hprPWKpah2s=5aQ09j`0m`9T6~i@n@N#eQqHy zE0fVTq??w0GUn>s$eJom_DL*Ri=aKb&wO_a*&?>5{N*d?(wB9(r$Rm%T}egNhkA6K zxk+?Xva?Du=}1YG`0cr>gXXQT%Il@#5Sq%EX|wS^BRRjq2x2aEEJDUa^(c@sBuer} z^XZ^L{rYi%29NwDX8F~^yuH7pEb+UT6TI}8oNS(1?QuA2`%9TdeS~Hdv7tQh^!Uql ztYfY91ePd0QN2m8iLQj1zx4E)kAH&z>8iW`_i|S9av;jSeV`)w_nxDQwSdN3XBqt_ zd1!&6O-WI4^UNBH#X~Gl717LKR5eHAG%xa~uG^V@9f!A17hG-0IGmpsvVHg*^)cRP zRfEWRTgfX6~45RP$;^)rN)`6VFyWFM8EqPD)6dahPwwFOK(V z(zf;p8dxPwbAqf;@&P+ClmD?UEL%MUb{?;GNHJ-=*oEZN{#=$vPVV=IQv#I+=eL68 ziG+QGSk~Sjp8Tk0>&Jx>ve$(bJpBz}Yg&yUU^N5WQ{3^G=BY{-L+|e_ef#R-B3Q|h zLsWLB89y#8P62hxP|8y2`vShkdTB{FwA$xq;jLd^Z`sd&4PC0hlv7}8jJ*lxd!!q< zfB90b+9TncVgk7q1x<9hoZVtH87C1un9Hg#K8ct!DRn$ciO{8pexIAulE@24=|Et+ zmjvFLqGVKI>NddrGi9=TlM+X#Ry;*efsuNt^(uX+S)Vo z<*IBeLy^%9&FqAyN^0UY*=5$hqx-)XIeDfv`Y*sX9!hU5bIHRLna*wbFd7moWgWv> z<#yB}lfFe+RB6d1vCi%rDI}W@Aqt~gVNJOMebeB7-`!u~_7Q1TNyV3=;;=73{{!h zYGZhIlLnr7ew*^%(rL^;;BE$LZYg-)FA0h^7#AI;VV$v?glFkbV;&c#j(EK586f*) zdft5JuzAUOn~N>zQrok3emi09zNr7E`a^lg2E>ues3xhGu`si=w4%hoMkC=hx*+UC z7tg}L&`O~tZi)Lxy1{@23wdF!i;UGE3jriW-@k4V__Gx$*|03++vH-rz3FPt;lxy7 zWZ2Q%>{L@~GZFs{$yiHlM4DM?I)#$P3!5y&=K!k?ETt04ZdVk|WKHzzP*=1=?~Es2 zZ1uS4{;E^zJ0TSju{PFi8h!SSJHOGyI!o9oxS&2SfroC>VpH808O;kb{R4EymumjN7?{JNyV6T7`>mH}6}frx^xoBzZ|3EvjkOD>DD6T~th5hQ(b+iQ%|8#8+UG$1g<0 z6e>&oLf9lM&%&!bjr&4wFu;Xep2c!>kb*+1^)Y4~r?fI-Q*9u3_BK+o$Ko@%t^n~a zXneZoVBq^I#LrU4mgTosO^G6ta4e75XE+1Yn@sPD0!H-W!)<&=md4BWp=%s^<}T0x ziV^SjJQ1oSVzFt66bsNAKpZ*@sVZ^h7$JkTeaDspw|$TMJ}Z6cr>r)RDUtT`Dn5j+ z1YA)587C_l3m8hfZuia7rZj9{o>o>!`Ay;Am9B4|uMWBslyjsv0lNKyV@8!v@-q*2=4Ii;$dsN-9#s4fua)6mt)+@B0=50W-2Qo1XgZ`wXD zbW8>rRo~Rr8rC(do0J{ylt4-dRx>}G;q?{d*4gNb@)Tie9z%CGDfknPJaBNeIw|-t z{0UO_=2}2AjU=bK01`!qetvz%7!K)FIcg>Dxv(qiqtW={oaAnhO5V-wk^)t!{M^Sz zXB^58u~wZbY62cE>TW~yLq1Iv0uMFv#liQ30poC6i1XCFy&Ka7hz`+cyZof z7Lv$8!^2Zp8Q*LJoc82f<~qs0`Wtyps~$XLsW#0Txn3(A&XBUDXrTRv{iKT~#e+pmv>tOvu!4vO>LS9N^wZ!oCf=lYjp`2g zanwvP=S%_))@EElV9E@|cs{uHBcr;|W2s1&BOF$v=Abfzg(7n-R%S^-U6Hr(2FZd> z;(o#)dZOcdnYl<5Gg8obBKBeo3rxiZ=2#bY-=UOMIX=(V$duh^p-k{h`h^iP|b0uh+hNyjT9?T}C2E{NnnLzXHbq`{1Vb3+Wbo)N`|OsY&hcHGV+IUA{_3gp$$rP zFGdn2wi(HNm%(aiJRHNTBk?L9q7M?>S=C-HL?Go{)z`|y-iP%cqUE zblj0lZzyfBg|&M$_Q}Z8yTdPjd&I)l5Yn0 z1CXkyxDN6Ux^DC56;DhQF$PWz#`1+>xF$N0^dwPpO3*0Wmtb4VQ}9)`yBjVq&;38bYHMo zp@1OCRJx)|_!lO~|MvgXTyvZ#vZuP8!{5*DHwT1?zsqs(KK23p0hj>H|AI0`;Fobn za8W5sa*IQINdy6~O=xcZ-ZTe+-S<=E1S}gDb(jzM-_s&UhN2B{&siBC$KDJ?W;N2A zH(A$|eWrykhmQ?4HV!l%gN29gq?1xcp1CKl{-C5(&V|#S+2(fo@1xRrf>X}YCU{L^ z)3Aj93>SXO`J>WoTVBrA@?LqAoG2#RduUF;Y|8W5-)2~ALgkH2f)AE#tLt=YCp%h3 z`tuosirB2v)%RVeg)dEpRX3QWp#`~Q5So<)kO=8hmx4wjSa3K&NH0TSG?d zjzD^!<6f25UZ$t!SJ|5K+prGb&i_#ME+!avwh6fzwWv z;v6qI;0hNSyocQ){r=wWiT=TS@h)g<=yzF3QR`9YC~m7~s4PMpnH$O8g&ZdN%9h8Z z@`Gf!Y#80P~PLKLd3dN=QpL?QDd49@7IPnE8%}nL~ELjQJ{JA#x+kKdbEE{Da}=MmQydr>~z%PSi10%?DrU&$av< zV@)U|D=vXr3v(id3qls^UZ1p<-aF+M(rRl8p^#nSHE?CSi5a;myctf+?XVjEXe*Tr zr?q(i=|J!+TbL5Ompb8*ULXj`U>-xqEWs1Xo`+U>&4*E>{2Q$K}6%yLq?yT z4A5Yr2?iXRegE-&7J4eD-$W(S!d~5Sxm+T#?_%)S&?eDfT`du)i$QcNr3w*vyXT&m z{TJp}_be!AkFjy%zT^1oXTt|YXl1Fdps4s+;GZz3hwAHqa^L8qql}g1TAYdV`*bj8 z>$ChHixNGUvB&&-o$rAGE=}S!CG_CYuF(1BBOx#cn&;6$ZA)h6cDAK_Ms$M8Y)5D&dBLD1ra?n`*zlRk zcX1dTf|R5f-oq_wwRbU%YwfZEf;5m#>f~ZUf5$A|2HVfYIL_^;!A_K-i-|>uo0JW&gamFYzHDt?jO7A92qQWF{E2<+lJXhzKDf}p zPddV%KwsEd+U8@$Vtw=nWvga|*6Q0S3yXd#^PboP*xsRl(4JJ}-$Un{ci#I0wu`#4 zzxcud(-%nUuIMuxjjcfbj2EETQ9ajUVDN#CPuLXu{ z6ISFS{E$$JsT#d#<%^MvC?a~h)wk8A7JJ{IpyC-1E#My@Igp|T1b9_Pcd;aCh@M}* z&O=L8Znb=9PUC`VM1hH;M%ic1^YoRk>k>8pQDkDe^BEX(0X=aRn{u_kis|&z1^#2j zsmc{{_9p;sZ@N1s*MV7;k+p{SaM_VNHIXP7q5eU>06xJ))#C9*KX~^UbJ25gau#HuP z_^D%HZIsO3Yf;y*=n&HV4qqA6#c-q}3na31z|#@dLwE7HoL1j4hm!eBc|U-T^fQ-1 zo}ag^9=aW`9|1>#I70m+G@%^+ThExE9&Zhy-f}EkU-u##@*d22Xw7^b4v&>)445<9 zbmtH%Nau=NK0t+O3dXIn>Re*G539B%uA~}6#VZ?ecnC=J0wRA11rMqgNoeKEo@vzd z;$tZy1I*X&I-1&p6j_8S+D^$(eWeUt%cvCz>7=U5wR6RBvg*ipP2V%dP9ZnFo`l!^ zU%3DuvKj3y!M*JZ+>Mu;b&up3&c0Bh9)Q2xI$exuLt&zo$a#A?yQ@JEKlhKsnsRX-bai!sVIe}$1JL&bbC)lwIac8EJVf0L{2GB&0JU~>NRyj6@Fh*aWd!o zQ^!{U=7Y_beK|Q1+)&kR@hh?A!IazXc7;KTml*tOh~!17HbPn^VRE{9pZR2T)e!Az zr{?|Mo3Y&>KTj7qph$om=YHPrf9(huVVYe`As(njL1mgO0gDI+iFW6C_9!dSPp2kOcW?wcArl1D-d2c0T3Y6YLXo7(D5ck5s+0 z4c`*=K)j${#?pv6n3R?B zVKv1;B+PePdKOO zYw?UqK}oz~qvuT1NW1^;s1NSDni)&6s6og$xly5_aQ0_M^YPpJ_{0R)P$a^OzzD(v zmw)+LXd4>!3P&6lX(h;|?))%5BrxPC@7>(9;}l3k60?V>9PzJ8qV+aWax^I1tM69v zGty&h-Uy0UBh8r0MEUlwFCUo`9Op%QbL5-kYt=UonE=rB;1DJ5XyRQL#frt=A0s@R zsD%Z6j(*`(!Ks*qo+(>3G+A zYvb=&w=T@P#$*3&Uvsf8x+}#o>g|X6wTdDQ+5qZ4v&x$0aavg>5M>;)PIYs%Sn{bt zVV6sh64X91_Z}xDpvUX0{98RHkdZQgF>uWGv|>dGXX;n>v3EHI5p&>~yt{|9OJmMa zfa9ti@nKavIV3l#jCL+ljA$=)+^X|%u)NG3K?RR1xmBBaRMNeT7;;bnq0KeJ=DM=O z$%06QcHyMFS?<{%&aex4ka}Ny?%Qp>wpN^Fyl*r0M9yeja_L^LJLuZDq`l^ZS051y zNiFd8joeiZp%zgiDW{6u3Kd||ifeoit&j70=)!knbwoU~3hvh3_G^Fx}REMSH)a-`lglP!eKE@lRkimrj=C*M6%Z3l9>jDzz zzM_*g7d05>hcoS!;_5DOQKdrKEHr7R+1c)s&D`W>!-&Ydckkx2SGoO`|8zv<`AfHF zp)W}IpHJ4`WRT@XNw;TK{Cw2kot_F6et-MzTq#R*Y1Ue(rgLMgI!X0TSb9uB^Sv%r zbgAL{1VkQRdlfm8Jwtsq0wFzouReNwEY~$f`|p7jM3Oi+&u-7zY~qy~$UEoaMqVUH zRyQGYoH&{>JIf%Tv3Nr4zDN~5{Z8RF&g2FCGNiiqfK1hcexSx%R^=~Dr*VI5ROiC? zjY2c8HU$AzUU*otlLwPXtObHri-fZ>eB5!H0z+C8u%nSm8-I8wYX%e?{ggT&RXZg7 z&H=CNP2>%Pya&l9RFrk?Yu@f(82Rxkrqv%WQd)SxZAq4%1>p`Wiu80)!J~-<1nhHI zl33KbP}Ezx#@xC178h96Y{N3prt97oH7a<#MDJQhYxT_lRP}h~lyj*TmK%CAmbi0( zXzlD{`nkK)xOJ%@N53BtGS}=!S5m*miob{}ZLkopO$HiB0tuF>Q-fuqY14VEEOj~Q z-eB)Gb27$t`tT1TP)%wP>c#Y&_>z1gQ8A@Kbgc#I^C43~I}pZxMSKD!Os}^`+ul05 zgi&fLs5zCCWipb#AJPSB$dbuit1w`SR8ew{4GXVw`R`_Vx)IPyX{Epof+alxyY{+) zZ1+8evI<)Bp~%IO@K)(Xh;xk&0Xo*YB+Cx4QDZ>9kZ&$%4x>Z@`)egwJmw=7AfR}J zwQL~D6o9QKF$O(Xtn=}fh6Q>i7gD0iQBI_i4bgJIiNW6luH`D+XN4pMW5yM|9*a?w zd;7TGP8d0{o?#}AQZV))_`G=&<3WRUOxsoZM_JeF12GCyNeOZiRkF=JxjsusEAN3w~6OmQ$@(9=zl1!0V5q!RAc`ppuNw_+)LkVkcjDnmxm(Q)g?>+DZyiAL=y+GEHEQ@e zR^i?|P?SVtPdn_FY-`d>m2Lk3J%VL~93!&2+wdkMfSb5D%wDmPM34b~>rFIo-?JHY z*mH2cn>?Lh&tm2V%OSytVxi6;GPa5unX!bW84pkG*aYB1p;298ih*&YUhr7)L^;5S z!iE}6i_hn2OTpG?L}>Yb{#fG8DJ9ZsOHO z)xSl*UGgf7+mqGx;9N!gT9Zk9gn+Z8u0E>aT9_GLQj#F~UW05vL-|TwR~j+c_ezcy z8Q{#=!?GRkpB_&7c0xe!4^CFukYb9O6%(qq0H7=X++GS*#x5En?7_c{gF1R>tFa9y zZ`VF@czA|_BiBJ2`-O{20*_e&GIBDd@H*Rey_35t`x-gpnJLviqO1CTt0Y>Xuv7uZ zP61l7yQm;ZtsDlpv8gEh!D7-*iR){wf#XPuk5ADw#`SIchF2(I5fF`0uVSGrVMW(6 zhw;na+2+zP_D3?>xUq_+2h`G=psul`JqprEB#Y$%@lV1BMS@wVQDF5N$R*%8dwb1N z&Js#GI4`_NeH&e3`aW-7=6Sj43q4N#5NjV6B5BZ=q>R~S#QvGFL(P{NE*}Q?61hq1 z6-QWf3s@M5dkT48l+Ykf!cw%4Iz;p+ZL z0O9lXt;$nU}A?Tq`FvkU$632q z65sOKUdZ~`KTJ!6<;Bp#?4&vOSiw6&oJgr(4X*e(xX4B%3Cv#}&HsY-r4ByL9D9h$G z{GP$3J9+Ox4pg#F@C02W0?4c22xe~b$E`WMWa`yUsZLM(aOzpsT8l$%(StZ z25-ruPfaT7mnNg89;)L0tz1r*}m7(VBuGu8JRa9j_b)K~x z460VE#p5nIZ8DbqDIVpEu(2MPTg?eCB$kn7)=PDm<-7@z!z`}b-^s%p!R!% z-N!NZ+x`Sl7P`e>zqj$ph@{D4YHDoo-H=3EHMMM84)e&6$<3__87-OU>ZR1;g*I;! z>x{7Ww7i0n`uU%d>PQtJ<%d3A{w>IEDLCh+w~XtEh0)kf#$sTxSQ+eHFVKxy7Cse~ z)l5Tb@yoAfgI)Z#`1pvJ_D7Tfsl|l^BTyxx|FTH|1gyYdPl-FK#Yv{cYi5O$LOC42 z2N|n@dm#Ys;?SfoB&NZ_u+CXktuJ@5G9(BiO$ZsUx@`#E?SFi zww+s^CD};{P(S(Z=bYZ1vh+|}CnMe1D}l|F);lOE{6{aUW>qRF4U0Rl(uKIJ( z9P{~y9#=|1A|unpg=jns1a;I;9rUZGHt*)Ud7IRjVLQvBG8N29^nskbrt8s=K-Z?c zp;^Md&lhA`R?u;8FD|NLmWQPF$fqSM)_Q2_%AKBtNxoD`MhYaq2YB}_s z%oDR5N(Vhb<#bqHFA4O9U4zb6;} zUh;o2kUY#1?Q?=C)-diF)7ei9m>`Sn!_wf4m4~>XRjDbF% zs)9<2^`xjl_?nmR^ONZBr@lY27_c&`>3c_0QOa5zQ!}DhB}h<7iY-&sW$*e3L+lp< zPr^*1gcqyBo-RHg7)^Zdjz%n&+ZWF98$E6;*;(6Mn|0IxT7`08$v1d2^`yXJ!tbI} zbO|8{v^G$5_8SCVX@OU?f{8zM@xKmHj5@wt$_!c;HcZvYiD@xX3hZK_eog!FjD$o& z3SYX(NV@DD$-KB7l-k`_Q>4|=+_3m?R@<*^PivPEkDb;FI2+Qw4Vn z{FNu>;?P+Qt=Qvjb*88h=26=y`(wCZ&|Z?-`~Xn&A+j160QX0%ZiNrWkix)B&tRoG z+updz5zm#B*47qQ%dA_C5sr_Sh6y|!CU!4%WqR(^5%WuG^o!gq)HPx=g7xv0KRI!D zaR}~`tI+`bu1Bk_-8`4GR{ZFFVpY`^cO@$fptVxojfLlB^e@|#@p`}a6+c8PFq|Uh zRM1F-Y{M`lYU{os91&AXd_gJ!<;L#pyxf$(Vg0T41=jyhht&PI7UoZn3EA@ES0n1R zzJNp(9}`BCy0fm1Ggg^#1Z@>j6!St05hmDm7Z|h{%Rd4`+%eayz>^gsMRX34jmf7O ztEnAFf7=>=2EM#FKfW&M_T~a)1P7K*-=b^VK?2-WZ08 z1a_Xx>NB(9YhNpf%2b|HK^umL6hv&qppfpH!`!m)i$n>*(cv?s`+w0-QDic4Mfm2+ z&zCnB0>{`irDY^n*S90$=dUddpDX=?#WJSF_jU@X{7OaxCt#*(s_ z#RbB`cy}BW-4P}^zQlcJ%J})wgN@uq%A8wTJh7`#_iY)LRTR+g7M$WA8we(t1oEoC zy;N<><}yt2Ww97idYoXLy!?{RP_7>^+I<3ASdc#!;n<I>n)T8?3V$%Ioei(x??t+(LIC)OTv%i+cS5UMb|@6BcVP*coOBP zMuHdu_yi&SrX*HD7AsK=5HHFmS*O6IL;mNOIGzGu^+EEcAFe~sKQ_Mog-L0ZKeVs= zffE4vlQYZH{CI5$Iksb1)Dbk{^C6aj&861&f_og*ye=mc_kK#UnHggrXt@L4Bjbas)&GHw&H63kjkasa}I&1rh;J^j|U*If~5&7 zQ}6pyR7OsyV+3r!rOPG<=Y5+;ohY}IZbzf~xLqmkiY5#bsQ&GN8U}_`&W#_`3}Psb zog{C-lmgu$*zEUFyn@0Y*gXtg?CCHwYnQN8hU>~auf;jGN!G=5!6?}RvihT%QL z`Q0|W(Y!PW#dbh`Fg&mE1ppTQsoeRaQeUQ573aJyS_*GUY;5_en=rx{-9g&o!%J7t z@Lw45c?b&JE`}wt=SqG81;S>DP`ejOZy-znD9{tJ_i%Kkf@fARQ@ zTIL2EEG3obWE9W$9j>JYt&Hqf>>j&C(=IT()= zho1mD!{_6d+Fyp9&HDG8HU9{*E?$tT8|NeTOTc>^z60+BE7K*9rC^4m1tV5A)NuuN zmM_yBiUaA*`(Z@noH4lbq-1$*&TgI3`{OA-KPYQHIQWz0y_75TKJL5IJMj5asDjLOYHtdWi1A0u?Ni#vBcrd<(voHu;xF0E=6ugql7s(X!0$G8ge!# zb>-9b2l^;ukMJ6vq*o>uSJDmO0K9l}BASS?3tJU2*f$RW4+cf$VpocR7c_(UXXJF` z>}RPlYJXvLifUfw%#<}FHlEil$OEo#o`w1XYP?n-n=ZVI5?(Rj%P?xkABoG){(+l9 z)ZAn^Iz;0;!(g#zOSqbkuiFOVbHIv%sKqfZ`v*U@ptI`y&=sfH!j_`CZ$oO=WnA;9b zKpT6gVS#MUh%qgdnYma(IKDz``EX?*dq&#^FI#y$!5yigrUl^ML4$3JE6k0jxZT}a z4A0J957hnCY+Xlcw}IzS_$Mc|8SN~m95A!aKspjxIma~!3i&d~WXY1>b6+owy@QJ* zzz7&;CEWQ7GgD~}70J1(S?>qe#BCY=!r=Le<#xufbuaNr)dcDyM3?31Q^ijrKm~4osN-RnzTsE)>{Eo+q51IZ(Yxz3=vs?T9dtqvzi7O$cz4R|h{M{p zr{JuMVqu%#WN1ONSeAUIb-R1>ObqJ~HU3{TAi<|?`)#om=XsqU z;bJp7vwvZ3Xy!by)O_1O^HPfs5ul=2O+z)>pG2$ei}EJF3KS@xM6`cf@xECq$!}6_ zI@$Od!OlJROVRaRVcWw}lii;%LE-}Knr zH5LX*%DqW_-TIE3eSMb|lgmmn2#2**sK1G7saj+*zT0CZgQ0rZaDp z%sP2rd4en?DweHkUF2hx?uJxfvgBk4-D>n@yirgC=1=7vtRZVmV5?^<5W!= zkR_1LpnGwqo!yvkv_Ynzo$V?PwF1b>?Y&!YUiozDgH;pYGHtf@n+Y4%qqm*nY{fYs z`FHwFki3-_$AkIMcEct~Nl4flU%bxkueL_R)0P1H%KcPP{NlcbxxoykTl}B96#YE6 z?G$@W%D0Oua9r}crWDEhHS8H#K-GH#sX*#H+?viUd)=U~`3_OMQxh>NgUoNgU4V;B z9($aQbM9sQAi`C$7w)UE#+M;K%F2-jkUmyX^a;PuH;_8b``DP6I{%z3FW=%#6{@}MSU$q{|A+x-+yZSrHEzXDo9e`(iZ%iBaNN|Y?H9732x zv0E&$W4W^!Vc2BH=!X

iki-xZ-hs-TtNPJAagY%|pq)hQ7A0CXL9)Z3Ux#1)S_i z+j1&2JPkT*YHblWwRXj^QHT4$2!@c*XlBT$=wLJq15#N3mpfSC#W!{ zO3~}%!P`aw^p@!%W2;D$NLfT4rxr zT=l7H!muO$uAnWiyvW(4{4urEOfPXhg$tROq#)|2c~NPVfVzdJEK*@c_Nmy zi}B;bH+I+dxnorO;$&a$sS0yQX)(l4uDl!){u3Tst>lOrpL20hmjypLRFSkXO(67& zJi#$GtG)VoGN{t^HSl&Oc+4VbZ)8@Ge{19>kXp($s$eK* zyV{Jxm7-PK-)>f(JphA)heG=Ywx`a2V>ue`r%IHq2>Md+j|l`q|DKtBb96M2I_k&D zHo~x>UPWq5mL!RI7BAE!nMDmrW+Ky6nK*9?tJn$E1jQrtI;>Z0FXZQ3$)Rm!3$(-O zH@9^vd2rhd0x@9ykO{{DYMMU=*%6FIMh*_BJbn$)p~RxH=24s*CD;`mivVEsWuzn_+j z7hmJWm~CGL`C!+#Rtp6~9ko0Q*0VxzG;021u_jJdYjCm3StS-^cc^(Uo5Q3V#RVK% zl9J@tPwFMG6irO40Il(sVseizJd~Q7*2mK*yTv9)9@{%lt=qfiK!>)jZIEEmKA-E9 zupo#oT_;KTuBp%}Dc&7r`jAfQ)65Nve3o`D)LU1M*CutkoWzT}e25|S#R)A9<~+XS zR)n0M*j(=rqqETJd)t7aCdh#B9oG7;=yC;Y&7MeTsR$atRZAY=hP?Y>RghSaKBF+l zIE$4CkuPTdqv_9WvF*?)zYfT@5$*BX*6Q~5wxS9GJPTd!tW+>5S&JX0rj&gQmyUvB z-TZ@Gz8xT{*!@^r{z!RLeUc@NV=SNVVOcQ z;{mLejknr!>J1vb%!9h#YZ?G4Z(AHlL1wBZXsoeLjY*>&IzMBRsY_4U7|7^Tyi%;g zL33k*=kwJO)UZ3AOwBlCurDets4kXtEeWlM2>G7Q)yY>xGZyNC0Wdv@pON7@tkpD% zYH$>F@#2y`y8>AgPXTV5VpTw{z7L4$5dDNU}BapYj3lNPd6~SY_(*#?pRWO#2%6<0fjM?|2hZw&2lh zRbmjiQ)}>{YU#ju)iiN73XrQ3hDvDzwz0wWtxhH)iuv{Jikav8g~8OQc~uevp-inKWUFSnjL) z5I<1~@?7%0{(xis1Sy`9Uo`6O0N7CKUhnb)1(~KMBQ(114gT84GUwIDqR`b^#7=aV zk~TF3qm&!$$XE_mGzB={porwLczh{+MxYWqJELdFTYVUmMSZtEm||6JE`rQ=*|t1k4btQBUH3lG|Bu+G!}J}OTL^7*!H#-zQ_`FYb7jH_ZeQ}FZIM3X zlHL)Z(#~C(%nS#3*sjwbTQoS&s9~)b>juBe6Mke6`K#R4E>qx$mh(ZgPOoo@KB^m^ zC7OVbJYDd80@)`TK~Z3}@du?8R!Y&a;E^M{N& zk+>pQF66sND)w_MiMFYk`tscm?I=$5D8_YL8k38QoFvU@yt(KuCh3DK z4tM$g{}Kyl&bIgpID>l8wzB*B zV=^)k;qDR^fg>XF;R|JYj*-@}Twmm$+k4^FjTO64De;q49&~>eU?GKkh5Rfh^dFnD z0zJ0NPZe2F*ED*As^930HmYca?mL8+zsay?)%yIz*I;XKG10~7sIhnrz=^8`)JC)43cHVdlJM$>(X%`o z7gWt~;Kc#?5~mn+*{} zjh6^_Go*ww>U&@m1V$)vL+-=#O>{odO;NO4P;*07~#X z3v!W=t2m!t@)yzge<%6ZwBZ5l>KED=b46j15SX!&rR5+_Qo;?_9>9Gs4dL{ALHCl8x}3eF zC;Ry3)@`W zmNYivU2D(JXHXe6g7awCZP0s@_lX2VFubP|CoHDTEB#PFJ(HA>&^x4fPlw-NTsI^k z?}2XLGn0fFEjd&gq$(V&x&aB{v7y3WDy0;RNV(8Zxc#c#J2sK=^U7G#%$W14AeP~* zHA1fQql>XWdHCWsnOB_Jw?TeQI(4ZABubMAg0wJ^_2;^Pty;8fHw^B5`1ruDNY)DD ze(9>-^sx@Y-JO7;)d2cUO?Ol8j_eoJm7c{fatrIlPXSjpS$;%BR_5aBn-iGuK9})G zCF-@sQitllkS`+w3@do5qngIsp*f9rv8pP^ zH$N^r^U}}NKe877Bj^eixQ>&LhZen>qBOE0vZnEXRoQHA4jA0v$`ys6*5mdRh*K<5dPiXyn3JpE51Nbi===E%heUx~K@#DArL}2#| z=UtMF_Oc6Rh$rD_@&hPzYH2L)0BjKK7tk6kua znSQ8Gba(S=yr1rLmXybx&GSHGAbH_bo3kor*onB9ksb8b9i$)Pf1sfXNmWe!&sz-B zYY05wS3evgQol|8G%E3j@WB#F^K``LJwP3)OXbkUkaDKSA_}DFF)cP^XxC-PzkrP; z3+zP&!I9w;`FrR{ZO~y~fa2$iO*y<=^~mzF!jSvdHHzbzEquTHd)+>+0VC{1OixGA z_rB?}D(LB~v5#(f?xVvGK|8dgV@y^pbNK^BU#{Oyw-ZdM(!F0dP%`w87L$+b=Ee=c zN6ebhve$G0+Oe&nu{hR!R@SOdB{T)nyzQZ(d6Sz}frd6s?L1lZ1I0t79*iX^C3#e&A=rF<4bH|z)+Zkre`px>)$7dg6 zxOn=~ej8#rZ4b;{4?Dx50{3 zJY!j(qm^s%Y0cAu4F%*$>N|7G2l~?nUzic}*1=kL{4m*{jz0_petyC4ZnRPLf{RX4 zvlki(b6P&ko*K}S;oEAQZb~Q(HOn^yDi||RrNuQrty7$ zPF6Fg)%RIz$-%znXGOHO-&K=UI^|#NH`F3bzCTIW-rG4|8bXSzOKk(Z;n4|4$@lJm zb0S1h1;b>cUuU~tT|dg3G8atXSD>R-Nqmk#7`ikw5$XN35AY0J0%jx=S`c*gAu~C* zr?K~h7-))5+YDm%@YSBuS~!SiSp`sX(j6EzX_ZtPqUNA|w)Gno$~yWj$}U|qN#iQcfo4GE;ouaa7IOya`fwIB zBGS&VsBu#mf*aTVjt7gpV5g`k(l51FFwc_E+a3gPsLI}d^CUiTOD*@TJ}kX#@yeTV zSISX&bnO`0ml;5aHgmNu)DwyVi2OMoNudb27c@<#!3o;l;irH4>r$1AgD&6+N3iH} zq{y4!0qA1FvI=4EUr!bGSV{X(4y%)!2lh<0q8K-eZxy`EMJt-#QVzUE^L)A3AUk=# zH!&<2)j(Gy9s#Oze$0aghgtlQMp&ITv`HVPPLrdojEb$yoy^7_QhVI5WK$pai=tbA z$>Bjb%}r1)nN3aC`NagMd%?b<;k?J9hUOJ%r=W*5{s|fhw01lK{r4n$(PjH(DpogF z-go2#mNw1E^raY^v^On&##{JV2Z&imN4G&g-VurU8T0?-V~1aJsi`_gSo~dBQ&7yA zuwi5ItSX{0)ATN)2@EZSLiwb9q!?)9(;SuwM%m%=U+a>0Xztw#1->g+=&2?`#k5SQ z-g@zv6v>VQjQJ{F)FHC>sOMETCftc*)B&}Z+n^cY>#61wdZ`Z3cO?RAYZe8-*ZKTx z=u_E4V*z-+7daf`_w2ua2+jPd_nnewdk16H>3Sn3{(i0efAJ;SfR1py1Pu4nhoBl6 zx!P05ZllVHzBtbt+UtMP;TiqC(xX!tnwq_!)V_%mzIXjDFC}!4yMf|mC@EP=VQ6R;>!Wu40<%B^?gK+Up&cH$p}(6_in=f39}YabWmQtehB za}*`j@XY=QZUDgb<$7D;ER!NNA$WF%Z+G${8oe}6nSbJohSu5+^h29Y=rh40$|g>y zcEara{Lb>0!T|sN zq9MYT*v?$;#9=*nymM$S1*NfQbF9VebSQh+!^_Rl5vx*Q0ms2Ouch09wqlk}^#=)O zY1oBY)>g-U3=9{^}yNAQ4vKnbE1KFeW;lrW(}II9lk5qnFu#Oy)9Y zqFtYk1Bne1PyG0;u%l)c!kl&w`Hl(7n*NALuCg5#^I9(cz}lEkC9&zRv7jrfIi2ik zMb>R49$T-ZTU<=8YG#56p^l_DIMbc$v;%TEDiBw^S0nm}O zk}es7$!^Pv$!iuaK`cDA8?3x|>hp_>3qw}raNw+kvSJs0dG+(*aye;;R_y3uO!qFJ z>e_o;77sP>g7FeA+YhqG)5=KOi$9g&8t(T+HDx5_2EFNSUpq6-ic4N=b_mXYuG0*E z$5hg&@=N2NH?-&fWhO2H4McCsDST+fC?!*@>mbCSnS%=W#;YYw&>8{@`XF)EtleFP zhT5~7qPO1A=k~T;++a;6e1ZA|tyh==L~8bRpOS3$cb43T50%Q6W0cI8*z{O_ut4=6 zkHO8q)uB!$v}tSMSXt+9KdMu83R+ej7x)dvR!6r&iQ5gnRiHE}PStK$M!s#rT3fY{ zJ(ytPQ;fx0m7iloiIJvd59j6c70n zCLSAm6fWR^zx`Dw+kEhwR7yLiaqt~##>Q<#W@a9uRct0NOa@<_wvGU30&zxRWcR*@ z^yb9eEQR(BHi8{XG6JAnUZ!|G7lu&E>K7b-vdN5nkPylZ-IKMpr!oWFAJtVBNdUWDtSe4qC zTu}-(VCq)n19NICQ8}y4WHOXQ>v+To66ocZ7r7mBL`$={9ub7;+rI9mzi_%-0`?6T zs|1~r8QyJgdFoaRR`MEno={h-r=Z~B_-~CR7JuYekXMIb6^%85Luts1R8f&|>D3M9lDv}*^7OpsV|$6#qxU@$ z7w;Y0kK%ksYA!V@TS$tHS)2Di_%Vc4W6Pxp*_AUff|*9yz}=}8vs9v7+AW;Vepq7z z244KIC_pAY8yJoanvaO_dYL!*TwKm|E^#nKdBk(YJ>_=a2-m`(Tj1vXil&(M%#-8< zBi>{!FVvPN9+W@Cb0baPd7?88cJgu!j_fk8aeNK8%O+*i&|97MZA^b|DH8ef=4}<# z8EB~wt|Fw5j7YBXNMa#X`oMVo8 z4SiIacETMvKEDm!bVmt#%T)K8%dK}7hMk6x(2BIeG~Wno)>&50EGuYXCaHjQwjv&h z>D!@t9XJv0V1RG-g0wlk3l^)86e zgyR1!ZXl4zApEbg1=LN$aSD@}DJb7i=;L9v1L!{b*&?P4w%1`9 z{ovC?;hLD<$%ifLQ6agtV!M)2 zEWf+cDl`GT=P(pqqR7n0V= z1%4Eg;flz!pP>7u_6L?o8p7+EhTi9hI>dFR#W`2Vm`ZAytfjsp_}CO`wSt+!5`9T_2XW~^Zf4EHj=!aZ|gVKCm+j5&n?O(()!kjYXC9ghLd}QyZPT_{> z&?{Iqq#PuAv5Gp>nyIFYAcjmivdR;(L8ghzt>wyP=#dl8R`Hs;#d(}m@w0zcgwsnq zm6PsDOn&qb`kAo2slww1mgUKI7475}5DL&h?=nc^O=o&+nP{RBk#7ON-k^Es@g;0z zTtwIr{v1CQduXZ#f7P21<>%@z;vG{MYrHo<=>kq^WzYI{D#$#-M!(z_^eXBFX;f_J z=($VVu;7hj%enNK?R@`$jblll5v-U4M<>O~<2sw+mfW`@u~UD2mXdyA>QO}GYl16tD{C;>{ao8;j>B&8-9Rc+ z{Cy!ppLRSK#i|rWrC^dg^|!FGFJafn%Q4mVakRVK{LDlHp?pZ@*@IQ_uHlxZ@;h8K zFQ%|&X4ou_7%t`%j*KyG(jVO94rH=QW7<2*rr#`*BFOh%1iP0xN#gA`{Fafbck=M>7!MV`QZv_iN?g< zzLDn;U&FtngC{4)Rs|d`iNYR-L;r8G@~RO$mc{M^I^6kbZY%V7-uN#_zs#e7)pp6@ zFUa;d(I4BFJAeu|2>X7d;RgN|9@;FggF@eHmH;I9JUoAXp-j`3&}Zh{+#-8$&398H zh?X^Bs$zYO4b0qyW)OKw0i#`r2kX?}L;LI*(lZiW$Vgxh1}8hgS%WaM(5IVq!De#c zHE3R8#RBjNB+`Cy0)0FHcJlc@2e06i{KLPTM}(J5_t-?4{uc(-8mV2GY0}8dP)PW} zOwh%OBqz7R_PE{xiwP~q6SROTKtdEOom|poMi0KlUHNH$;mSi~#&}vqp)yTpeP?Mwz0IUKo#=+< zCVa^mFCc=0%xO))Hw$&x-$<`HCd4FtqAENDR?gTHh*A4-^lRsvu{k(rBpwbb2;f;) znS~*0!BJiYkCMc?iVoVpfS|)gYSRdoLB@*&%B`v59#v+U*V;XwK1HiNmJQPprc8b|N3-ncDaSqZYfk?Yg|Poy{Y6 z;~=ousR-O=c_{Mhqu}|uX7S$_Jsg+yP~0p-qHedMEglmE3z0=c1kJnwm}zT1{4>5a zLSmF=PfoASx5_?!aNmRZck~LemV5rR8)qpB2?@%c=!z+k0iix;NaP{Or{f1mk+=_J z$m;d`gQLekO-bU4i_B5BCF-2<>L%y}jp+BE_iK-N3i-hAz21{I;VOUuEdewN@;RX3 z)$X(cV(KPZa3!1Pw`%dHl$lI^F{FBXyB-%wkS~*Z$uBfFjjNG~hcxaYf_IaX$H&N@ zKo_%ySwJS<4nYa?yLMm^3bmV(rOZY2RYf^`bE^Wu7p^LX)S2(5$Prkg&yTr+gTU+} z!mW$XhU{iSmukzy?gHn)NQQm+Y4VGG$1bF@Q8#*{o>UIbNeYB73L>FP$_W_%C7RfS z_2co!WABW34-%Z^Y$a{R?Gc#4oS`5sqnu;xV*wJ*dw$Ik0f zBMf~ojuR&!f~}%->$|(_4yRHTnDOm?5QPGZ2yi1AnzIe3dArx`8=`OS4!ygyWD8lG z$MSA0ao3lsEE9q%uKRuqk^ujhjN326cRr~2(_m{)>{rlbE0WT!EVrxwggYBkAz}j=9`a*ml^8c?7T_KtiFM*g1~IC72U7k&{4){1jBCtF%-8 z7H0}))3^Pw&nZ66@1y*Rh$S&S#WLEEc0p?Bt`9Y#aQH=RfB@a7+TMqx{%0B~qB_6Y zgpF_RG6D_QNe|die-K@SxS%I{-8A|xca;BdG2uoC!x2L;iytHFLK z!ovvi1h!8l9gXzG^|dk{-rU9tD=TfFvI=pLdT|dq8UUVPF9Ymyt=Rez@f$cO{{wW^ zT%i&$E;Wwz8iec>6(r~2iQX?z{ZwC+^b>3N*rQ1pW>tKtF2>LLpOAkii#s@3|0GYf zFSy1Vr{zx3E)>rfOBu8}ngGPc{sTRKih<<$D3Fg)zQSrAiLC7CTv~y{AU*Ji=VM38 zvApyrhfA6fprbccJoDQwI>*?;78ZV6vgW6?^t`7qv>lEBrC9L0+xRKoVgE@qx!A!o zR(dh@YPVcl^MK|P!Fvd%_^#=*iNA+=1IKSHpw!JrDb!8%g7yF1jwquniF4j`o7QMUoy~CpYw>dn&hiY33zL1HEaVS=#1!jIcSUlb*3iGeCw_MwgIT21w#E_0rm@voaF)oRY}@$I+k_0;Jo%abA`0_{=7+`^2m;V%ass#vhnp4$^S~h=+Anr z=TgV|>%wZd(LaL1(;Jf!aS<7K4+YS|@<4^kx`(zp(_Gl&pm zO69Dz8eu`H%|Hf6hVc&d_e!`ybv~ARt4D$`)SE(R$#+Uj>)HC=i*maAp(a}lO;fn5 zYm415qS5d;=TcjZ&WS#nnth)JL<}RV2Etk|7-PB#b1#eaxFtqTcaQLTK6NLhTzB~h zBY8k_aJ=+s=SEZS^dz z;@~WdzR-)VoJ9UR;m<`*9KP(jL3nVt!PUlI5~5h?NP&CqMkK_CcwGJb`pwrWgkp;U zKDR1{NcCR5hcga9qe`D?sasLbYCzqmYsudqZ(42SV2VHukr)%<_g1`d?K|cV10lLn@M)d1WrT`^4oU>DViV`pBOnB^m;X-3 zneIL4qATj!e+0$f)F-ag;@%$QgYgen2GyC4wM{F>Qw%V=A%=#Z{>=(_Qj8&g+Hz|lX8f(|ENncLvHpyR#?puR*cZ4LFH?@;IVWvWM5M$vhgbp_tZwK+8 zsngCsaxL~47;u8!$(ie^K}E6UP;+K`?6HL^c?#5tUmxPKn@*5A9Sa1bQJi(FrOj%8pc$%n zVKo+FAYp3sqGz?%SgAKhG^!UW=~RrLf6WOjeXuF67O9{A5P(x+mtPtmlZITPzq8KM zLJKz7|KObYc|#w71$hhf30$Z&G;_YPzDYw?Riw@Qp5=1Z)8lM@0$hHN*B^3M(l!De zH_CO6(!TTxt`#+|Ss(B=0jW3?i(h;B}h;udjC)_APRL|NJMI@t{`OJ@5{Kn+QDdSCgZSS3>3 z1HRBykB2-uSG>BKj3Lif8>4b72EK<2@cdQ z8k#L&IuTi3p(vlz95j$qyb*M;&TrS0w5e3`Z*kz2ZoZnAp@x)_%9JN6j_7Pe%WH@K znK_MBh)btwDdT8>l$c{JpOpvJH~E45`bg(DNBIx0IiDDsKWOLD<3+4*FS@JT+#pmI z@{kOF@5$Y~Y5OUgC-MC+2(R=3<(movJ^Gc`cx45Br%ah)E~K)w77u|}+5PRACpM!& zc~+q!syHxhGuNA{r{|j)xl+TTl>fQo_*Ad8;JWvFIjX{jnZ@KymE;WNF^I~gxEw#F zg5b*ky#htWp$Q-U#bDYuKXS^*Fs@?LB9brT&~Q3@h=fp`ToG|yCsG@qbJX+2%^Nk_ ziFGgM2QNdY9*vf-@taJUREwkp821M~{fEA9xX;OD&Y$9)<8;r*W;YT>LU)*z#1FI;B}#`w!TYpwT}jnyBVz z;Dl1@NUNPWTwbIhV*^;U{R<-gbHRL>osV1hQ9#QL=6?0o2EjLNkUn?4#1o;@o+swq zsSKwF!*ZnH_*Z^uTBTjShiqvYlO=wwsh3`LVR;4amue2-R>6ietA-F+Y|;CERT9#3 z?37RF5!!@d*7d*ZUG7Z)R4b7ojhS2nI1jVkpu*_lN?V6(L4sl=SN>I%t2X?+hTf=> zAz@>jCa;S_RY?}=Eq-J4G=;R^6Zf*_A=4&2HtQZ(M9HL}|HG$?l+2{#3;d*5rlWB< zZ1oNJbI(@oNWa=oe$Yh~`od|WlGCq#_|Ryr3MUjE0+#n>S+$2gp-sP+EN*>@AtZV^`a<#*QUcWLH_$u8vs#Dr?mz&O9D+Oy63}hM=W2D9Kbwo3xD=Z6+2SA#ZNI z5ctj;CjzxC7|FvK(TlpCbr()HpSm3^`@u=DWO=?cw1Fdgt3u|PIn1}C8sFB)9~qxQbK)5K)X-eg!w0Rbf%Sb=~C5fW|Bq^ZbTW=bfgtkdA~ zJGn7}v;jLuIZ+!gTJHgT?#6p3k(7preG4 zJM_M`5nQiXmKcJ6v2OnnKGbUy1KqMaT4RN!J3}#)Ao} zl}xYlL^aSAeun=GIs-ImYZ!|U_gx}YW0H(jN0H+MYQK*%Dsp2-8k#YIe*33lzz%Nb zNkt~A4ho&ev!V^-WHTDZBx9(c-Ac}>-Rj|!1Z`Pkhi{@d9jiQe;bY?MpN7l#(=N7zVrwFr_YV@$iFw_zaZL9`V|wl9wI`Y z|ALIpMO1V!q|tO!$$sqw!oe|VhLT4z_+y5PPEU*I1(2=CYxMPFK*ZRHgB9B z&eP^Ym@A}XG~;-oVq|d3tvjbxV2jSK5oxpF- z_uY$1S2EZ*N%WCEcYWtSQ>8Du<@bJ9Fmau!)YcqPD-fV@Aw^{pN;S%jpupoDAr>_U zX#66zVjVg1-zFSvjG8G?=)(7O*$opYOlW_4zAF0?Iz|_ zOAV4Z?TDa^q#dNyn~IrS4)L0*iC%0eDLqHR$#4QsIt9H3`x+gOvq@G0{%9*b%6hKF zX3^@#x)K&S4lF#Gp0-a%7kM}1&VNA$zUz%7_a~U2x{hX`1NvPptDo<4YaHItO3