Por qué traducir archivos Excel a través de una API es un desafío complejo
Automatizar la traducción de archivos Excel de inglés a malayo presenta un conjunto único de obstáculos técnicos para los desarrolladores. El proceso es mucho más complejo que el simple reemplazo de cadenas de texto.
Una API de traducción de Excel eficaz debe navegar por estructuras de archivos intrincadas, preservar la integridad de los datos y manejar los matices lingüísticos con precisión. Esta complejidad se debe a la propia naturaleza de las hojas de cálculo como documentos dinámicos, no solo contenedores de texto estático.
Comprender estos desafíos es el primer paso para construir un flujo de trabajo de traducción robusto.
No abordarlos puede provocar archivos dañados, fórmulas rotas y datos inexactos que socavan los procesos comerciales.
Por lo tanto, elegir la solución de API correcta es fundamental para el éxito en cualquier proyecto de datos transfronterizo.
Codificación e integridad del conjunto de caracteres
Uno de los desafíos más inmediatos es la codificación de caracteres, especialmente cuando se trata del idioma malayo.
El malayo utiliza el alfabeto latino (Rumi), pero también puede implicar caracteres especiales o la escritura histórica Jawi en ciertos contextos.
Una API debe manejar impecablemente la codificación UTF-8 para evitar la corrupción de caracteres, lo que puede hacer que el texto sea ilegible.
El manejo incorrecto de la codificación conduce al mojibake, donde los caracteres se muestran como símbolos sin sentido o signos de interrogación.
Esto no solo afecta la legibilidad, sino que también puede romper fórmulas que dependen de valores de cadena específicos dentro de las celdas.
Un proceso de traducción confiable garantiza que todo el texto, independientemente del conjunto de caracteres, se decodifique desde el origen, se traduzca y luego se vuelva a codificar correctamente en el archivo de destino.
Preservación del diseño y formato de la hoja de cálculo
Los archivos de Excel están altamente estructurados, con datos organizados en celdas, filas y columnas donde la posición es importante.
Una API de traducción no puede simplemente extraer texto y reinsertarlo; debe comprender las relaciones espaciales dentro de la hoja de cálculo.
Esto incluye mantener anchos de celda, alturas de fila, celdas combinadas y estructuras de tabla generales.
Además, los elementos de formato como estilos de fuente, colores y bordes son cruciales para el contexto visual y la interpretación de datos.
Perder este formato durante la traducción puede hacer que el documento sea difícil de entender e inutilizable profesionalmente.
La API debe analizar la información de estilo del documento, protegerla durante la fase de traducción y volver a aplicarla con precisión a la nueva versión malaya.
La tarea crítica de manejar fórmulas y funciones
Quizás el mayor desafío radica en el manejo de las fórmulas y funciones de Excel.
Estas fórmulas contienen referencias a celdas, valores numéricos y nombres de funciones que a menudo son específicos del idioma.
Un enfoque de traducción ingenuo podría traducir incorrectamente un nombre de función como `SUM` o alterar una referencia de celda como `A1`, rompiendo la lógica de la hoja de cálculo.
Una API de traducción de Excel avanzada debe ser lo suficientemente inteligente como para distinguir entre cadenas de texto traducibles y sintaxis de fórmulas no traducibles.
Necesita analizar fórmulas, aislar el texto orientado al usuario para la traducción y dejar la lógica central intacta.
Esto garantiza que todos los cálculos, dependencias de datos y gráficos dinámicos sigan siendo completamente funcionales en el documento malayo traducido.
Presentamos la API de Doctranslate: Su solución para la traducción de Excel
La Doctranslate API está diseñada específicamente para superar estos desafíos complejos, proporcionando a los desarrolladores una herramienta potente y confiable.
Ofrece una solución perfecta para traducir documentos de Excel de inglés a malayo mediante programación.
Al utilizar nuestro sofisticado motor de análisis, garantizamos que cada elemento de su hoja de cálculo se maneje con cuidado y precisión.
Nuestra arquitectura RESTful hace que la integración sea sencilla, permitiéndole incorporar traducción de documentos de alta calidad en sus aplicaciones con un mínimo esfuerzo.
Usted envía un archivo y, a cambio, recibe un archivo totalmente traducido y perfectamente formateado.
Esto simplifica la experiencia del desarrollador y acelera su tiempo de comercialización para aplicaciones listas para el mercado global.
Una arquitectura RESTful pensada para el desarrollador
Construida sobre principios REST estándar, la Doctranslate API es fácil de integrar en cualquier pila tecnológica moderna.
Los desarrolladores pueden usar métodos HTTP familiares como `POST` para interactuar con el servicio, reduciendo significativamente la curva de aprendizaje.
Los puntos finales de la API son intuitivos y el proceso de autenticación es simple, basado en un encabezado de clave API estándar.
Las respuestas se entregan en un formato JSON predecible, lo que facilita el manejo programático tanto de traducciones exitosas como de posibles errores.
Esta adhesión a los estándares web garantiza la compatibilidad con una amplia gama de lenguajes de programación y frameworks.
Ya sea que esté utilizando Python, JavaScript, Java o C#, integrar nuestro servicio es un proceso fluido.
Beneficios clave: velocidad, precisión y preservación de la estructura
La principal ventaja de la Doctranslate API es su capacidad para entregar traducciones que respetan la estructura original del documento.
Garantizamos la preservación de fórmulas, gráficos y formato de celdas, una característica crítica para documentos basados en datos.
Esto significa que sus hojas de cálculo malayas traducidas funcionarán idénticamente a sus originales en inglés.
La precisión es otra piedra angular de nuestro servicio, impulsada por modelos de traducción automática de última generación entrenados para contextos técnicos y empresariales.
Además, nuestra infraestructura está optimizada para la velocidad, procesando y devolviendo archivos Excel incluso grandes y complejos rápidamente.
Esta combinación de velocidad, precisión e integridad estructural hace que nuestra API sea la opción ideal para aplicaciones de nivel empresarial.
Guía paso a paso: Integración de la API de traducción de Excel
Integrar nuestra API en su proyecto es un proceso sencillo.
Esta guía lo guiará a través de los pasos necesarios para comenzar a traducir sus archivos Excel de inglés a malayo.
Cubriremos todo, desde la configuración de su entorno hasta el envío de una solicitud y el manejo de la respuesta, utilizando un ejemplo práctico de Python.
Requisitos previos
Antes de comenzar, necesitará algunas cosas para empezar con la API.
Primero, debe registrarse en el portal para desarrolladores de Doctranslate para obtener su clave API única.
Esta clave es esencial para autenticar todas sus solicitudes a nuestro servicio.
En segundo lugar, asegúrese de tener un entorno de desarrollo adecuado.
Para esta guía, utilizaremos Python con la popular biblioteca `requests`.
Asegúrese de que esté instalada en su entorno ejecutando pip install requests si aún no lo ha hecho.
Paso 1: Preparación de su solicitud a la API
Su solicitud a la API será una solicitud `POST` al punto final `/v2/translate`.
Esta solicitud debe ser de tipo `multipart/form-data`, ya que necesita transportar el archivo Excel en sí mismo.
También deberá incluir varios parámetros clave en el cuerpo de la solicitud.
Los parámetros requeridos incluyen `file` (el documento Excel que desea traducir), `source_lang` (establecido en `en` para inglés) y `target_lang` (establecido en `ms` para malayo).
Además, debe incluir su clave API en los encabezados de la solicitud para la autenticación.
El encabezado debe ser `Authorization: Bearer YOUR_API_KEY`.
Paso 2: Envío del archivo Excel para su traducción (Ejemplo de Python)
Aquí hay un script completo de Python que demuestra cómo enviar un archivo Excel para su traducción.
Este código abre un archivo Excel local, construye la solicitud a la API con los encabezados y datos correctos, y la envía al servidor de Doctranslate.
Recuerde reemplazar `’YOUR_API_KEY’` y `’path/to/your/file.xlsx’` con sus credenciales y ruta de archivo reales.
import requests # Su clave API única del portal de desarrolladores de Doctranslate API_KEY = 'YOUR_API_KEY' # El punto final de la API para la traducción de documentos API_URL = 'https://developer.doctranslate.io/v2/translate' # Ruta al archivo Excel de origen file_path = 'path/to/your/file.xlsx' # Establecer los idiomas de origen y destino source_language = 'en' target_language = 'ms' # Preparar los encabezados de la solicitud para la autenticación headers = { 'Authorization': f'Bearer {API_KEY}' } # Preparar el archivo y los datos para la solicitud multipart/form-data with open(file_path, 'rb') as f: files = { 'file': (file_path.split('/')[-1], f, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') } data = { 'source_lang': source_language, 'target_lang': target_language } # Enviar la solicitud POST a la API response = requests.post(API_URL, headers=headers, files=files, data=data) # Comprobar si la solicitud fue exitosa if response.status_code == 200: # Guardar el archivo traducido recibido en la respuesta with open('translated_excel_ms.xlsx', 'wb') as output_file: output_file.write(response.content) print('¡Traducción exitosa! Archivo guardado como translated_excel_ms.xlsx') else: # Imprimir detalles del error si algo salió mal print(f'Error: {response.status_code}') print(response.json())Paso 3: Manejo de la respuesta de la API
Después de enviar la solicitud, debe manejar la respuesta de la API.
Una traducción exitosa resultará en un código de estado HTTP de `200 OK`.
El cuerpo de esta respuesta contendrá los datos binarios del archivo Excel traducido, listo para ser guardado.Si ocurre un error, la API devolverá un código de estado diferente (p. ej., `400`, `401`, `500`) junto con un cuerpo JSON.
Este objeto JSON contendrá detalles sobre el error, lo cual es útil para la depuración.
La lógica de su aplicación debe estar preparada para manejar con elegancia tanto los escenarios de éxito como los de error.Consideraciones clave para la traducción de Excel de inglés a malayo
Al traducir documentos de inglés a malayo, hay consideraciones lingüísticas y técnicas específicas a tener en cuenta.
Estos factores van más allá del simple reemplazo de palabras y son cruciales para crear un documento profesional de alta calidad.
Prestar atención a estos detalles asegurará que sus hojas de cálculo traducidas no solo sean precisas, sino también cultural y contextualmente apropiadas.Codificación de caracteres y soporte de fuentes
Como se mencionó, la codificación UTF-8 no es negociable para manejar el texto malayo correctamente.
La Doctranslate API lo gestiona automáticamente, asegurando que todos los caracteres se conserven sin corrupción.
Sin embargo, también debe considerar el soporte de fuentes en el documento final para garantizar una representación adecuada.Asegúrese de que las fuentes utilizadas en su plantilla de Excel admitan la gama completa de caracteres necesarios para el malayo.
Si bien la mayoría de las fuentes modernas tienen un buen soporte Unicode, las fuentes antiguas o personalizadas podrían no tenerlo.
El uso de una fuente ampliamente compatible como Arial o Calibri puede evitar problemas de visualización en la máquina del usuario final.Expansión de texto y formato de celdas
El texto malayo a menudo puede ser más largo o más corto que el texto fuente original en inglés.
Este fenómeno, conocido como expansión o contracción de texto, puede afectar el diseño de su hoja de cálculo.
El texto traducido podría desbordar los límites de las celdas, requiriendo ajustes en los anchos de columna o alturas de fila.Una buena API ayuda a mitigar esto, pero la revisión manual a veces puede ser beneficiosa para documentos críticos para la presentación.
Es posible que deba habilitar ‘Ajustar texto’ en ciertas celdas o ajustar mediante programación los anchos de columna después de la traducción.
Planificar la posible expansión de texto en el diseño de su plantilla original puede ahorrar un esfuerzo considerable más adelante.Matices culturales y localización
La traducción efectiva va más allá del significado literal; requiere localización.
Esto implica adaptar el contenido a las normas culturales y expectativas de la audiencia de habla malaya.
Esto es particularmente importante para elementos como formatos de fecha, símbolos de moneda y unidades de medida.Por ejemplo, los formatos de fecha pueden cambiar de MM/DD/YYYY (común en EE. UU.) a DD/MM/YYYY.
La Doctranslate API se centra en la traducción lingüística, por lo que es importante que la lógica de su aplicación maneje la localización de estos formatos de datos no textuales.
Considerar estos matices culturales hará que su documento final se sienta mucho más natural y profesional para un hablante nativo.Conclusión y próximos pasos
Integrar una potente API de traducción de Excel es la forma más eficiente de manejar la localización compleja de documentos de inglés a malayo.
La Doctranslate API simplifica este proceso al gestionar la codificación, preservar las fórmulas y mantener automáticamente el diseño del documento.
Esto permite a los desarrolladores centrarse en la lógica central de su aplicación en lugar de las complejidades del análisis y la traducción de archivos.Siguiendo los pasos descritos en esta guía, puede crear rápidamente una función de traducción robusta y confiable.
Esto permitirá que su negocio opere de manera más efectiva en los mercados globales, asegurando que los datos sean accesibles y comprensibles para todas las partes interesadas.
Explore nuestra documentación oficial para descubrir funciones avanzadas y mejorar aún más su integración. Para empezar, puede probar nuestro traductor de Excel que mantiene todas las fórmulas y hojas de cálculo perfectamente intactas, asegurando que la integridad de sus datos permanezca intacta.”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}
”
}

Leave a Reply