AWS CodeDeploy ile Otomatik Dağıtım: Adım Adım Rehber

Uygulamalarını her deploy ettiğinde SSH ile sunucuya bağlanıp manuel komutlar mı çalıştırıyorsun? Geceleri deployment yapıp bir şeyler bozulunca saatler mi harcıyorsun? AWS CodeDeploy tam da bu derdi çözmek için var. Bugün sıfırdan kurulum yapıp gerçek dünya senaryolarını ele alacağız.

AWS CodeDeploy Nedir ve Neden Kullanmalısın?

CodeDeploy, AWS’nin tam yönetilen deployment servisidir. EC2 instance’larına, on-premise sunuculara, Lambda fonksiyonlarına ve ECS üzerine otomatik kod deployment yapmanı sağlar. Ancak asıl gücü şurada: deployment stratejileri. Rolling update, blue/green deployment gibi stratejilerle production ortamına sıfır kesinti ile uygulama gönderebilirsin.

Manuel deployment’ın en büyük sorunu tutarsızlık. Bir sunucuya deployment yaparken ağ koptu, diğer sunucular eski versiyonda kaldı, trafiğin bir kısmı eski versiyona düşüyor. CodeDeploy bu kaos ortamını ortadan kaldırır ve her şeyi merkezi, tekrarlanabilir ve denetlenebilir hale getirir.

Temel Kavramlar

CodeDeploy’u kullanmadan önce birkaç kavramı kafana oturtman gerekiyor:

  • Application: CodeDeploy içindeki en üst seviye kaynak. Deploy edeceğin uygulamayı temsil eder.
  • Deployment Group: Hangi instance’lara deploy yapacağını belirler. Tag’lere veya Auto Scaling Group’lara göre gruplandırabilirsin.
  • Deployment Configuration: Rolling update oranını, başarı eşiğini belirler. AllAtOnce, HalfAtATime, OneAtATime gibi hazır konfigürasyonlar var.
  • AppSpec: Deployment adımlarını tanımlayan YAML veya JSON dosyası. Bu dosya olmadan hiçbir şey çalışmaz.
  • Revision: Deploy etmek istediğin kod paketi. S3’te veya GitHub’da olabilir.

Kurulum ve Ön Gereksinimler

IAM Rolleri Oluşturma

CodeDeploy’un çalışabilmesi için iki ayrı IAM rolü gerekir: biri CodeDeploy servisinin EC2’ye erişmesi için, diğeri EC2 instance’ının S3’ten paketi çekebilmesi için.

Önce CodeDeploy servis rolünü oluşturalım:

# CodeDeploy servis rolü için trust policy dosyası oluştur
cat > codedeploy-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codedeploy.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# Rolü oluştur
aws iam create-role 
  --role-name CodeDeployServiceRole 
  --assume-role-policy-document file://codedeploy-trust-policy.json

# AWS yönetilen policy'yi ekle
aws iam attach-role-policy 
  --role-name CodeDeployServiceRole 
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole

Şimdi EC2 instance rolünü oluşturalım:

# EC2 için trust policy
cat > ec2-trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# EC2 rolünü oluştur
aws iam create-role 
  --role-name EC2CodeDeployRole 
  --assume-role-policy-document file://ec2-trust-policy.json

# S3 okuma yetkisi ver
aws iam attach-role-policy 
  --role-name EC2CodeDeployRole 
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

# Instance profile oluştur ve role ekle
aws iam create-instance-profile 
  --instance-profile-name EC2CodeDeployProfile

aws iam add-role-to-instance-profile 
  --instance-profile-name EC2CodeDeployProfile 
  --role-name EC2CodeDeployRole

CodeDeploy Agent Kurulumu

EC2 instance’larına CodeDeploy Agent kurman şart. Agent olmadan deployment çalışmaz. Amazon Linux 2 üzerinde kurulum şöyle yapılır:

# Sistemi güncelle
sudo yum update -y

# CodeDeploy agent için gerekli paketleri yükle
sudo yum install -y ruby wget

# Agent kurulum scriptini indir
cd /home/ec2-user
wget https://aws-codedeploy-eu-west-1.s3.eu-west-1.amazonaws.com/latest/install

# Çalıştırma izni ver ve kur
chmod +x ./install
sudo ./install auto

# Servisi başlat ve etkinleştir
sudo systemctl start codedeploy-agent
sudo systemctl enable codedeploy-agent

# Durumu kontrol et
sudo systemctl status codedeploy-agent

Ubuntu/Debian sistemler için ise şöyle yapabilirsin:

sudo apt-get update
sudo apt-get install -y ruby wget

cd /home/ubuntu
wget https://aws-codedeploy-eu-west-1.s3.eu-west-1.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto

sudo service codedeploy-agent start

EC2 Instance Etiketleme

CodeDeploy hangi sunuculara deploy yapacağını tag’lere göre belirler. Bu yüzden instance’larını düzgün etiketlemen kritik:

# Instance'ına tag ekle
aws ec2 create-tags 
  --resources i-0123456789abcdef0 
  --tags Key=Environment,Value=Production Key=Application,Value=MyWebApp

# Tag'leri doğrula
aws ec2 describe-tags 
  --filters "Name=resource-id,Values=i-0123456789abcdef0"

AppSpec Dosyası Hazırlama

AppSpec dosyası, deployment sürecinin tam merkezi. Hangi dosyaların nereye kopyalanacağını ve her aşamada hangi scriptlerin çalışacağını burada tanımlıyorsun.

