Jaeger v2 کا استعمال کرتے ہوئے ملٹی ایجنٹ AI swarms کو کیسے ٹریک کریں۔

واحد AI ایجنٹ کو چلانے سے ڈیبگنگ آسان ہو جاتی ہے۔ کیا ہوا یہ جاننے کے لیے لاگ پڑھیں۔

اگر آپ کے پاس 5 ایجنٹس چل رہے ہیں، ہر ایک اپنی ٹول کال کرتا ہے اور اپنا آؤٹ پٹ تیار کرتا ہے، "لاگ پڑھنا” اب کوئی حکمت عملی نہیں ہے۔

میں نے Claude Forge کو Claude Code کے اوپر ایک مخالف ملٹی ایجنٹ کوڈنگ فریم ورک کے طور پر بنایا ہے۔ ایک عام دوڑ سے منصوبہ ساز، عمل درآمد کرنے والے، جائزہ لینے والے، اور ترمیم کرنے والے پیدا ہوتے ہیں۔ وہ ایک دوسرے کے کام کا جائزہ لیتے ہیں اور معیار کی جانچ میں ناکام ہونے پر واپس آجاتے ہیں۔

لیکن جب کچھ غلط ہونے پر ٹائم اسٹیمپ اور ٹیکسٹ ڈمپ ہوتے تھے، تو اس بات کا تعین کرنے کا کوئی طریقہ نہیں تھا کہ کون سا ایجنٹ ذمہ دار ہے، اس میں اصل میں کتنا وقت لگا، یا ٹوکن کہاں گئے۔

جیجر نے اسے ٹھیک کیا۔ اس مضمون میں ڈوکر کا استعمال کرتے ہوئے Jaeger v2 کو ترتیب دینے اور OpenTelemetry کے ذریعے ملٹی ایجنٹ سسٹم سے منسلک کرنے کا طریقہ، اور راستے میں ہم نے کیا سیکھا۔

انڈیکس

تقسیم شدہ ٹریسنگ کیا ہے؟

تقسیم شدہ ٹریسنگ متعدد خدمات کے ذریعے منتقل ہونے والے ایک کام کو ٹریک کرتی ہے۔ رینج کام کی ایک اکائی ہے جس میں آغاز کا وقت، اختتامی وقت، اور کلیدی قدر کی خصوصیات شامل ہیں۔ اسپینز والدین کے بچوں کے درختوں میں گھونسلے ہیں۔ ایک درخت فی کام ایک ٹریس ہے۔

مائیکرو سروسز لوگ پہلے سے ہی اس پیٹرن کو جانتے ہیں۔ توثیق، ڈیٹا بیس، اور کیشے کے ذریعے گیٹ وے سے HTTP درخواستوں کی پیروی کرتا ہے۔ یہی خیال ملٹی ایجنٹ AI پر بھی لاگو ہوتا ہے۔ یہ ہر ذیلی ایجنٹ اور اس سے متعلقہ ٹول کالز کے ذریعے آرکیسٹریٹر کی کالوں کے ایک گروپ کی پیروی کرتا ہے۔

OpenTelemetry (OTel) معیاری ہے۔ ہم اسکوپس بنانے اور انہیں OTLP کے ذریعے بھیجنے کے لیے SDK فراہم کرتے ہیں۔ Jaeger وہ ڈیٹا وصول کرتا ہے اور اسے تلاش کے قابل ٹائم لائن میں پیش کرتا ہے۔

Jaeger v2 کیوں؟

Jaeger نے Uber سے آغاز کیا اور 2019 میں CNCF پروجیکٹ کے لیے گریجویشن کیا۔ v1 دسمبر 2025 میں سروس کے اختتام کو پہنچا۔ v2 موجودہ ریلیز ہے جو OpenTelemetry کلکٹر فریم ورک پر بنایا گیا ہے۔ سنگل بائنری: کلکٹر، استفسار سروس اور UI۔ پہلے سے طے شدہ طور پر، OTLP بندرگاہوں 4317 (gRPC) اور 4318 (HTTP) پر فعال ہے۔ مقامی آپریشنز کے لیے الگ کلکٹر کی ضرورت نہیں ہوتی۔

v1 سے ایک اہم فرق یہ ہے کہ ترتیب کو CLI جھنڈوں اور ماحولیاتی متغیرات سے YAML فائلوں میں منتقل کر دیا گیا ہے۔ قابل احترام -e SPAN_STORAGE_TYPE=badger env vars کو خود بخود v2 میں نظر انداز کر دیا جاتا ہے۔ کنٹینر عام طور پر شروع ہوتا ہے لیکن ان میموری اسٹوریج پر واپس آجاتا ہے۔ میں نے اسے محسوس کرنے سے پہلے دو دن تک پگڈنڈی کھو دی۔ ذیل میں درست ترتیبات کے بارے میں مزید جانیں۔

شرطیں

  • ڈاکر یہ انسٹال اور چل رہا ہے۔

  • کلاڈ کوڈ انسٹال

  • Python 3.8+ ٹریکنگ ہکس کے لیے۔

  • کلاڈ پوسی متبادل طور پر، آپ دوسرے ملٹی ایجنٹ سسٹمز کو آلہ بنا سکتے ہیں۔

ڈیبین پر ڈوکر انسٹال کرنا

اگر آپ کے پاس پہلے سے ہی Docker ہے تو اس قدم کو چھوڑ دیں۔ macOS اور Windows صارفین Docker Desktop استعمال کر سکتے ہیں۔ ڈیبین پر:

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/debian \
  \((. /etc/os-release && echo "\)VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker

اوبنٹو صارفین: دونوں کو تبدیل کریں۔ linux/debian URL پر مشتمل ہے: linux/ubuntu.

Jaeger v2 کی ترتیبات

پہلے سے طے شدہ عملدرآمد

مستقل مزاجی کے بغیر جلدی ٹیسٹ کرنے کے لیے:

docker run -d --name jaeger \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  jaegertracing/jaeger:2.17.0

پورٹ 16686 UI ہے۔ پورٹ 4317 OTLP/gRPC مجموعہ ہے۔ پورٹ 4318 OTLP/HTTP ہے۔ جب کنٹینر ہٹا دیا جاتا ہے، ٹریس غائب ہو جاتا ہے.

بیجر کے ساتھ مستقل اسٹوریج

v2 ماحولیاتی متغیرات کے بجائے YAML فائلوں سے کنفیگریشن پڑھتا ہے۔ اس کو بطور محفوظ کریں۔ ~/.local/share/jaeger/config.yaml:

service:
  extensions: [jaeger_storage, jaeger_query, healthcheckv2]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [jaeger_storage_exporter]
extensions:
  healthcheckv2:
    use_v2: true
    http: { endpoint: 0.0.0.0:13133 }
  jaeger_query:
    storage: { traces: main_store }
  jaeger_storage:
    backends:
      main_store:
        badger:
          directories: { keys: /badger/key, values: /badger/data }
          ephemeral: false
          ttl: { spans: 720h }
receivers:
  otlp:
    protocols:
      grpc: { endpoint: 0.0.0.0:4317 }
      http: { endpoint: 0.0.0.0:4318 }
processors:
  batch:
exporters:
  jaeger_storage_exporter:
    trace_storage: main_store

Jaeger کنٹینر UID 10001 کے ساتھ چلتا ہے۔ ڈوکر نے جلد کی ملکیت کو پہلے سے طے شدہ نام دیا ہے۔ اگر آپ پہلے اجازتوں کو ٹھیک نہیں کرتے ہیں، تو آپ کا کنٹینر اس طرح کریش لوپ میں چلا جائے گا: mkdir /badger/key: permission denied.

حجم پہلے سے بنائیں اور ملکیت میں ترمیم کریں۔

docker volume create jaeger-data

docker run --rm \
  -v jaeger-data:/badger \
  alpine sh -c "mkdir -p /badger/data /badger/key && chown -R 10001:10001 /badger"

پھر Jaeger کو نصب کنفیگریشن کے ساتھ چلائیں۔

docker run -d --name jaeger \
  --restart unless-stopped \
  -v ~/.local/share/jaeger/config.yaml:/etc/jaeger/config.yaml:ro \
  -v jaeger-data:/badger \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  jaegertracing/jaeger:2.17.0 \
  --config /etc/jaeger/config.yaml

دوڑ کر استقامت چیک کریں: docker restart jaeger یہ دیکھنے کے لیے چیک کریں کہ آیا کوئی پہلے ریکارڈ شدہ نشانات اب بھی موجود ہیں۔ شیلک http://localhost:16686 UI نظر آنا چاہیے۔

کلاڈ فورج ٹریکنگ کی ترتیبات

کلاڈ فورج انسٹال کریں۔

کلاڈ کوڈ پلگ ان مارکیٹ پلیس کے ذریعے انسٹال کریں۔

/plugin marketplace add hatmanstack/claude-forge
/plugin install forge@claude-forge
/reload-plugins

تنصیب کے بعد، دائرہ کار اور ترتیبات کی تصدیق کے لیے ایک TUI کھل جائے گا۔ دوبارہ لوڈ کرنے کے بعد، کمانڈ استعمال کرتا ہے: forge: سابقہ، جیسے /forge:pipeline

آپ GitHub سے بھی ذخیرہ کلون کر سکتے ہیں۔

ٹریکنگ ہک کی تنصیب

ٹارگٹ پروجیکٹ ڈائرکٹری سے انسٹالیشن اسکرپٹ چلائیں۔ پلگ ان کی تنصیب کے لیے:

cd your-project
forge-trace                # if you set up the alias from the README
# or, without the alias:
bash "$(find ~/.claude -path '*/forge*' -name install-tracing.sh 2>/dev/null | head -1)"

کلون کی تنصیب کے لیے:

cd your-project
bash /path/to/claude-forge/bin/install-tracing.sh

اسکرپٹ مندرجہ ذیل جگہ پر ایک وقف شدہ venv بناتا ہے: ~/.local/share/claude-forge/venv (ترجیحی uvاگلی بار واپس جائیں۔ python3 -m venv)، OpenTelemetry پیکیج انسٹال کریں، ہک کو جگہ پر کاپی کریں، اور ہک انٹری کو تبدیل کریں .claude/settings.local.jsonOTLP اینڈ پوائنٹس پر اپنے ٹیسٹ خود کریں۔

پاس --no-settings ضم کرنے کی ترتیبات کو چھوڑیں یا --uninstall سب کچھ اکھاڑ پھینکنے کے لیے۔

منتخب کریں۔

شیل کی شروعات میں شامل کریں اور ٹرمینل کو دوبارہ شروع کریں۔

export CLAUDE_FORGE_TRACING=1

کلاڈ کوڈ کو دوبارہ شروع کریں اور اسے چلائیں۔ /pipelineپھر چیک کریں۔ http://localhost:16686 کے لیے claude-forge سروس

اسپین ماڈل کو سمجھنا

ایک عام بھیڑ پر عمل درآمد کا درجہ بندی مندرجہ ذیل ہے:

session: "implement login form with OAuth"        <- root span
├── subagent:planner
│   ├── tool:Write  (Phase-0.md)                  <- mutation spans (on by default)
│   ├── tool:Write  (Phase-1.md)
│   └── subagent_result:planner                   <- duration, token counts, output
├── subagent:implementer
│   ├── tool:Edit   (src/auth.ts)
│   ├── tool:Bash   (npm test)
│   ├── tool:Write  (src/oauth.ts)
│   └── subagent_result:implementer
├── subagent:reviewer
│   └── subagent_result:reviewer
└── session_complete                              <- session totals

روٹ اسپین کا نام پرامپٹ کی پہلی لائن سے آتا ہے۔ آپ نے جو درخواست کی ہے اس سے ٹریس تلاش کریں، UUID سے نہیں۔

ذیلی ایجنٹوں کو سٹارٹ اپ پر اینکر اسکوپ اور تکمیل پر نتیجہ کی گنجائش ملتی ہے۔ نتائج میں دورانیہ، ٹوکنز کی تعداد، اشارے، اور آؤٹ پٹ شامل ہیں۔

تفصیل کی تین پرتیں۔

تمام اندرونی ٹول کالیں اتنی ہی دلچسپ نہیں ہوتیں۔ تحریر، تدوین، ملٹی ایڈیٹ اور باش اتپریورتی ہیں۔ نمبر کم اور سگنل زیادہ۔ وہ آپ کو بتاتے ہیں کہ اصل میں کیا بدلا ہے۔ پڑھیں، گلوب، گریپ، اور ویب فیچ نیویگیشن ہیں۔ اس میں زیادہ تر شور ہے۔

ٹریکنگ تبدیلیوں کو بطور ڈیفالٹ کیپچر کرتا ہے۔ وہ درمیانی زمین درست نکلی۔ اس تبدیلی سے پہلے، یا تو ذیلی ایجنٹ کے اندر کچھ بھی نہیں دکھایا گیا تھا، یا فی رن 200 سے زیادہ اسکوپس دکھائے گئے تھے۔

طریقہ ذیلی ایجنٹ تغیرات (لکھیں/ترمیم کریں/بش) دیگر اندرونی ٹولز
بنیادی ہاں ہاں نہیں
CLAUDE_FORGE_TRACE_INNER=1 ہاں ہاں ہاں (مائنس بلیک لسٹ)
CLAUDE_FORGE_TRACE_MUTATIONS=0 ہاں نہیں نہیں (یا INNER پر منحصر ہے)

span کی خصوصیت

کو session_complete: session.tokens.input, session.tokens.output, session.tokens.total, session.tokens.turns, session.duration_ms, user.prompt (پہلا 2KB)۔

کو subagent_result: agent.description, agent.prompt, agent.output, agent.duration_ms, agent.is_error, agent.tokens.input, agent.tokens.output.

کو tool:*: tool.name, tool.input, tool.output, tool.duration_ms, tool.is_error.

ملٹی ایجنٹ سوارم انسٹرومینٹیشن

ہک فن تعمیر

کلاڈ کوڈ میں لائف سائیکل ہکس ہوتے ہیں جو مخصوص واقعات پر اسکرپٹ چلاتے ہیں۔ یہاں چار چیزیں اہم ہیں:

  1. صارف پرامپٹ جمع کروائیں۔ (جڑ کی گنجائش بنائیں)

  2. پری ٹول کا استعمال (اسپین کا آغاز)

  3. پوسٹ ٹول کا استعمال (نتائج کے ساتھ ختم) اور

  4. روکنا (پیچھا ختم کرتے ہوئے)۔ ہر ہک stdin سے JSON پے لوڈ لیتا ہے اور ذیلی عمل کے طور پر چلتا ہے۔

OpenTelemetry کا استعمال کرتے ہوئے اسپین بھیجیں۔

یہاں کم سے کم ازگر ہے جس کی آپ کو جیگر پر گنجائش حاصل کرنے کی ضرورت ہے:

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource

resource = Resource.create({"service.name": "my-agent-system"})
exporter = OTLPSpanExporter(endpoint="http://localhost:4317", insecure=True)
provider = TracerProvider(resource=resource)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)

tracer = trace.get_tracer("agent-tracer")

with tracer.start_as_current_span("my-agent-task") as span:
    span.set_attribute("agent.name", "planner")
    span.set_attribute("agent.tokens.input", 1500)
    span.set_attribute("agent.tokens.output", 800)

ریفریش localhost:16686اپنی سروس منتخب کریں اور 'فائنڈ ٹریکنگ' پر کلک کریں۔

واقعہ سے پہلے اور بعد کا باہمی تعلق

ہر PreToolUse کو اس کے متعلقہ PostToolUse سے مماثل ہونا چاہیے۔ ایجنٹ قسم کے ٹول کالز میں شامل ہیں: tool_use_id میں نے اس کے بجائے ٹول کا نام اور ان پٹ ہیش کر دیا، کیونکہ یہ پے لوڈ میں شامل ہے۔ پری اور پوسٹ ایک جیسے ہیں۔ tool_inputتو ہیشوں کو ترتیب دیا گیا ہے۔

import hashlib, json

def correlation_key(tool_name: str, tool_input: dict) -> str:
    content = json.dumps({"tool": tool_name, "input": tool_input}, sort_keys=True)
    return hashlib.sha1(content.encode()).hexdigest()[:16]

پوری کال میں بیان کریں۔

ہر ہک کال ایک الگ عمل ہے۔ کوئی مشترکہ میموری نہیں ہے۔ لہذا میں نے پہلے میں JSON فائل میں دائرہ کار کا سیاق و سباق لکھا اور اسے پوسٹ میں واپس پڑھا۔

/tmp/claude-forge-tracing//
├── _root.json              # trace ID, root span context
├── _session_start_ns.json  # timestamp for duration calculation
├── subagent_.json    # per-subagent span context
└── tool_.json        # per-tool span context

پاتھ نیویگیشن کے لیے فائل کے نام کو مسترد کر دیا گیا ہے۔ _safe_name() باہر کی ہر چیز کو ہٹا دیں۔ [A-Za-z0-9._-] SHA1 سلگ پر واپس جائیں۔

بلاک کیے بغیر فلش کریں۔

try:
    provider.force_flush(timeout_millis=1000)
except Exception:
    pass  # Never block the swarm

پہلے میں نے 2000ms کی کوشش کی اور بھیڑ سست محسوس ہوئی۔ ٹھنڈے TLS کنکشن پر 100ms کی حد ختم ہو جاتی ہے۔ 1000ms کام کیا۔ اگر جیجر نیچے ہے، تو بھیڑ قطع نظر دوڑتی رہے گی۔

Jaeger UI میں ٹریس دیکھیں

کھلا http://localhost:16686. منتخب کریں claude-forge سروسز ڈراپ ڈاؤن میں "فائنڈ ٹریکنگ" پر کلک کریں۔

ٹریکنگ تلاشیں کام کے نام، ٹیگز اور وقت کی حد کے لحاظ سے فلٹر کرتی ہیں۔ سیشن کے دائرہ کار کو اس کا نام پرامپٹ سے ملتا ہے، لہذا "لاگ ان فارم" کی تلاش آپ کی درخواست پر عمل درآمد ظاہر کرے گی۔

ٹائم لائن ویو وہ جگہ ہے جہاں میں اپنا زیادہ تر وقت گزارتا ہوں۔ تمام رینجز افقی سلاخیں ہیں جو والدین اور بچے کے رشتے میں گھری ہوئی ہیں۔ آپ دیکھ سکتے ہیں کہ منصوبہ ساز نے 12 سیکنڈ، عمل درآمد کرنے والے نے 45 سیکنڈ اور جائزہ لینے والے نے 8 سیکنڈ کا وقت لیا۔ ٹوکن کی تعداد، اشارے، آؤٹ پٹ، اور خرابی کی کیفیت دیکھنے کے لیے بار پر کلک کریں۔

ٹریس کا موازنہ دو رنز ساتھ ساتھ رکھتا ہے۔ یہ اس بات کا تعین کرنے کے لیے مفید ہے کہ ایک رن کیوں کامیاب ہوتا ہے اور دوسرا ناکام کیوں ہوتا ہے۔

خندقوں سے سبق سیکھا۔

ایک ٹریس فی بھیڑ، فی ذیلی ایجنٹ نہیں: میرے پہلے ورژن نے ہر اسٹاپ ایونٹ پر روٹ اسکوپڈ اسٹیٹ فائل کو صاف کیا، لہذا ہر ذیلی ایجنٹ نے ایک نیا ٹریس شروع کیا۔ راستے کو برقرار رکھتے ہوئے ٹائم اسٹیمپ ڈسپلے کرنے کے لیے اسٹاپ کو تبدیل کر دیا گیا۔

وضاحتیں استعمال کریں، ناموں کی قسم نہیں۔ ذیلی ایجنٹ سبھی اپنی قسم کی رپورٹ درج ذیل کرتے ہیں: general-purpose. تفصیل کا میدان وہ ہے جہاں اصل کردار ہوتا ہے۔

ٹوکن پراپرٹیز کے لیے ایجنٹ کے مخصوص ریکارڈ کی ضرورت ہوتی ہے۔ کلاڈ کوڈ ذیلی ایجنٹ کے ریکارڈ کو لکھتا ہے: ~/.claude/projects///subagents/agent-*.jsonl. میچ بذریعہ: agent-*.meta.json.

بولین ماحولیاتی متغیرات کو واضح طور پر پارس کریں۔ bool("0") ازگر میں True. وائٹ لسٹنگ کا استعمال کریں۔ {"1", "true", "yes", "on"}.

ماحولیاتی متغیر حوالہ

متغیر مقصد
CLAUDE_FORGE_TRACING=1 ماسٹر آپٹ ان۔ ہکس ان کے بغیر کام نہیں کریں گے۔
CLAUDE_FORGE_TRACE_MUTATIONS=0 ڈیفالٹ ویرینٹ اسکوپ کو غیر فعال کریں (لکھیں/ترمیم/باش)۔ یہ بطور ڈیفالٹ آن ہے۔
CLAUDE_FORGE_TRACE_INNER=1 تمام اندرونی ٹول کالز کو سب اسکوپس پر کیپچر کریں (بذریعہ ڈیفالٹ آف)۔
CLAUDE_FORGE_TRACE_TOOL_BLOCKLIST اندرونی ٹریسنگ آن ہونے پر چھوڑنے کے لیے کوما سے الگ کیے گئے ٹولز۔ پہلے سے طے شدہ ہے۔ Read,Glob,Grep,TodoWrite,NotebookRead.
CLAUDE_FORGE_HOOK_DEBUG=1 خام ہک پے لوڈز کی ڈیبگ لاگنگ کو فعال کرتا ہے۔ یہ بطور ڈیفالٹ آف ہے۔
CLAUDE_FORGE_HOOK_DEBUG_LOG ڈیبگ لاگ پاتھ کو اوور رائیڈ کرتا ہے۔ پہلے سے طے شدہ ہے۔ ~/.cache/claude-forge/hook.log.
OTEL_EXPORTER_OTLP_ENDPOINT OTLP/gRPC اختتامی نقطہ۔ پہلے سے طے شدہ ہے۔ http://localhost:4317.

ختم

عمل میں مرئیت کے بغیر، آپ کے ٹوکن اور وقت ناکارہ ہیں۔ ملٹی ایجنٹ بھیڑ جب بھی چلتی ہے ان کی اصل قیمت ہوتی ہے۔ اگر کوئی ایجنٹ ناکام ہو جاتا ہے اور دوبارہ کوشش کرتا ہے، یا جائزہ لینے والا بند کام کو مسترد کر دیتا ہے، تو آپ اس اندھے کے لیے ادائیگی کرتے ہیں۔

ٹریکنگ آپ کو نقشہ فراہم کرتی ہے۔ معلوم کریں کہ آپ کے ناکامی کے طریقے کہاں ہیں۔ آپ یہ جان سکتے ہیں کہ کون سے ایجنٹ کہیں بھی اپنے ٹوکن نہیں جلا رہے ہیں۔ بہتر منصوبہ ساز کے اشارے کے ساتھ، 45 سیکنڈ کا نفاذ کنندہ رن 10 سیکنڈ بن سکتا ہے۔ لیکن آپ کو یہ کبھی معلوم نہیں ہوگا جب تک کہ آپ خرابی کو نہ دیکھیں۔

جلد مرئیت حاصل کریں۔ Jaeger اور OpenTelemetry استعمال کرنے سے سیٹ اپ کی لاگت سستی ہو جاتی ہے۔ ایک بار جب آپ اس بات کا تعین کر لیں کہ مسئلہ کہاں ہو رہا ہے، تو آپ واقعی اسے ٹھیک کر سکتے ہیں۔

کلاڈ فورج ٹریس ڈیفالٹ برانچ میں ہے۔

Scroll to Top