Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
@@ -1,327 +1,128 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
""
|
99 |
-
|
100 |
-
|
101 |
-
"
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
---
|
131 |
-
|
132 |
-
- "Si tus prospectos te están ignorando más que ex en redes sociales, probablemente necesites lo que estoy a punto de mostrarte, porque tengo el secreto para volverte tan irresistible que hasta tu ex querrá seguirte. Un solo clic y descubrirás cómo dejar de ser el fantasma de las ventas."
|
133 |
-
|
134 |
-
---
|
135 |
-
|
136 |
-
- "Cuando tu estrategia de ventas da más miedo que película de terror en noche de luna llena, sabes que es momento de un cambio radical, así que prepárate para convertir ese guion de horror en un éxito de taquilla. Únete aquí y transformemos esa historia de terror en un blockbuster digno de Oscar."
|
137 |
-
|
138 |
-
---
|
139 |
-
|
140 |
-
- "Entre selfies de tu gato y fotos artísticas de tu café con leche, tu Instagram está suplicando a gritos una estrategia que genere algo más que likes de cortesía y los inevitables comentarios de tu mamá. Aprende a monetizarlo aquí y convierte esos corazoncitos en transferencias bancarias que harán sonreír a tu contador."
|
141 |
-
|
142 |
-
---
|
143 |
-
|
144 |
-
- "¿Tu estrategia de email marketing está más cerrada que búnker en guerra fría? No desesperes, porque todos empezamos construyendo fortalezas impenetrables antes de aprender a abrir las puertas correctas. Descubre aquí cómo crear conexiones genuinas sin necesidad de dinamita digital."
|
145 |
-
|
146 |
-
---
|
147 |
-
|
148 |
-
- "Mientras tus anuncios devoran tu presupuesto como adolescente en buffet libre, tu tarjeta de crédito está enviando señales de socorro. Es hora de poner orden en casa antes que tu banco te declare persona no grata. Aprende a optimizarlos aquí y convierte ese buffet en un menú gourmet de conversiones."
|
149 |
-
|
150 |
-
---
|
151 |
-
|
152 |
-
- "Si tus redes sociales están tan abandonadas que podrían ser el escenario perfecto para 'The Walking Dead: Edición Marketing', no te angusties, porque tengo el plan perfecto para resucitarlas y llenarlas de vida. Descubre aquí cómo convertir ese cementerio digital en un oasis de engagement."
|
153 |
-
|
154 |
-
---
|
155 |
-
|
156 |
-
- "Tu negocio es actualmente más invisible que un ninja usando camuflaje en la oscuridad mientras juega a las escondidas, pero eso está a punto de cambiar. Es momento de encender los reflectores y brillar como supernova en una noche despejada. Aprende aquí la estrategia que te convertirá en el centro de todas las miradas."
|
157 |
-
|
158 |
-
---
|
159 |
-
|
160 |
-
- "Si tu marca está pasando tan desapercibida que hasta los camaleones te dan consejos de visibilidad, es momento de hacer algo al respecto. Prepárate para una transformación tan espectacular que hasta los daltónicos notarán tu presencia. Comienza aquí el cambio que hará que todos volteen a verte (y no puedan dejar de mirarte)."
|
161 |
-
"""
|
162 |
-
},
|
163 |
-
"Dile Adiós a la Espera": {
|
164 |
-
"description": """
|
165 |
-
Formula: [Main benefit + How to achieve it + Direct call to action]
|
166 |
-
This formula not only shows the benefit your audience will gain, but also how they can achieve it immediately. Then, finish with a clear call to action that pushes for immediate action, without beating around the bush. The goal is to be direct and natural, using language that encourages them to act NOW.
|
167 |
-
|
168 |
-
Steps to create the CTA:
|
169 |
-
1. Identify the main benefit your audience is looking to achieve (e.g., increase sales, save time, improve skills).
|
170 |
-
2. Explain how they can achieve that benefit right away (e.g., by joining a program, downloading a guide, booking a session).
|
171 |
-
3. Create a clear and direct call to action, using natural language that motivates immediate action (e.g., "Join now", "Download here", "Reserve your spot").
|
172 |
-
4. Use a direct and persuasive tone, with a sense of urgency or clear benefits.
|
173 |
-
"""
|
174 |
-
"examples": """
|
175 |
-
- "Hoy es el día perfecto para transformar esa lista de suscriptores solitaria en una comunidad tan vibrante que hasta Beyoncé querría unirse, porque todos empezamos desde cero (sí, hasta la mismísima Queen B tuvo su primer fan). Descarga esta guía y prepárate para necesitar una pared entera de Post-its."
|
176 |
-
|
177 |
-
---
|
178 |
-
|
179 |
-
- "¡Llegó la hora de darle superpoderes a tu productividad! Y no, no necesitas que te pique una araña radioactiva, porque tengo el Red Bull mental que transformará tu velocidad como por arte de magia. Regístrate y multiplica tu rendimiento por 300% (efectos secundarios incluyen: éxito excesivo y sonrisa permanente)."
|
180 |
-
|
181 |
-
---
|
182 |
-
|
183 |
-
- "Tu sitio web está a punto de pasar de ser un pueblo fantasma a convertirse en Times Square en Año Nuevo, y lo mejor es que el cambio comienza hoy mismo (y no, no necesitas repartir dulces ni sobornar a nadie). Accede al curso y aprende a atraer visitas como si fueras un imán humano."
|
184 |
-
|
185 |
-
---
|
186 |
-
|
187 |
-
- "Prepárate porque tus próximos emails serán más irresistibles que pizza gratis a medianoche, tanto que hasta los monjes romperán su voto de silencio para responderlos. Descubre cómo escribir emails tan magnéticos que ni el spam se atreverá a tocarlos."
|
188 |
-
|
189 |
-
---
|
190 |
-
|
191 |
-
- "Hoy vamos a hacer algo increíble: convertiremos ese miedo paralizante en tu motor de impulso más poderoso, porque hasta los expertos más exitosos empezaron temblando como gelatina en terremoto. Descarga esta guía y observa cómo tus miedos se transforman en tus mejores aliados."
|
192 |
-
|
193 |
-
---
|
194 |
-
|
195 |
-
- "Bienvenido al momento decisivo donde te unes al selecto club del 11% que triunfa, porque la buena noticia es que el camino ya está trazado y viene con GPS incluido. Únete al programa y forma parte de la élite que hace que las cosas sucedan."
|
196 |
-
|
197 |
-
---
|
198 |
-
|
199 |
-
- "Ha llegado el momento de darle a tu negocio un giro tan espectacular que hasta Elon Musk te pedirá consejos (porque sí, ni siquiera él nació sabiéndolo todo). Accede al curso y aprende a reactivar tu negocio en 30 días o menos."
|
200 |
-
|
201 |
-
---
|
202 |
-
|
203 |
-
- "La automatización está a punto de convertirse en tu nueva BFF, y es mucho más amigable de lo que piensas (además hace todo el trabajo pesado mientras tú disfrutas de un café). Descubre las herramientas que están revolucionando el mercado y únete a la fiesta del futuro."
|
204 |
-
"""
|
205 |
-
},
|
206 |
-
# In each formula where you want to add postdata variations, update the examples like this:
|
207 |
-
|
208 |
-
"Cierre-Urgente": { # Remove extra indentation
|
209 |
-
"description": """
|
210 |
-
Fórmula: [Emoji + Invitación personal + Hora específica + Beneficio claro + Firma personal + Postdata estratégica]
|
211 |
-
Crea conexión inmediata con emoji visual, especifica hora exacta y beneficio claro.
|
212 |
-
Incluye firma personal y postdata persuasiva.
|
213 |
-
""",
|
214 |
-
"examples": """
|
215 |
-
- "👀 Te veo hoy a las 05:00 pm de México para compartirte lo que necesitas saber para conectar, persuadir y vender con tus textos.
|
216 |
-
|
217 |
-
Hasta entonces,
|
218 |
-
Jesús Cabrera
|
219 |
-
|
220 |
-
P.D. Ana, una de mis alumnas, pasó de 0 a 10 clientes en su primer mes. En sus palabras: "Este método cambió mi negocio por completo"
|
221 |
-
|
222 |
-
P.D.2 Solo quedan 3 lugares con el precio especial de lanzamiento"
|
223 |
-
|
224 |
-
- "🚀 Te espero mañana a las 07:00 pm de México para revelarte las 5 estrategias que multiplicarán tus ventas.
|
225 |
-
|
226 |
-
¡Nos vemos!
|
227 |
-
Ana Martínez
|
228 |
-
|
229 |
-
P.D. Recibirás mi guía secreta de copywriting valorada en $197, totalmente gratis
|
230 |
-
|
231 |
-
P.D.2 Horarios por país:
|
232 |
-
07:00 pm: México, Guatemala
|
233 |
-
08:00 pm: Colombia, Ecuador"
|
234 |
-
|
235 |
-
- "💡 Conéctate hoy a las 06:00 pm de Colombia para descubrir cómo crear contenido viral.
|
236 |
-
|
237 |
-
¡Prepárate para transformar tu contenido!
|
238 |
-
Carlos Ruiz
|
239 |
-
|
240 |
-
P.D. Esta es la última vez que impartiré este webinar en el año
|
241 |
-
|
242 |
-
P.D.2 El 87% de mis estudiantes logran sus primeras ventas en menos de 30 días"
|
243 |
-
"""
|
244 |
-
},
|
245 |
-
"Cierre-Emocional": { # Remove extra indentation
|
246 |
-
"description": """
|
247 |
-
Fórmula: [Emoji + Expresión emocional + Anticipación de valor + Acción clara + Beneficio aspiracional + Firma personal + Postdata persuasiva]
|
248 |
-
Crea conexión emocional y genera expectativa, usando tono cercano y amigable.
|
249 |
-
Enfatiza el valor futuro y la transformación personal.
|
250 |
-
""",
|
251 |
-
"examples": """
|
252 |
-
- "✨ Estoy tan emocionado por verte para aplicar todos estos conceptos.
|
253 |
-
|
254 |
-
Haz clic aquí para registrarte al webinar y volverte el copy que todo mundo quiere que les escriba sus textos.
|
255 |
-
|
256 |
-
Hasta luego,
|
257 |
-
Jesús Cabrera
|
258 |
-
|
259 |
-
P.D. Laura comenzó como tú, dudando si podría lograrlo. Hoy tiene lista de espera de clientes: "El método de Jesús me dio la confianza que necesitaba"
|
260 |
-
|
261 |
-
P.D.2 Los primeros 20 inscritos recibirán una sesión privada de revisión de copy (valor: $150)"
|
262 |
-
|
263 |
-
- "🌟 No puedo esperar para compartirte todas las estrategias que he preparado.
|
264 |
-
|
265 |
-
Reserva tu lugar ahora y conviértete en el experto en ventas que las marcas buscan desesperadamente.
|
266 |
-
|
267 |
-
¡Nos vemos pronto!
|
268 |
-
María González
|
269 |
-
|
270 |
-
P.D. Te incluiré mi biblioteca privada de plantillas de copy, nunca antes compartida
|
271 |
-
|
272 |
-
P.D.2 Esta es la única vez en el año que abriré las puertas de este programa"
|
273 |
-
|
274 |
-
- "💫 Me emociona saber que pronto descubrirás todo lo que puedes lograr.
|
275 |
-
|
276 |
-
Asegura tu acceso al taller y transfórmate en el consultor digital que las empresas necesitan.
|
277 |
-
|
278 |
-
Con entusiasmo,
|
279 |
-
Carlos Mendoza
|
280 |
-
|
281 |
-
P.D. El 92% de mis estudiantes consiguen su primer cliente en menos de 2 semanas
|
282 |
-
|
283 |
-
P.D.2 Bonus sorpresa: Recibirás mi guía "Del fracaso al éxito" con mis mejores casos de estudio"
|
284 |
-
"""
|
285 |
-
},
|
286 |
-
"Cierre-Divertido": { # Remove extra indentation
|
287 |
-
"description": """
|
288 |
-
Fórmula: [Emoji + Pregunta divertida + Metáfora creativa + Hora específica + Firma con apodo + Postdata estratégica]
|
289 |
-
Usa humor y metáforas creativas para generar interés y anticipación.
|
290 |
-
Incluye un toque personal con apodo divertido en la firma y postdata entretenida.
|
291 |
-
""",
|
292 |
-
"examples": """
|
293 |
-
- "🔥 ¿Listo para sacarle chispas a tus textos? Porque esta tarde te enseñaré cómo convertir palabras en armas secretas de persuasión.
|
294 |
-
|
295 |
-
Te espero a las 05:00 pm de México, no llegues tarde.
|
296 |
-
|
297 |
-
Hasta entonces,
|
298 |
-
Jesús "el transformador de textos" Cabrera
|
299 |
-
|
300 |
-
P.D. ¿Sabías que Pedro "el tímido" López ahora es conocido como "el rey de las ventas"? Sus emails tienen un 89% de apertura 🤯
|
301 |
-
|
302 |
-
P.D.2 Bonus ninja: Recibirás mi arsenal secreto de frases que hipnotizan 🎯"
|
303 |
-
|
304 |
-
- "⚡ ¿Preparado para hacer que tu Instagram eche humo? Hoy revelaré los trucos ninja del contenido viral.
|
305 |
-
|
306 |
-
La diversión comienza a las 07:00 pm hora México, ¡no te lo pierdas!
|
307 |
-
|
308 |
-
Nos vemos al rato,
|
309 |
-
Ana "la maga del engagement" Rodríguez
|
310 |
-
|
311 |
-
P.D. Spoiler alert: Uno de mis alumnos logró 100k seguidores usando solo el truco #3 🚀
|
312 |
-
|
313 |
-
P.D.2 Los primeros 10 ninjas del marketing que se registren recibirán mi kit de supervivencia viral 🎁"
|
314 |
-
|
315 |
-
- "🎯 ¿Quieres que tus emails sean tan adictivos como tu serie favorita de Netflix? Prepárate para el maratón de copywriting más entretenido del año.
|
316 |
-
|
317 |
-
La magia sucede a las 06:00 pm Colombia, ¡trae palomitas!
|
318 |
-
|
319 |
-
¡Hasta pronto!
|
320 |
-
Carlos "el hechicero de emails" Mendoza
|
321 |
-
|
322 |
-
P.D. Mis estudiantes dicen que este entrenamiento es más entretenido que la última temporada de tu serie favorita 😎
|
323 |
-
|
324 |
-
P.D.2 ¡Alerta de tesoro! Incluí mi colección de templates "Email Alquimista" (Valor real: $197) 💎"
|
325 |
-
"""
|
326 |
-
}
|
327 |
-
}
|
|
|
1 |
+
from dotenv import load_dotenv
|
2 |
+
import streamlit as st
|
3 |
+
import os
|
4 |
+
import google.generativeai as genai
|
5 |
+
from cta_formulas import cta_formulas
|
6 |
+
from styles import apply_styles
|
7 |
+
|
8 |
+
# Cargar variables de entorno
|
9 |
+
load_dotenv()
|
10 |
+
|
11 |
+
# Configurar API de Google Gemini
|
12 |
+
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
13 |
+
|
14 |
+
def get_gemini_response(product_service, target_audience, desired_action, formula_type, temperature):
|
15 |
+
if not product_service or not target_audience or not desired_action:
|
16 |
+
return "Por favor, completa todos los campos requeridos."
|
17 |
+
|
18 |
+
formula = cta_formulas[formula_type]
|
19 |
+
|
20 |
+
model = genai.GenerativeModel('gemini-2.0-flash')
|
21 |
+
full_prompt = f"""
|
22 |
+
You are an expert copywriter specialized in creating persuasive Calls to Action (CTAs).
|
23 |
+
Analyze (internally, don't include in output) the following information:
|
24 |
+
|
25 |
+
BUSINESS INFORMATION:
|
26 |
+
Product/Service: {product_service}
|
27 |
+
Target Audience: {target_audience}
|
28 |
+
Desired Action: {desired_action}
|
29 |
+
CTA Type: {formula_type}
|
30 |
+
{formula["description"]}
|
31 |
+
|
32 |
+
EXAMPLES TO FOLLOW:
|
33 |
+
{formula["examples"]}
|
34 |
+
|
35 |
+
First, analyze (but don't show) these points:
|
36 |
+
1. TARGET AUDIENCE ANALYSIS:
|
37 |
+
- What motivates them to take action?
|
38 |
+
- What obstacles prevent them from acting?
|
39 |
+
- What immediate benefits are they seeking?
|
40 |
+
- What fears or doubts do they have?
|
41 |
+
- What language and tone resonates with them?
|
42 |
+
|
43 |
+
2. PERSUASION ELEMENTS:
|
44 |
+
- How to make the desired action more appealing?
|
45 |
+
- What emotional triggers will resonate most?
|
46 |
+
- How to create a sense of urgency naturally?
|
47 |
+
- What unique value proposition to emphasize?
|
48 |
+
- How to minimize perceived risk?
|
49 |
+
|
50 |
+
Based on your internal analysis, create THREE different CTAs following EXACTLY the formula structure:
|
51 |
+
{formula["description"]}
|
52 |
+
|
53 |
+
CRITICAL INSTRUCTIONS:
|
54 |
+
- Follow the exact formula structure shown in the description above
|
55 |
+
- Create THREE different CTAs using the same formula pattern
|
56 |
+
- ALL CTAs MUST BE IN SPANISH
|
57 |
+
|
58 |
+
Use these examples as reference for the formula structure:
|
59 |
+
{formula["examples"]}
|
60 |
+
Output EXACTLY in this format based on {formula_type}:
|
61 |
+
1. Follow format from {formula["examples"]}
|
62 |
+
|
63 |
+
2. Follow format from {formula["examples"]}
|
64 |
+
|
65 |
+
3. Follow format from {formula["examples"]}
|
66 |
+
"""
|
67 |
+
|
68 |
+
response = model.generate_content([full_prompt], generation_config={"temperature": temperature})
|
69 |
+
return response.parts[0].text if response and response.parts else "Error al generar contenido."
|
70 |
+
|
71 |
+
# Configurar la aplicación Streamlit
|
72 |
+
st.set_page_config(page_title="CTA Generator", page_icon="🎯", layout="wide")
|
73 |
+
|
74 |
+
# Aplicar estilos
|
75 |
+
st.markdown(apply_styles(), unsafe_allow_html=True)
|
76 |
+
|
77 |
+
# Título de la app
|
78 |
+
st.markdown("<h1>Generador de CTAs Persuasivos</h1>", unsafe_allow_html=True)
|
79 |
+
st.markdown("<h3>Crea llamados a la acción que motiven a tu audiencia a dar el siguiente paso.</h3>", unsafe_allow_html=True)
|
80 |
+
|
81 |
+
# Crear dos columnas
|
82 |
+
col1, col2 = st.columns([1, 1])
|
83 |
+
|
84 |
+
# Columna izquierda para inputs
|
85 |
+
with col1:
|
86 |
+
target_audience = st.text_area(
|
87 |
+
"¿Cuál es tu público objetivo?",
|
88 |
+
placeholder="Ejemplo: Emprendedores que buscan automatizar su negocio..."
|
89 |
+
)
|
90 |
+
|
91 |
+
product_service = st.text_area(
|
92 |
+
"¿Cuál es tu producto o servicio?",
|
93 |
+
placeholder="Ejemplo: Curso de automatización con IA, Software de gestión..."
|
94 |
+
)
|
95 |
+
|
96 |
+
desired_action = st.text_area(
|
97 |
+
"¿Qué acción quieres que realicen?",
|
98 |
+
placeholder="Ejemplo: Registrarse al webinar, Descargar la guía gratuita..."
|
99 |
+
)
|
100 |
+
|
101 |
+
with st.expander("Opciones avanzadas"):
|
102 |
+
formula_type = st.selectbox(
|
103 |
+
"Tipo de CTA:",
|
104 |
+
options=list(cta_formulas.keys())
|
105 |
+
)
|
106 |
+
|
107 |
+
temperature = st.slider(
|
108 |
+
"Nivel de creatividad:",
|
109 |
+
min_value=0.0,
|
110 |
+
max_value=2.0,
|
111 |
+
value=1.0,
|
112 |
+
step=0.1,
|
113 |
+
help="Valores más altos generan CTAs más creativos pero menos predecibles."
|
114 |
+
)
|
115 |
+
|
116 |
+
generate_button = st.button("Generar CTAs")
|
117 |
+
|
118 |
+
# Columna derecha para resultados
|
119 |
+
with col2:
|
120 |
+
if generate_button and (response := get_gemini_response(
|
121 |
+
product_service,
|
122 |
+
target_audience,
|
123 |
+
desired_action,
|
124 |
+
formula_type,
|
125 |
+
temperature
|
126 |
+
)):
|
127 |
+
st.markdown("### Tus Llamados a la Acción")
|
128 |
+
st.write(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|