# appspec.yml
version: 0.0
os: linux
files:
  - source: /app
    destination: /var/www/myapp
  - source: /config/nginx.conf
    destination: /etc/nginx/conf.d/myapp.conf

permissions:
  - object: /var/www/myapp
    owner: www-data
    group: www-data
    mode: "755"
    type:
      - directory
  - object: /var/www/myapp
    owner: www-data
    group: www-data
    mode: "644"
    type:
      - file

hooks:
  BeforeInstall:
    - location: scripts/stop_server.sh
      timeout: 30
      runas: root
  AfterInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
      timeout: 30
      runas: root
  ValidateService:
    - location: scripts/validate_service.sh
      timeout: 60
      runas: root

Hook scriptlerini de hazırlaman lazım:

# scripts/stop_server.sh
#!/bin/bash
set -e

echo "Uygulama durduruluyor..."

if systemctl is-active --quiet myapp; then
    systemctl stop myapp
    echo "Uygulama durduruldu"
else
    echo "Uygulama zaten durumda, devam ediliyor"
fi

# Nginx'i de durdur
if systemctl is-active --quiet nginx; then
    systemctl stop nginx
fi

exit 0
# scripts/validate_service.sh
#!/bin/bash
set -e

echo "Servis dogrulanıyor..."

# Uygulamanın ayağa kalkması için bekle
sleep 5

# HTTP kontrolü yap
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health)

if [ "$RESPONSE" = "200" ]; then
    echo "Servis basariyla calisiyor. HTTP 200 alindi."
    exit 0
else
    echo "HATA: Servis yanit vermiyor. HTTP kodu: $RESPONSE"
    exit 1
fi

CodeDeploy Application ve Deployment Group Oluşturma

AWS CLI ile her şeyi otomatize edebilirsin:

# Application oluştur
aws deploy create-application 
  --application-name MyWebApp 
  --compute-platform Server 
  --region eu-west-1

# Deployment Group oluştur
aws deploy create-deployment-group 
  --application-name MyWebApp 
  --deployment-group-name ProductionGroup 
  --deployment-config-name CodeDeployDefault.HalfAtATime 
  --ec2-tag-filters Key=Application,Value=MyWebApp,Type=KEY_AND_VALUE 
                    Key=Environment,Value=Production,Type=KEY_AND_VALUE 
  --service-role-arn arn:aws:iam::123456789012:role/CodeDeployServiceRole 
  --auto-rollback-configuration enabled=true,events=DEPLOYMENT_FAILURE 
  --region eu-west-1

–deployment-config-name parametresi önemli. Hazır seçenekler şunlar:

  • CodeDeployDefault.AllAtOnce: Tüm instance’lara aynı anda deploy yapar. Hızlıdır ama risklidir.
  • CodeDeployDefault.HalfAtATime: Instance’ların yarısına deploy yapar, başarılı olursa diğer yarısına geçer.
  • CodeDeployDefault.OneAtATime: Sırayla tek tek deploy yapar. En güvenlisi ama en yavaşı.

Deployment Paketi Hazırlama ve S3’e Yükleme

Deployment paketi, appspec.yml ve uygulama dosyalarını içeren sıkıştırılmış dosyadır:

# Proje yapısı şöyle olmalı:
# myapp/
# ├── appspec.yml
# ├── app/
# │   ├── index.html
# │   └── app.js
# ├── config/
# │   └── nginx.conf
# └── scripts/
#     ├── stop_server.sh
#     ├── install_dependencies.sh
#     ├── start_server.sh
#     └── validate_service.sh

# Paketi oluştur
cd myapp
zip -r ../myapp-v1.2.0.zip . -x "*.git*"

# S3'e yükle
aws s3 cp ../myapp-v1.2.0.zip 
  s3://my-deployment-bucket/releases/myapp-v1.2.0.zip 
  --region eu-west-1

# Deployment başlat
aws deploy create-deployment 
  --application-name MyWebApp 
  --deployment-group-name ProductionGroup 
  --s3-location bucket=my-deployment-bucket,bundleType=zip,key=releases/myapp-v1.2.0.zip 
  --description "v1.2.0 release - yeni ozellikler eklendi" 
  --region eu-west-1

Gerçek Dünya Senaryosu: CI/CD Pipeline’a Entegrasyon

Pratikte CodeDeploy’u hiç kimse tek başına kullanmaz. GitHub Actions veya Jenkins ile birlikte kullanmak asıl gücü ortaya çıkarır.

Bir GitHub Actions workflow’u şöyle görünebilir:

# .github/workflows/deploy.yml
name: Production Deployment

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Kodu cek
        uses: actions/checkout@v3

      - name: AWS kimlik bilgilerini ayarla
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: eu-west-1

      - name: Node.js bagimliliklerini yukle ve test et
        run: |
          npm install
          npm test

      - name: Deployment paketini olustur
        run: |
          VERSION=$(git rev-parse --short HEAD)
          zip -r deploy-${VERSION}.zip . 
            -x "*.git*" 
            -x "node_modules/*" 
            -x "*.test.js"
          echo "DEPLOY_VERSION=${VERSION}" >> $GITHUB_ENV

      - name: S3'e yukle
        run: |
          aws s3 cp deploy-${DEPLOY_VERSION}.zip 
            s3://my-deployment-bucket/releases/deploy-${DEPLOY_VERSION}.zip

      - name: CodeDeploy deployment baslatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlatlat

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir