Gina treatment of aathma

I'll look up the GINA (Global Initiative for Asthma) treatment guidelines from the medical library right away.
Reading File
Now let me search the medical library for GINA asthma treatment guidelines in parallel:
Finding Sources
Finding Sources
Searching the Web

GINA 2025 asthma treatment guidelines stepwise

Let me search deeper in the medical library and also extract the GINA 2025 summary:
Finding Sources
Reading Web Page

https://ginasthma.org/wp-content/uploads/2025/11/GINA-Summar…

Let me now read the relevant Harrison's and Murray & Nadel sections for detailed content:
Reading File
Reading File
Let me also read the Harrison's asthma treatment section:
Reading File
I now have comprehensive content from multiple authoritative sources. Here is the full GINA treatment overview:

GINA Treatment of Asthma (2025 Update)

GINA (Global Initiative for Asthma) uses a personalized, stepwise approach built around three cyclical actions: Assess - Adjust - Review Response.

Core Principle: Anti-Inflammatory Reliever (AIR)

A major paradigm shift in recent GINA updates: ICS-formoterol (inhaled corticosteroid + formoterol) is now the preferred reliever at all steps, replacing SABA-only (salbutamol) as the default. This is because:
  • It reduces the risk of severe exacerbations compared to SABA reliever
  • Asthma mortality can occur even in mild/intermittent asthma
  • Formoterol has rapid onset, making ICS-formoterol viable as a rescue inhaler

GINA Stepwise Treatment - Adults & Adolescents (≥12 years)

GINA 2025 offers two parallel tracks:

Track 1 (Preferred) - ICS-Formoterol as Reliever

StepPreferred ControllerReliever
Step 1None (AIR only)As-needed low-dose ICS-formoterol
Step 2Low-dose ICS, or as-needed ICS-formoterolAs-needed low-dose ICS-formoterol
Step 3MART* - low-dose ICS-formoterol maintenanceAs-needed low-dose ICS-formoterol
Step 4MART* - medium-dose ICS-formoterol maintenanceAs-needed ICS-formoterol
Step 5High-dose ICS-LABA + add-on therapyAs-needed ICS-formoterol
*MART = Maintenance And Reliever Therapy

Track 2 (Alternative) - SABA as Reliever

StepPreferred ControllerReliever
Step 1Low-dose ICS taken whenever SABA takenSABA as needed
Step 2Low-dose ICS daily, or LTRASABA as needed
Step 3Low-dose ICS-LABA, or medium-dose ICSSABA as needed
Step 4Medium-dose ICS-LABA, or high-dose ICSSABA as needed
Step 5High-dose ICS-LABA + phenotype assessmentSABA as needed
Note: Before prescribing Track 2, check whether the patient is likely to adhere to daily controller treatment.

Step 5: Add-On (Biologic) Therapies

At Step 5, refer for phenotypic/endotypic assessment. Biologics are reserved for severe, poorly controlled asthma:
BiologicTargetIndication
OmalizumabAnti-IgEAllergic asthma, elevated IgE
Mepolizumab / Benralizumab / ReslizumabAnti-IL-5 / Anti-IL-5REosinophilic asthma (blood eos ≥300/µL)
DupilumabAnti-IL-4R (blocks IL-4 & IL-13)Eosinophilic asthma or FeNO ≥20-25 ppb; reduces exacerbations by ≥50%
TezepelumabAnti-TSLPBroadest spectrum - works even without elevated eosinophils or FeNO; reduces exacerbations 50-70%
If biologics fail or are unavailable, low-dose oral corticosteroids may be added (but consider significant side-effect burden).

Children 6-11 Years

A similar stepwise approach, but with age-specific dosing:
  • Steps 1-2: Low-dose ICS (daily or as needed with SABA)
  • Step 3: Low-dose ICS-LABA or medium-dose ICS; MART with ICS-formoterol
  • Step 4: Medium-dose ICS-LABA; MART with medium-dose ICS-formoterol
  • Step 5: High-dose ICS-LABA + refer for phenotypic assessment; add-on biologic therapy

Non-Pharmacological Strategies (At All Steps)

  • Smoking cessation
  • Physical activity and pulmonary rehabilitation
  • Weight reduction (if overweight/obese)
  • Vaccinations (influenza, pneumococcal)
  • Avoidance of identified triggers (allergens, occupational exposures)
  • Allergen immunotherapy (e.g., house dust mite sublingual immunotherapy) - consider if sensitized and not well-controlled on stable therapy with FEV1 >70% predicted

Asthma Attacks / Exacerbations

Acute management:
  • Start short-acting beta-2 agonist (SABA) up to every 20 min in urgent care
  • Oral corticosteroids:
    • Adults: prednisolone 40-50 mg each morning for 5-7 days
    • Children: prednisolone 1-2 mg/kg/day (max 40 mg) for 3-5 days
  • Titrate oxygen to maintain saturation 93-95% in adults; ≥94% in children 6-12 years
  • Do NOT routinely do chest X-ray, blood gases, or prescribe antibiotics
  • Do NOT use sedatives
  • Monitor closely; transfer to higher-level care if no improvement after 1 hour

Key Assessment at Every Visit

At each visit, assess and address:
  • Symptom control and modifiable risk factors
  • Inhaler technique and adherence (poor technique/adherence causes poor control in up to 50% of patients)
  • Comorbidities (allergic rhinitis, GERD, obesity, obstructive sleep apnea)
  • Lung function
  • Patient goals and satisfaction

Sources:
  • Harrison's Principles of Internal Medicine 22E (2025) - Asthma chapter, p. 2270
  • Murray & Nadel's Textbook of Respiratory Medicine - Table 62.3, p. 1447
  • GINA 2025 Summary Guide

Can you make pdf this topic

Reading File
Running Command

ls /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace

Running Command

mkdir -p /home/daytona/workspace/gina-asthma-pdf

Writing File

~/gina-asthma-pdf/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY

OUTPUT = "/home/daytona/workspace/gina-asthma-pdf/GINA_Asthma_Treatment_2025.pdf"

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=2*cm, leftMargin=2*cm,
    topMargin=2*cm, bottomMargin=2*cm,
    title="GINA Treatment of Asthma 2025",
    author="Orris Medical"
)

styles = getSampleStyleSheet()

# Custom styles
title_style = ParagraphStyle(
    "CustomTitle",
    parent=styles["Title"],
    fontSize=22,
    textColor=colors.HexColor("#1a3a5c"),
    spaceAfter=6,
    alignment=TA_CENTER,
    fontName="Helvetica-Bold"
)
subtitle_style = ParagraphStyle(
    "Subtitle",
    parent=styles["Normal"],
    fontSize=11,
    textColor=colors.HexColor("#4a6fa5"),
    spaceAfter=14,
    alignment=TA_CENTER,
    fontName="Helvetica"
)
h1_style = ParagraphStyle(
    "H1",
    parent=styles["Heading1"],
    fontSize=14,
    textColor=colors.white,
    backColor=colors.HexColor("#1a3a5c"),
    spaceBefore=14,
    spaceAfter=6,
    leftIndent=-0.5*cm,
    rightIndent=-0.5*cm,
    borderPad=5,
    fontName="Helvetica-Bold"
)
h2_style = ParagraphStyle(
    "H2",
    parent=styles["Heading2"],
    fontSize=12,
    textColor=colors.HexColor("#1a3a5c"),
    spaceBefore=10,
    spaceAfter=4,
    fontName="Helvetica-Bold",
    borderPad=3,
)
body_style = ParagraphStyle(
    "Body",
    parent=styles["Normal"],
    fontSize=10,
    leading=15,
    spaceAfter=5,
    textColor=colors.HexColor("#2d2d2d"),
    fontName="Helvetica",
    alignment=TA_JUSTIFY
)
bullet_style = ParagraphStyle(
    "Bullet",
    parent=body_style,
    leftIndent=14,
    bulletIndent=4,
    spaceAfter=3,
)
note_style = ParagraphStyle(
    "Note",
    parent=body_style,
    fontSize=9,
    textColor=colors.HexColor("#555555"),
    fontName="Helvetica-Oblique",
    backColor=colors.HexColor("#f0f4f8"),
    borderPad=5,
    leftIndent=10,
    rightIndent=10,
)
footer_style = ParagraphStyle(
    "Footer",
    parent=styles["Normal"],
    fontSize=8,
    textColor=colors.HexColor("#888888"),
    alignment=TA_CENTER,
    fontName="Helvetica-Oblique"
)

def h1(text):
    return Paragraph(f"  {text}", h1_style)

def h2(text):
    return Paragraph(text, h2_style)

def body(text):
    return Paragraph(text, body_style)

def bullet(text):
    return Paragraph(f"•  {text}", bullet_style)

def note(text):
    return Paragraph(f"<i>{text}</i>", note_style)

def sp(n=8):
    return Spacer(1, n)

def hr():
    return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#c0cfe0"), spaceAfter=6)

# ─── Table helper ──────────────────────────────────────────────────────────────
def make_table(headers, rows, col_widths=None):
    data = [headers] + rows
    if col_widths is None:
        n = len(headers)
        col_widths = [17*cm / n] * n

    style = TableStyle([
        # Header row
        ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1a3a5c")),
        ("TEXTCOLOR",  (0, 0), (-1, 0), colors.white),
        ("FONTNAME",   (0, 0), (-1, 0), "Helvetica-Bold"),
        ("FONTSIZE",   (0, 0), (-1, 0), 9),
        ("ALIGN",      (0, 0), (-1, 0), "CENTER"),
        ("VALIGN",     (0, 0), (-1, -1), "MIDDLE"),
        # Body rows
        ("FONTNAME",   (0, 1), (-1, -1), "Helvetica"),
        ("FONTSIZE",   (0, 1), (-1, -1), 9),
        ("ROWBACKGROUNDS", (0, 1), (-1, -1),
         [colors.HexColor("#f7fafd"), colors.white]),
        ("GRID",       (0, 0), (-1, -1), 0.4, colors.HexColor("#b0c4de")),
        ("LEFTPADDING",  (0, 0), (-1, -1), 6),
        ("RIGHTPADDING", (0, 0), (-1, -1), 6),
        ("TOPPADDING",   (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING",(0, 0), (-1, -1), 5),
        ("WORDWRAP",   (0, 0), (-1, -1), True),
    ])
    tbl = Table(
        [[Paragraph(str(c), ParagraphStyle("tc", fontSize=9,
           fontName="Helvetica-Bold" if r == 0 else "Helvetica",
           textColor=colors.white if r == 0 else colors.HexColor("#2d2d2d"),
           alignment=TA_CENTER if r == 0 else TA_LEFT,
           leading=13))
          for c in row]
         for r, row in enumerate(data)],
        colWidths=col_widths
    )
    tbl.setStyle(style)
    return tbl

# ══════════════════════════════════════════════════════════════════════════════
story = []

# ── COVER ───────────────────────────────────────────────────────────────────
story.append(sp(30))
story.append(Paragraph("GINA Treatment of Asthma", title_style))
story.append(Paragraph("Global Initiative for Asthma — 2025 Update", subtitle_style))
story.append(hr())
story.append(sp(4))
story.append(body(
    "GINA (Global Initiative for Asthma) provides an evidence-based, personalized, "
    "stepwise framework for asthma management. The 2025 update reinforces the shift "
    "away from SABA-only reliever therapy toward <b>anti-inflammatory reliever (AIR)</b> "
    "strategies centered on ICS-formoterol at all steps. The overarching cycle is: "
    "<b>Assess → Adjust → Review Response</b>."
))
story.append(sp(10))

# ── SECTION 1: Core Principle ───────────────────────────────────────────────
story.append(h1("1. Core Principle — Anti-Inflammatory Reliever (AIR)"))
story.append(sp(6))
story.append(body(
    "A key shift in GINA 2025: <b>ICS-formoterol is the preferred reliever at ALL steps</b> "
    "(replacing SABA-only). Formoterol's rapid onset makes it suitable as both a maintenance "
    "and reliever inhaler."
))
story.append(sp(4))
story.append(bullet("Reduces risk of severe exacerbations vs. SABA reliever"))
story.append(bullet("Asthma mortality can occur even in mild/intermittent disease"))
story.append(bullet("Simpler regimen — one inhaler for both maintenance and relief (MART)"))
story.append(sp(8))

# ── SECTION 2: Stepwise Treatment — Adults ──────────────────────────────────
story.append(h1("2. Stepwise Treatment — Adults & Adolescents (≥12 years)"))
story.append(sp(6))
story.append(h2("Track 1 (Preferred) — ICS-Formoterol as Reliever"))
story.append(sp(4))

track1_headers = ["Step", "Preferred Controller", "Other Controller Option", "Reliever"]
track1_rows = [
    ["Step 1\n(Intermittent)", "None (AIR only)", "Low-dose ICS taken whenever SABA taken",
     "As-needed low-dose ICS-formoterol"],
    ["Step 2\n(Mild)", "Low-dose ICS daily\nOR as-needed ICS-formoterol",
     "LTRA, or low-dose ICS taken whenever SABA taken",
     "As-needed low-dose ICS-formoterol"],
    ["Step 3\n(Moderate)", "MART* — low-dose ICS-formoterol maintenance",
     "Medium-dose ICS, or low-dose ICS + LTRA",
     "As-needed low-dose ICS-formoterol"],
    ["Step 4\n(Moderate-Severe)", "MART* — medium-dose ICS-formoterol maintenance",
     "High-dose ICS, add-on tiotropium, or add-on LTRA",
     "As-needed ICS-formoterol"],
    ["Step 5\n(Severe)", "High-dose ICS-LABA + refer for phenotype assessment ± biologic",
     "Add low-dose oral corticosteroids (consider side effects)",
     "As-needed ICS-formoterol"],
]
story.append(make_table(track1_headers, track1_rows, [2.5*cm, 4.5*cm, 5*cm, 5*cm]))
story.append(sp(4))
story.append(note("*MART = Maintenance And Reliever Therapy with ICS-formoterol"))
story.append(sp(10))

story.append(h2("Track 2 (Alternative) — SABA as Reliever"))
story.append(sp(4))
story.append(body(
    "Before prescribing Track 2, verify the patient is likely to adhere to daily controller therapy."
))
story.append(sp(4))
track2_headers = ["Step", "Preferred Controller", "Other Controller Option", "Reliever"]
track2_rows = [
    ["Step 1", "Low-dose ICS taken whenever SABA taken", "—", "SABA as needed"],
    ["Step 2", "Low-dose ICS daily", "LTRA", "SABA as needed"],
    ["Step 3", "Low-dose ICS-LABA", "Medium-dose ICS, or low-dose ICS + LTRA", "SABA as needed"],
    ["Step 4", "Medium-dose ICS-LABA", "High-dose ICS, tiotropium, or LTRA", "SABA as needed"],
    ["Step 5", "High-dose ICS-LABA + phenotype assessment", "Low-dose oral corticosteroids", "SABA as needed"],
]
story.append(make_table(track2_headers, track2_rows, [2.5*cm, 4.5*cm, 5*cm, 4.5*cm]))
story.append(sp(10))

# ── SECTION 3: Children 6-11 ─────────────────────────────────────────────────
story.append(h1("3. Stepwise Treatment — Children 6–11 Years"))
story.append(sp(6))
child_headers = ["Step", "Preferred Controller", "Reliever"]
child_rows = [
    ["Step 1–2", "Low-dose ICS daily (or as-needed with SABA)", "As-needed SABA\nor ICS-formoterol"],
    ["Step 3", "Low-dose ICS-LABA or medium-dose ICS;\nMART with low-dose ICS-formoterol",
     "As-needed ICS-formoterol"],
    ["Step 4", "Medium-dose ICS-LABA;\nMART with medium-dose ICS-formoterol",
     "As-needed ICS-formoterol"],
    ["Step 5", "High-dose ICS-LABA + refer for phenotypic assessment;\nadd-on biologic",
     "As-needed ICS-formoterol"],
]
story.append(make_table(child_headers, child_rows, [3*cm, 8*cm, 6*cm]))
story.append(sp(6))
story.append(note(
    "LTRA (montelukast): advise patient/caregiver about risk of neuropsychiatric adverse effects (e.g., suicidal ideation)."
))
story.append(sp(10))

# ── SECTION 4: Step 5 Biologics ──────────────────────────────────────────────
story.append(h1("4. Step 5 — Biologic (Add-On) Therapies"))
story.append(sp(6))
story.append(body(
    "Refer for phenotypic/endotypic assessment. Biologics are reserved for severe, "
    "poorly controlled asthma despite high-dose ICS-LABA. Most effects seen within 3–6 months."
))
story.append(sp(6))
bio_headers = ["Biologic", "Target", "Indication / Key Points"]
bio_rows = [
    ["Omalizumab", "Anti-IgE",
     "Allergic asthma; elevated serum IgE; reduces exacerbations and steroid use"],
    ["Mepolizumab\nBenralizumab\nReslizumab", "Anti-IL-5 /\nAnti-IL-5R",
     "Eosinophilic asthma (blood eosinophils ≥300/µL); reduces exacerbations ~50%"],
    ["Dupilumab", "Anti-IL-4Rα\n(blocks IL-4 & IL-13)",
     "Eosinophilic asthma OR FeNO ≥20–25 ppb even without elevated eosinophils; "
     "also effective in OCS-dependent asthma; reduces exacerbations ≥50%; "
     "also approved for nasal polyposis, atopic dermatitis, eosinophilic esophagitis"],
    ["Tezepelumab", "Anti-TSLP\n(proximal alarmin)",
     "Broadest spectrum — effective even without elevated eosinophils or FeNO; "
     "reduces exacerbations 50–70%; improves lung function and symptoms"],
]
story.append(make_table(bio_headers, bio_rows, [3*cm, 3.5*cm, 10.5*cm]))
story.append(sp(6))
story.append(note(
    "Low-dose oral corticosteroids may be added if biologics fail or are unavailable, "
    "but consider significant long-term side-effect burden."
))
story.append(sp(10))

# ── SECTION 5: Acute Exacerbations ───────────────────────────────────────────
story.append(h1("5. Acute Exacerbations (Asthma Attacks)"))
story.append(sp(6))

story.append(h2("Initial / Home Management"))
story.append(bullet("Increase as-needed ICS-formoterol (MART patients) or SABA up to every 1 hour"))
story.append(bullet("Consider increasing ICS dose 4–5 fold"))
story.append(bullet("If no response after a few hours — refer for urgent care"))
story.append(sp(6))

story.append(h2("Urgent Care / Hospital Management"))
story.append(bullet("Nebulized SABA up to every 20 minutes; assess PEFR / FEV1"))
story.append(bullet(
    "<b>Oral corticosteroids:</b><br/>"
    "Adults: Prednisolone 40–50 mg each morning × 5–7 days<br/>"
    "Children: Prednisolone 1–2 mg/kg/day (max 40 mg) × 3–5 days"
))
story.append(bullet(
    "<b>Oxygen:</b> Titrate to SpO2 93–95% (adults); ≥94% (children 6–12 years)"
))
story.append(bullet("Do NOT routinely: perform chest X-ray, blood gases, or prescribe antibiotics"))
story.append(bullet("Do NOT use sedatives"))
story.append(bullet("Monitor closely — check symptoms and SpO2 frequently; measure lung function at 1 hour"))
story.append(bullet("Transfer to higher-level care if condition worsens or fails to improve"))
story.append(sp(10))

# ── SECTION 6: Non-Pharmacological ────────────────────────────────────────────
story.append(h1("6. Non-Pharmacological Strategies (All Steps)"))
story.append(sp(6))
story.append(body("These should be addressed at every visit alongside medications:"))
story.append(sp(4))
nonpharm = [
    ["Strategy", "Details"],
    ["Smoking cessation", "Essential; smoking worsens asthma control and reduces ICS efficacy"],
    ["Physical activity", "Encouraged; pulmonary rehabilitation if needed"],
    ["Weight management", "Obesity worsens asthma; weight reduction improves control"],
    ["Vaccinations", "Influenza (annual); pneumococcal"],
    ["Trigger avoidance", "Identify and reduce allergens, occupational exposures, pollutants"],
    ["Allergen immunotherapy", "House dust mite SLIT: consider if sensitized + not well-controlled "
     "(stable asthma, FEV1 >70%)"],
]
story.append(make_table(nonpharm[0:1], nonpharm[1:], [4*cm, 13*cm]))
story.append(sp(10))

# ── SECTION 7: Assessment at Every Visit ─────────────────────────────────────
story.append(h1("7. Assessment at Every Visit"))
story.append(sp(6))
story.append(body(
    "GINA emphasizes <b>poor inhaler technique and non-adherence</b> account for poor "
    "control in up to 50% of patients referred for 'difficult asthma'. Always address:"
))
story.append(sp(4))
story.append(bullet("<b>Symptom control</b> and modifiable risk factors"))
story.append(bullet("<b>Inhaler technique</b> — demonstrate and re-check at every visit"))
story.append(bullet("<b>Adherence</b> — address barriers (cost, beliefs, side-effect concerns)"))
story.append(bullet("<b>Comorbidities</b> — allergic rhinitis, GERD, obesity, obstructive sleep apnea"))
story.append(bullet("<b>Lung function</b> — FEV1, PEF; low FEV1 is strong predictor of exacerbations"))
story.append(bullet("<b>Patient goals and satisfaction</b>"))
story.append(sp(10))

# ── SECTION 8: Key Abbreviations ─────────────────────────────────────────────
story.append(h1("8. Key Abbreviations"))
story.append(sp(6))
abbr_data = [
    ["ICS", "Inhaled Corticosteroid", "LABA", "Long-Acting Beta2-Agonist"],
    ["SABA", "Short-Acting Beta2-Agonist", "LAMA", "Long-Acting Muscarinic Antagonist"],
    ["MART", "Maintenance And Reliever Therapy", "AIR", "Anti-Inflammatory Reliever"],
    ["LTRA", "Leukotriene Receptor Antagonist", "FeNO", "Fractional exhaled Nitric Oxide"],
    ["OCS", "Oral Corticosteroid", "TSLP", "Thymic Stromal Lymphopoietin"],
    ["FEV1", "Forced Expiratory Volume in 1 sec", "PEF", "Peak Expiratory Flow"],
]
abbr_tbl = Table(
    [[Paragraph(c, ParagraphStyle("atbl", fontSize=9,
       fontName="Helvetica-Bold" if i % 2 == 0 else "Helvetica",
       textColor=colors.HexColor("#1a3a5c") if i % 2 == 0 else colors.HexColor("#2d2d2d")))
      for i, c in enumerate(row)]
     for row in abbr_data],
    colWidths=[2.5*cm, 6*cm, 2.5*cm, 6*cm]
)
abbr_tbl.setStyle(TableStyle([
    ("ROWBACKGROUNDS", (0, 0), (-1, -1),
     [colors.HexColor("#f0f4f8"), colors.white]),
    ("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#c0cfe0")),
    ("LEFTPADDING",  (0, 0), (-1, -1), 6),
    ("RIGHTPADDING", (0, 0), (-1, -1), 6),
    ("TOPPADDING",   (0, 0), (-1, -1), 4),
    ("BOTTOMPADDING",(0, 0), (-1, -1), 4),
]))
story.append(abbr_tbl)
story.append(sp(20))

# ── Footer ───────────────────────────────────────────────────────────────────
story.append(hr())
story.append(Paragraph(
    "Sources: Harrison's Principles of Internal Medicine 22E (2025) | "
    "Murray & Nadel's Textbook of Respiratory Medicine | "
    "GINA 2025 Summary Guide (ginasthma.org) | "
    "Generated by Orris Medical AI — July 2026",
    footer_style
))

# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF created:", OUTPUT)
Running Command

cd /home/daytona/workspace/gina-asthma-pdf && python generate_pdf.py

Your PDF is ready! Download it here:

GINA Asthma Treatment 2025

PDF Document · PDF

What's included in the PDF:
  1. Core Principle - AIR (Anti-Inflammatory Reliever) concept
  2. Track 1 & Track 2 stepwise tables - Adults & Adolescents (≥12 years), Steps 1-5 with preferred and alternative controller/reliever options
  3. Children 6-11 years - Stepwise table
  4. Step 5 Biologics - Omalizumab, Mepolizumab/Benralizumab, Dupilumab, Tezepelumab with targets and indications
  5. Acute Exacerbation management - Home and urgent care protocols with doses
  6. Non-pharmacological strategies
  7. Assessment checklist for every visit
  8. Key abbreviations reference table
The document is fully formatted with color-coded headers, tables, and references.

Can you give pdf asthma topic and gina 2026 from fishman and gina

Finding Sources
Searching the Web

GINA 2026 asthma guidelines update stepwise treatment

Good - Fishman's is in the library. Now let me find the asthma sections in Fishman's and extract GINA 2026 details in parallel:
Finding Sources
Reading Web Page

https://www.guidelinecentral.com/insights/may-2026-gina-asth…

The main Fishman asthma chapter is in block8. Let me read it comprehensively:
Reading File
This is the impairment chapter - not the main asthma clinical chapter. Let me find the primary asthma chapter in Fishman's:
Finding Sources
Finding Sources
Finding Sources
Finding Sources
The main asthma chapter in Fishman's is in block9. Let me read it and also block30 (pharmacology):
Reading File
Reading File
Let me find the clinical/treatment section of the Fishman's asthma chapter:
Finding Sources
Reading File
Finding Sources
Finding Sources
Found it - "Asthma: Clinical Presentation and Management" at line 2704 in block9. Let me read that section comprehensively:
Reading File
Reading File
I have comprehensive material now. Let me build the PDF:
Writing File

~/gina-asthma-pdf/generate_full_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY, TA_RIGHT
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.lib.units import inch

OUTPUT = "/home/daytona/workspace/gina-asthma-pdf/Asthma_Fishman_GINA2026.pdf"

W, H = A4

# ── Page template with header/footer ─────────────────────────────────────────
def header_footer(canvas, doc):
    canvas.saveState()
    # Header bar
    canvas.setFillColor(colors.HexColor("#1a3a5c"))
    canvas.rect(1.5*cm, H - 1.5*cm, W - 3*cm, 0.55*cm, fill=1, stroke=0)
    canvas.setFillColor(colors.white)
    canvas.setFont("Helvetica-Bold", 9)
    canvas.drawString(1.7*cm, H - 1.25*cm, "Asthma — Fishman's Pulmonary Diseases & GINA 2026")
    canvas.setFont("Helvetica", 8)
    canvas.drawRightString(W - 1.7*cm, H - 1.25*cm, "July 2026")
    # Footer
    canvas.setFillColor(colors.HexColor("#888888"))
    canvas.setFont("Helvetica", 8)
    canvas.drawCentredString(W / 2, 0.9*cm, f"Page {doc.page}")
    canvas.setFillColor(colors.HexColor("#c0cfe0"))
    canvas.rect(1.5*cm, 1.2*cm, W - 3*cm, 0.03*cm, fill=1, stroke=0)
    canvas.restoreState()

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    rightMargin=2*cm, leftMargin=2*cm,
    topMargin=2.2*cm, bottomMargin=2*cm,
    title="Asthma: Fishman's Pulmonary + GINA 2026",
    author="Orris Medical"
)

styles = getSampleStyleSheet()

# ── Styles ────────────────────────────────────────────────────────────────────
title_style = ParagraphStyle("CT", parent=styles["Title"], fontSize=24,
    textColor=colors.HexColor("#1a3a5c"), spaceAfter=4, alignment=TA_CENTER,
    fontName="Helvetica-Bold")
sub_style = ParagraphStyle("CS", parent=styles["Normal"], fontSize=12,
    textColor=colors.HexColor("#4a6fa5"), spaceAfter=6, alignment=TA_CENTER,
    fontName="Helvetica")
tagline_style = ParagraphStyle("TL", parent=styles["Normal"], fontSize=10,
    textColor=colors.HexColor("#666666"), spaceAfter=20, alignment=TA_CENTER,
    fontName="Helvetica-Oblique")
h1_style = ParagraphStyle("H1", parent=styles["Heading1"], fontSize=13,
    textColor=colors.white, backColor=colors.HexColor("#1a3a5c"),
    spaceBefore=16, spaceAfter=8, leftIndent=-0.4*cm, rightIndent=-0.4*cm,
    borderPad=6, fontName="Helvetica-Bold")
h2_style = ParagraphStyle("H2", parent=styles["Heading2"], fontSize=11,
    textColor=colors.HexColor("#1a3a5c"), spaceBefore=12, spaceAfter=5,
    fontName="Helvetica-Bold", borderPad=3)
h3_style = ParagraphStyle("H3", parent=styles["Heading3"], fontSize=10,
    textColor=colors.HexColor("#2c5282"), spaceBefore=8, spaceAfter=4,
    fontName="Helvetica-Bold")
body_style = ParagraphStyle("BD", parent=styles["Normal"], fontSize=9.5,
    leading=15, spaceAfter=6, textColor=colors.HexColor("#222222"),
    fontName="Helvetica", alignment=TA_JUSTIFY)
bullet_style = ParagraphStyle("BL", parent=body_style, leftIndent=14,
    bulletIndent=4, spaceAfter=4)
sub_bullet_style = ParagraphStyle("SBL", parent=body_style, leftIndent=26,
    bulletIndent=16, spaceAfter=3, fontSize=9)
note_style = ParagraphStyle("NT", parent=body_style, fontSize=8.5,
    textColor=colors.HexColor("#444444"), fontName="Helvetica-Oblique",
    backColor=colors.HexColor("#eef3f9"), borderPad=6,
    leftIndent=10, rightIndent=10, spaceAfter=8)
warning_style = ParagraphStyle("WN", parent=body_style, fontSize=9,
    textColor=colors.HexColor("#7b2020"), backColor=colors.HexColor("#fff0f0"),
    borderPad=6, leftIndent=10, rightIndent=10, spaceAfter=8,
    fontName="Helvetica-Bold")
source_style = ParagraphStyle("SR", parent=styles["Normal"], fontSize=7.5,
    textColor=colors.HexColor("#888888"), alignment=TA_CENTER,
    fontName="Helvetica-Oblique")
chapter_label = ParagraphStyle("CL", parent=styles["Normal"], fontSize=9,
    textColor=colors.HexColor("#4a6fa5"), alignment=TA_RIGHT,
    fontName="Helvetica-Oblique", spaceAfter=2)

def h1(t): return Paragraph(f"&nbsp;&nbsp;{t}", h1_style)
def h2(t): return Paragraph(t, h2_style)
def h3(t): return Paragraph(t, h3_style)
def body(t): return Paragraph(t, body_style)
def bul(t): return Paragraph(f"&#8226; &nbsp;{t}", bullet_style)
def sbul(t): return Paragraph(f"&#8211; &nbsp;{t}", sub_bullet_style)
def note(t): return Paragraph(t, note_style)
def warn(t): return Paragraph(f"&#9888; {t}", warning_style)
def sp(n=8): return Spacer(1, n)
def hr(c="#c0cfe0", t=0.5): return HRFlowable(width="100%", thickness=t, color=colors.HexColor(c), spaceAfter=6)
def pg(): return PageBreak()
def src(t): return Paragraph(t, source_style)

def make_table(headers, rows, col_widths=None, hdr_color="#1a3a5c"):
    data = [headers] + rows
    if col_widths is None:
        n = len(headers)
        col_widths = [17*cm / n] * n
    def cell(txt, row_idx):
        is_hdr = row_idx == 0
        return Paragraph(str(txt), ParagraphStyle("TC", fontSize=8.5,
            fontName="Helvetica-Bold" if is_hdr else "Helvetica",
            textColor=colors.white if is_hdr else colors.HexColor("#222222"),
            alignment=TA_CENTER if is_hdr else TA_LEFT, leading=13))
    tbl = Table(
        [[cell(c, r) for c in row] for r, row in enumerate(data)],
        colWidths=col_widths, repeatRows=1
    )
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,0), colors.HexColor(hdr_color)),
        ("ROWBACKGROUNDS", (0,1), (-1,-1),
         [colors.HexColor("#f4f8fc"), colors.white]),
        ("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0c4de")),
        ("VALIGN", (0,0), (-1,-1), "MIDDLE"),
        ("LEFTPADDING",  (0,0), (-1,-1), 6),
        ("RIGHTPADDING", (0,0), (-1,-1), 6),
        ("TOPPADDING",   (0,0), (-1,-1), 5),
        ("BOTTOMPADDING",(0,0), (-1,-1), 5),
    ]))
    return tbl

# ══════════════════════════════════════════════════════════════════════════════
story = []

# ────────────────────────────────────────────────────────────────────────────
#  COVER PAGE
# ────────────────────────────────────────────────────────────────────────────
story += [sp(40)]
story.append(Paragraph("ASTHMA", title_style))
story.append(Paragraph("A Comprehensive Clinical Reference", sub_style))
story.append(hr("#1a3a5c", 2))
story.append(sp(6))
story.append(Paragraph(
    "Fishman's Pulmonary Diseases and Disorders &nbsp;|&nbsp; GINA 2026 Strategy Report",
    tagline_style))
story.append(sp(20))
story.append(body(
    "This reference document synthesizes the clinical asthma content from "
    "<b>Fishman's Pulmonary Diseases and Disorders</b> (Barnes &amp; Usmani) "
    "with the <b>2026 Global Initiative for Asthma (GINA) Strategy Report</b>, "
    "published May 2026. It covers definition, pathophysiology, diagnosis, "
    "stepwise pharmacological management, biologics, exacerbation care, "
    "and the key 2026 GINA updates."
))
story.append(sp(60))
story.append(hr())
story.append(src(
    "Sources: Fishman's Pulmonary Diseases and Disorders, 2-Volume Set (9781260473940) | "
    "GINA 2026 Strategy Report (ginasthma.org, May 2026) | "
    "Generated by Orris Medical AI — July 2026"
))
story.append(pg())

# ────────────────────────────────────────────────────────────────────────────
#  PART 1 — FISHMAN'S
# ────────────────────────────────────────────────────────────────────────────
story.append(Paragraph("PART 1", ParagraphStyle("PART", fontSize=11,
    textColor=colors.HexColor("#4a6fa5"), alignment=TA_CENTER,
    fontName="Helvetica-Oblique")))
story.append(Paragraph("Fishman's Pulmonary Diseases and Disorders",
    ParagraphStyle("PTTL", fontSize=16, textColor=colors.HexColor("#1a3a5c"),
    alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=6)))
story.append(Paragraph("Chapter 45 — Asthma: Clinical Presentation and Management",
    ParagraphStyle("PSTL", fontSize=10, textColor=colors.HexColor("#666666"),
    alignment=TA_CENTER, fontName="Helvetica-Oblique", spaceAfter=16)))
story.append(hr())
story.append(sp(4))

# 1.1 Definition
story.append(h1("1. Definition & Overview"))
story.append(sp(4))
story.append(body(
    "Asthma is a <b>chronic inflammatory disorder of the airways</b> characterized by marked "
    "temporal variability in airflow obstruction that is often reversible, either spontaneously "
    "or with treatment. This inflammation presents clinically with recurrent symptoms of "
    "<b>wheezing, chest tightness, cough, and dyspnea</b>, and contributes to heightened "
    "<b>airway hyperresponsiveness (AHR)</b> to specific and nonspecific stimuli."
))
story.append(body(
    "Asthma is not a single disease but a <b>clinical syndrome</b> — a heterogeneous condition "
    "comprising multiple endotypes sharing common symptoms but with distinct pathophysiologic "
    "and etiologic mechanisms, involving an interplay between genetic and environmental factors."
))
story.append(sp(6))
story.append(note(
    "Fishman's (Ch. 45, Barnes &amp; Usmani): 'Asthma comprises multiple endotypes that manifest "
    "common symptoms but have distinct and probably different pathophysiologic and etiologic "
    "mechanisms with an interplay between genetic and environmental factors.'"
))
story.append(sp(6))

# 1.2 Risk Factors
story.append(h1("2. Risk Factors and Triggers"))
story.append(sp(4))
rf_headers = ["Endogenous Factors", "Environmental Factors", "Triggers"]
rf_rows = [
    ["Atopy (strongest factor)\nAirway hyperresponsiveness\nEthnicity\nGender\nGenetic predisposition",
     "Indoor allergens (house dust mite, animal dander, cockroach, fungi)\nOutdoor allergens (fungi, pollens)\nObesity\nOccupational sensitizers\nRespiratory infections (early childhood, viral)\nTobacco smoking (active/passive)",
     "Allergens (HDM, animal dander, cockroach, indoor fungi, seasonal pollens)\nChanges in weather (cold air, thunderstorms)\nDrugs (ACE inhibitors, aspirin, beta-blockers, NSAIDs)\nExercise and hyperventilation\nExtreme emotional expression\nIrritants (household sprays, paint fumes)\nSulfur dioxide and pollutant gases\nTobacco smoking"],
]
story.append(make_table(rf_headers, rf_rows, [5.5*cm, 6*cm, 5.5*cm]))
story.append(sp(10))

# 1.3 Pathophysiology
story.append(h1("3. Pathophysiology"))
story.append(sp(4))

story.append(h2("3.1 Airway Inflammation"))
story.append(body(
    "The hallmark of asthma is <b>airway inflammation</b> involving multiple cell types. "
    "The inflammatory response leads to structural changes (remodeling), mucosal edema, "
    "smooth muscle contraction, and mucus hypersecretion — all contributing to variable "
    "airflow obstruction."
))

story.append(h3("Key Inflammatory Cells"))
cells_data = [
    ["Cell Type", "Role in Asthma"],
    ["Mast cells", "Activated by allergens via IgE receptors; release histamine, prostaglandins, leukotrienes causing bronchoconstriction"],
    ["Eosinophils", "Release toxic proteins (MBP, ECP) causing airway damage; key in T2-high asthma; drive remodeling, mucus plugs; target of anti-IL-5 biologics"],
    ["Neutrophils", "Prominent in severe, non-T2, and steroid-resistant asthma; attracted by IL-8, IL-17; contribute to bronchial hyperresponsiveness"],
    ["T lymphocytes (CD4+)", "TH2 cells produce IL-4, IL-5, IL-13 driving eosinophilic inflammation; ILC2 cells amplify T2 response"],
    ["Dendritic cells", "Bridge innate and adaptive immunity; process and present allergens to T cells in lymph nodes"],
    ["Macrophages", "Activated by allergens or IgE; release inflammatory mediators; coordinate innate immune response"],
    ["Airway epithelial cells", "Produce alarmins (TSLP, IL-25, IL-33) driving both T1 and T2 inflammation; tight junction defects reduce barrier function"],
    ["Airway smooth muscle", "Contracted by inflammatory mediators causing bronchoconstriction; hypertrophied in remodeling"],
]
story.append(make_table(cells_data[0:1], cells_data[1:], [4*cm, 13*cm]))
story.append(sp(8))

story.append(h2("3.2 Key Molecular Mediators"))
story.append(body(
    "Multiple cytokines and lipid mediators orchestrate the inflammatory cascade in asthma:"
))
mediators = [
    ["Mediator", "Source", "Effect"],
    ["IL-4", "TH2 cells, mast cells", "IgE synthesis, TH2 differentiation, mucus production"],
    ["IL-5", "TH2 cells, ILC2", "Eosinophil production, survival, activation — key target for biologics"],
    ["IL-13", "TH2 cells, ILC2", "Mucus hypersecretion, airway hyperresponsiveness, IgE synthesis"],
    ["TSLP", "Airway epithelium", "Proximal alarmin; activates dendritic cells and ILC2; drives T2 inflammation — targeted by tezepelumab"],
    ["IL-33", "Epithelium, damaged cells", "Activates mast cells, ILC2, eosinophils; triggers acute inflammation"],
    ["Histamine", "Mast cells, basophils", "Rapid bronchoconstriction, vasodilation, mucus secretion"],
    ["Leukotrienes (LTC4, LTD4)", "Mast cells, eosinophils", "Potent bronchoconstriction, mucus secretion, eosinophil recruitment — blocked by LTRAs"],
    ["Prostaglandin D2", "Mast cells", "Bronchoconstriction, eosinophil recruitment"],
    ["IL-17", "TH17 cells", "Neutrophil recruitment; role in severe steroid-resistant asthma"],
]
story.append(make_table(mediators[0:1], mediators[1:], [3.5*cm, 4*cm, 9.5*cm]))
story.append(sp(8))

story.append(h2("3.3 Airway Remodeling"))
story.append(body(
    "Chronic inflammation leads to structural changes in the airway that may be partially "
    "irreversible:"
))
story += [
    bul("Subepithelial fibrosis (collagen deposition beneath basement membrane)"),
    bul("Airway smooth muscle hypertrophy and hyperplasia"),
    bul("Goblet cell hyperplasia and mucus gland enlargement"),
    bul("Increased vascularity (angiogenesis)"),
    bul("Loss of alveolar attachments (in severe/long-standing disease)"),
    bul("Mucus plugs — Charcot-Leyden crystals, Curschmann's spirals (eosinophilic casts)"),
]
story.append(sp(8))

# 1.4 Phenotypes
story.append(h1("4. Asthma Phenotypes & Endotypes"))
story.append(sp(4))
pheno_data = [
    ["Phenotype", "Key Features", "Biomarkers", "Treatment Implications"],
    ["T2-high / Eosinophilic\n(Atopic)", "Onset often in childhood; allergen-driven; responds well to ICS", "↑ Blood/sputum eosinophils, ↑ FeNO, ↑ IgE, + skin tests", "ICS-responsive; biologics: anti-IL-5, anti-IL-4R, anti-IgE"],
    ["T2-high / Late-onset\nEosinophilic", "Adult-onset; often non-atopic; severe disease; nasal polyps", "↑ Eosinophils, ↑ FeNO, normal IgE", "Often ICS-dependent; biologics: anti-IL-5, anti-IL-4R, tezepelumab"],
    ["Non-T2 / Neutrophilic", "Obese, female; smoking-related; infection-triggered; steroid-resistant", "↑ Neutrophils in sputum, normal eosinophils, normal FeNO", "Poor ICS response; macrolides may help; weight loss"],
    ["Exercise-Induced\nBronchoconstriction", "Triggered by exercise; post-exercise bronchospasm", "Normal at rest; fall in FEV1 after exercise challenge", "Pre-exercise SABA or ICS-formoterol; warm-up; LTRA"],
    ["Aspirin-exacerbated\nRespiratory Disease", "Aspirin/NSAID sensitivity; nasal polyps; severe asthma", "Elevated urinary LTE4, aspirin challenge", "Avoid NSAIDs; LTRAs; aspirin desensitization"],
    ["Occupational Asthma", "Work-related sensitizer or irritant exposure", "Specific IgE, serial PEF, specific challenge", "Remove from exposure; manage as standard asthma"],
]
story.append(make_table(pheno_data[0:1], pheno_data[1:], [3*cm, 4*cm, 4.5*cm, 5.5*cm]))
story.append(sp(10))

# 1.5 Diagnosis
story.append(h1("5. Clinical Features & Diagnosis"))
story.append(sp(4))

story.append(h2("5.1 Symptoms"))
story += [
    bul("<b>Wheezing</b> — episodic, expiratory (polyphonic), bilateral"),
    bul("<b>Breathlessness</b> — variable, often worse at night or early morning"),
    bul("<b>Chest tightness</b> — may precede wheezing"),
    bul("<b>Cough</b> — often dry, worse at night; may be the sole symptom (cough-variant asthma)"),
    bul("Symptoms vary spontaneously and with triggers; typically intermittent with symptom-free intervals"),
]
story.append(sp(6))

story.append(h2("5.2 Lung Function Tests"))
lft = [
    ["Test", "Finding in Asthma", "Significance"],
    ["Spirometry (FEV1/FVC)", "Reduced ratio (<0.70 or <LLN) during obstruction; may normalize between attacks", "Obstructive pattern; confirm reversibility"],
    ["Bronchodilator reversibility", "FEV1 increase ≥12% AND ≥200 mL post-SABA", "Confirms asthma diagnosis"],
    ["Peak Expiratory Flow (PEF)", "Diurnal variability >10% (adults); variable PEF predicts exacerbations", "Monitoring and impairment assessment"],
    ["Methacholine PC20", "PC20 <8 mg/mL = airway hyperresponsiveness", "Useful when spirometry normal; key for impairment (AMA Guides)"],
    ["FeNO (exhaled NO)", "≥25 ppb (adults); ≥20 ppb supports T2 eosinophilic asthma", "Guides ICS dose and biologic selection (dupilumab, tezepelumab)"],
    ["Exercise challenge", "FEV1 fall ≥10% post-exercise", "Confirms exercise-induced asthma/bronchoconstriction"],
]
story.append(make_table(lft[0:1], lft[1:], [4*cm, 6.5*cm, 6.5*cm]))
story.append(sp(6))

story.append(h2("5.3 Other Investigations"))
story += [
    bul("<b>Blood eosinophil count:</b> Elevated in atopic asthma; predicts response to anti-IL-5 biologics (threshold ≥300/µL for most biologics)"),
    bul("<b>Total and specific IgE:</b> Elevated in atopic asthma; used to calculate omalizumab dose"),
    bul("<b>Skin prick tests / RAST / ImmunoCAP:</b> Identify specific allergen sensitization"),
    bul("<b>Chest X-ray:</b> Usually normal; hyperinflation in severe disease; rules out alternative diagnoses"),
    bul("<b>HRCT chest:</b> Bronchial wall thickening, air trapping; rule out bronchiectasis, EGPA, ABPA"),
    bul("<b>ABG:</b> In acute severe asthma — hypoxaemia; rising PaCO2 indicates impending respiratory failure"),
    bul("<b>Sputum eosinophils:</b> >3% supports eosinophilic asthma; guides ICS dosing"),
]
story.append(sp(8))

# 1.6 Differential Diagnosis
story.append(h1("6. Differential Diagnosis"))
story.append(sp(4))
dd_data = [
    ["Condition", "Distinguishing Features"],
    ["COPD", "Age >40, smoking history, irreversible obstruction, low DLCO, CT emphysema"],
    ["Cardiac asthma / Left heart failure", "Orthopnoea, PND, fine basal crepitations, raised JVP, S3 gallop, BNP elevated"],
    ["Vocal cord dysfunction (VCD)", "Inspiratory stridor, paradoxical VF movement on laryngoscopy, normal spirometry between episodes"],
    ["Allergic bronchopulmonary aspergillosis (ABPA)", "Central bronchiectasis, very high IgE, Aspergillus precipitins, eosinophilia, mucus plugs"],
    ["Eosinophilic granulomatosis with polyangiitis (EGPA)", "Severe asthma, blood eosinophilia >1500, constitutional symptoms, ANCA, multi-organ involvement"],
    ["Bronchiectasis", "Chronic productive cough, CT bronchiectasis, fixed obstruction"],
    ["Tracheobronchomalacia", "Dynamic airway collapse on expiration, stridor, CT/bronchoscopy confirms"],
    ["Hyperventilation syndrome", "Normal spirometry, capnography shows hypocapnia, positive Nijmegen questionnaire"],
]
story.append(make_table(dd_data[0:1], dd_data[1:], [5*cm, 12*cm]))
story.append(sp(10))
story.append(pg())

# ────────────────────────────────────────────────────────────────────────────
#  PART 2 — GINA 2026
# ────────────────────────────────────────────────────────────────────────────
story.append(Paragraph("PART 2", ParagraphStyle("PART2", fontSize=11,
    textColor=colors.HexColor("#4a6fa5"), alignment=TA_CENTER,
    fontName="Helvetica-Oblique")))
story.append(Paragraph("Global Initiative for Asthma — GINA 2026",
    ParagraphStyle("PTTL2", fontSize=16, textColor=colors.HexColor("#1a3a5c"),
    alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=4)))
story.append(Paragraph("Global Strategy for Asthma Management and Prevention — 2026 Update (Published May 5, 2026)",
    ParagraphStyle("PSTL2", fontSize=9.5, textColor=colors.HexColor("#666666"),
    alignment=TA_CENTER, fontName="Helvetica-Oblique", spaceAfter=16)))
story.append(hr())
story.append(sp(4))

# 2026 Key Updates Box
story.append(h1("7. GINA 2026 — Key Updates at a Glance"))
story.append(sp(4))
story.append(warn(
    "NEW IN 2026: Four new flowcharts for primary care/ED management of exacerbations "
    "(adults, adolescents, children 6–11, children ≤5). ICS-formoterol added as alternative "
    "to SABA for mild exacerbations. Two new biologics added (depemokimab, generic anti-IgE). "
    "Revised oxygen saturation thresholds."
))
story.append(sp(4))
updates_data = [
    ["Domain", "2026 Update"],
    ["Exacerbation flowcharts",
     "4 new age-specific flowcharts for primary care AND emergency settings:\n"
     "(1) Adults/adolescents — primary care\n(2) Adults/adolescents — acute care/ED\n"
     "(3) Children 6–11 — primary care/ED\n(4) Children ≤5 — primary care/ED"],
    ["Mild exacerbation treatment",
     "ICS-formoterol (budesonide-formoterol) added as an ALTERNATE to inhaled SABA for mild "
     "exacerbations in adults, adolescents, and children 6–11 presenting to primary care or ED"],
    ["Oxygen saturation thresholds",
     "Supplemental O2 NOT recommended unless SpO2 <92%\n"
     "Target SpO2: 93–95% (adults, adolescents, children 6–11)\n"
     "Target SpO2: ≥92% (children ≤5 with severe exacerbation/acute wheeze)"],
    ["SABA dosing",
     "Updated recommended SABA doses for moderate presentation:\n"
     "Salbutamol 4–6 puffs by pMDI+spacer (or 2.5 mg by nebulizer), up to 3 times, 20–30 min apart\n"
     "IMPORTANT: Shake pMDI before each actuation (suspension formulations — salbutamol, budesonide-formoterol, fluticasone-salmeterol)"],
    ["Biologics — new additions",
     "Depemokimab (anti-IL-5, ultra-long-acting): approved for severe eosinophilic asthma (≥12y) and CRSwNP (≥18y)\n"
     "Generic anti-IgE (biosimilar omalizumab-igec) added for allergic asthma and CRSwNP"],
    ["Biologics — updated table",
     "New table lists non-asthma indications for all 4 biologic classes:\n"
     "Anti-IgE, Anti-IL-5/5R, Anti-IL-4R, Anti-TSLP — relevant comorbidities guide biologic choice"],
    ["Step 5 — LAMA update",
     "Add-on LAMA (triple ICS-LABA-LAMA) in step 5: reduces severe exacerbations vs ICS-LABA,\n"
     "BUT far less than biologics. Triple therapy useful for patients who DON'T qualify for biologics"],
    ["Track 2 — Step 1",
     "AIR therapy with ICS-SABA (budesonide-salbutamol) now added at GINA Track 2 Step 1\n"
     "Note: cannot be used as MART; max 6 doses (2 inhalations each) per 24 hours"],
    ["Children 6–11 — AIR",
     "In children 5–15y: as-needed low-dose budesonide-formoterol reduced moderate-severe\n"
     "exacerbations by ~50% vs SABA alone — supports AIR at Steps 1–2"],
    ["OCS minimization",
     "Optimize to minimize OCS: address modifiable risk factors, non-pharmacologic strategies,\n"
     "inhaler technique. All patients should receive ICS-containing therapy. ICS-formoterol\n"
     "or ICS-SABA as AIR reduces risk of OCS-requiring exacerbations"],
    ["Red flags for fatality risk",
     "Updated list of red flags for fatal/near-fatal asthma in adults/adolescents\n"
     "(previous ICU admission, ≥2 ED visits or hospitalizations in past year, on/recently stopped OCS,\n"
     "not currently on ICS, poor adherence, psychosocial problems, comorbid COPD/cardiovascular disease)"],
    ["Discharge & follow-up",
     "Updated guidance on discharge planning and structured follow-up post-exacerbation\n"
     "to reduce readmission risk"],
    ["New assessment tools",
     "Chronic Airways Assessment Test (CAAT)\n"
     "Pediatric Asthma Impairment and Risk Questionnaire (Peds-AIRQ)\n"
     "Pediatric Respiratory Assessment Measure (PRAM)"],
    ["Inhaler technique",
     "Single-breath vs tidal-breathing technique with pMDI+spacer — additional detail added\n"
     "Reminder to SHAKE suspension pMDIs before every actuation"],
    ["Allergen immunotherapy",
     "HDM SLIT: consider for sensitized patients with allergic rhinitis and stable (not well-controlled) asthma\n"
     "Safety advice reinforced"],
]
story.append(make_table(updates_data[0:1], updates_data[1:], [4.5*cm, 12.5*cm]))
story.append(sp(10))

# GINA Stepwise Treatment
story.append(h1("8. GINA 2026 Stepwise Treatment — Adults & Adolescents (≥12 years)"))
story.append(sp(4))
story.append(body(
    "GINA 2026 uses a personalized <b>Assess → Adjust → Review Response</b> cycle. "
    "Two parallel treatment tracks are available. The core concept is the "
    "<b>Anti-Inflammatory Reliever (AIR)</b> — ICS-containing therapy used as reliever "
    "to reduce exacerbation risk."
))
story.append(sp(6))

story.append(h2("Track 1 (Preferred) — ICS-Formoterol as Reliever (MART)"))
t1 = [
    ["Step", "Preferred Controller", "Other Controller Options", "Preferred Reliever"],
    ["Step 1\n(Intermittent)\nAIR-only",
     "None (AIR only)\n\nAs-needed low-dose ICS-formoterol is sufficient",
     "Low-dose ICS taken whenever SABA taken (off-label)",
     "As-needed\nlow-dose ICS-formoterol*"],
    ["Step 2\n(Mild persistent)",
     "Low-dose ICS daily\nOR\nAs-needed ICS-formoterol (AIR only)",
     "LTRA†\nLow-dose ICS taken whenever SABA taken",
     "As-needed\nlow-dose ICS-formoterol*"],
    ["Step 3\n(Moderate)",
     "MART — low-dose ICS-formoterol maintenance",
     "Medium-dose ICS\nLow-dose ICS + LTRA†",
     "As-needed\nlow-dose ICS-formoterol*"],
    ["Step 4\n(Moderate-Severe)",
     "MART — medium-dose ICS-formoterol maintenance",
     "High-dose ICS\nAdd-on tiotropium (LAMA)\nAdd-on LTRA†",
     "As-needed\nICS-formoterol*"],
    ["Step 5\n(Severe)",
     "High-dose ICS-LABA\nRefer for phenotypic assessment ± biologic\n(see Section 10)",
     "Add-on LAMA (tiotropium)\n— reduces exacerbations but less than biologics\nAdd low-dose OCS (consider side effects)",
     "As-needed\nICS-formoterol*"],
]
story.append(make_table(t1[0:1], t1[1:], [2.5*cm, 5.5*cm, 4.5*cm, 4.5*cm]))
story.append(sp(4))
story.append(note(
    "*MART = Maintenance And Reliever Therapy with ICS-formoterol. "
    "Preferred ICS-formoterol: budesonide 200 mcg/formoterol 6 mcg per actuation. "
    "Add safety prompt: seek care if requiring >specified number of inhalations in 24 hours. "
    "†LTRA (montelukast): advise about neuropsychiatric adverse effects risk."
))
story.append(sp(8))

story.append(h2("Track 2 (Alternative) — SABA or ICS-SABA as Reliever"))
story.append(body(
    "Check if patient is likely to adhere to daily controller therapy before prescribing Track 2."
))
t2 = [
    ["Step", "Preferred Controller", "Other Controller Options", "Reliever"],
    ["Step 1\n(2026 NEW)", "Low-dose ICS taken whenever SABA taken",
     "None (for truly intermittent symptoms only)",
     "SABA as needed\nOR ICS-SABA (budesonide-salbutamol) — NEW 2026"],
    ["Step 2", "Low-dose ICS daily", "LTRA†", "SABA as needed"],
    ["Step 3", "Low-dose ICS-LABA", "Medium-dose ICS\nLow-dose ICS + LTRA†",
     "SABA as needed"],
    ["Step 4", "Medium-dose ICS-LABA", "High-dose ICS\nAdd tiotropium\nAdd LTRA†",
     "SABA as needed"],
    ["Step 5", "High-dose ICS-LABA + phenotype assessment", "Add-on LAMA\nLow-dose OCS",
     "SABA as needed"],
]
story.append(make_table(t2[0:1], t2[1:], [2.5*cm, 5.5*cm, 4.5*cm, 4.5*cm]))
story.append(sp(8))

# Children
story.append(h1("9. GINA 2026 — Children 6–11 Years"))
story.append(sp(4))
story.append(body(
    "As-needed low-dose budesonide-formoterol (AIR) in children 5–15 years reduced "
    "moderate-severe exacerbations by ~50% vs SABA alone (new 2026 evidence). "
    "Consensus advice on treatment initiation step added in 2026."
))
story.append(sp(6))
child = [
    ["Step", "Preferred Controller", "Other Options", "Reliever"],
    ["Step 1", "None (AIR only)", "Low-dose ICS when SABA taken",
     "As-needed ICS-formoterol (AIR)\nOR SABA"],
    ["Step 2", "Low-dose ICS daily", "LTRA†",
     "As-needed ICS-formoterol (AIR)\nOR SABA"],
    ["Step 3", "MART — low-dose ICS-formoterol\nOR low-dose ICS-LABA",
     "Medium-dose ICS\nLow-dose ICS + LTRA†",
     "As-needed ICS-formoterol\nOR SABA"],
    ["Step 4", "MART — medium-dose ICS-formoterol\nOR medium-dose ICS-LABA",
     "High-dose ICS\nAdd LTRA†",
     "As-needed ICS-formoterol\nOR SABA"],
    ["Step 5", "High-dose ICS-LABA\nRefer for phenotype/biologic assessment",
     "Add-on LAMA or LTRA†\nOCS if necessary",
     "As-needed ICS-formoterol\nOR SABA"],
]
story.append(make_table(child[0:1], child[1:], [2.5*cm, 5.5*cm, 4.5*cm, 4.5*cm]))
story.append(sp(6))
story.append(note("†LTRA (montelukast): inform parents/caregivers of neuropsychiatric adverse effect risk. "
    "MART doses: see GINA 2026 Table."))
story.append(sp(10))

# Children under 5
story.append(h1("10. GINA 2026 — Children ≤5 Years"))
story.append(sp(4))
story.append(body(
    "A new flowchart for primary care/ED management of acute wheeze and asthma in children "
    "≤5 years was added in 2026. Oxygen target SpO2 ≥92% for this age group in severe exacerbation."
))
story += [
    bul("<b>Step 1–2:</b> Low-dose ICS daily OR as-needed; SABA reliever"),
    bul("<b>Step 3:</b> Low-dose ICS + LTRA, or double-dose ICS"),
    bul("<b>Step 4:</b> Refer to specialist; high-dose ICS + LTRA; consider montelukast"),
    bul("<b>Reliever:</b> SABA (salbutamol) at all steps; ICS-formoterol NOT currently licensed <5 years"),
    bul("<b>Trial of ICS:</b> If not responding, reconsider diagnosis before stepping up"),
]
story.append(sp(10))

# Biologics
story.append(h1("11. Step 5 Biologic Therapies — GINA 2026 Update"))
story.append(sp(4))
story.append(body(
    "Refer for phenotypic/endotypic assessment before initiating biologics. Consider: "
    "predictors of asthma response, relevant comorbidities, cost, route of administration, "
    "dosing frequency, and patient preference. Two new biologics added in 2026."
))
story.append(sp(6))
bio = [
    ["Biologic", "Target", "Indication (Asthma)", "2026 Notes"],
    ["Omalizumab\n(+ biosimilar\nomalizumab-igec *NEW 2026*)",
     "Anti-IgE",
     "Allergic asthma; total IgE elevated; sensitization confirmed; ≥6y (omalizumab), ≥12y (biosimilar)",
     "Generic anti-IgE (omalizumab-igec) now added in 2026. Also for CRSwNP."],
    ["Mepolizumab\nBenralizumab\nReslizumab",
     "Anti-IL-5 /\nAnti-IL-5Rα",
     "Severe eosinophilic asthma; blood eosinophils ≥300/µL;\nReduces exacerbations ~50%",
     "Depemokimab (ultra-long-acting anti-IL-5, Q6-monthly dosing) added 2026 for severe eosinophilic asthma ≥12y; also CRSwNP ≥18y"],
    ["Dupilumab",
     "Anti-IL-4Rα\n(blocks IL-4 &\nIL-13)",
     "Severe eosinophilic asthma OR FeNO ≥20–25 ppb; OCS-dependent asthma regardless of biomarkers;\nReduces exacerbations ≥50%",
     "Also approved: nasal polyposis, atopic dermatitis, eosinophilic esophagitis, COPD with eosinophils. Paradoxical initial eosinophilia may occur."],
    ["Tezepelumab",
     "Anti-TSLP\n(proximal alarmin)",
     "Broadest spectrum — effective even without ↑ eosinophils or FeNO; reduces exacerbations 50–70%;\nImproves FEV1 and symptoms",
     "Targets proximal alarmin TSLP, blocking multiple downstream T2 and non-T2 pathways. Most effects within 3–6 months."],
    ["Depemokimab\n*NEW 2026*",
     "Anti-IL-5\n(ultra-long-acting)",
     "Severe eosinophilic asthma ≥12y; blood eosinophils ≥300/µL",
     "Ultra-long half-life allows Q6-monthly subcutaneous dosing. Also approved for CRSwNP ≥18y."],
]
story.append(make_table(bio[0:1], bio[1:], [3.5*cm, 2.8*cm, 5.5*cm, 5.2*cm]))
story.append(sp(4))
story.append(note(
    "2026 GINA: Triple therapy (ICS+LABA+LAMA) at Step 5 reduces severe exacerbations vs ICS-LABA, "
    "but far less than biologics. Useful for patients who do NOT qualify for biologics. "
    "Add low-dose OCS only if all else fails — consider adrenal suppression, osteoporosis, diabetes, cataracts."
))
story.append(sp(10))

# Exacerbations
story.append(h1("12. Asthma Exacerbations — GINA 2026 Management"))
story.append(sp(4))
story.append(body(
    "GINA 2026 added four new age-specific flowcharts for exacerbation management in both "
    "primary care and emergency/acute care settings. Key updates are highlighted below."
))
story.append(sp(6))

story.append(h2("12.1 Severity Classification"))
sev = [
    ["Severity", "Symptoms", "SpO2", "FEV1/PEF", "Action"],
    ["Mild", "Talks in sentences; not distressed; RR normal", "≥95%", ">80% predicted", "Increase reliever; may use ICS-formoterol OR SABA; monitor 1 hour"],
    ["Moderate", "Talks in phrases; accessory muscles; agitated", "91–94%", "60–80%", "SABA 4–6 puffs q20 min ×3; start OCS; controlled O2"],
    ["Severe", "Talks in words only; marked distress; unable to complete sentences", "≤90%", "<60%", "Urgent medical care; continuous SABA; IV MgSO4; controlled O2; consider ICU"],
    ["Life-threatening", "Cyanosis; silent chest; confusion; bradycardia; exhaustion", "<90%", "<33%", "ICU; intubation risk; immediate IV MgSO4; nebulized SABA/ipratropium"],
]
story.append(make_table(sev[0:1], sev[1:], [2.5*cm, 4*cm, 2.5*cm, 3*cm, 5*cm]))
story.append(sp(6))

story.append(h2("12.2 Treatment Protocol (Adults/Adolescents — Primary Care)"))
story += [
    bul("<b>Mild exacerbation:</b> ICS-formoterol (AIR) as-needed OR SABA puffs — NEW 2026"),
    bul("<b>Moderate exacerbation:</b> Salbutamol 4–6 puffs pMDI+spacer OR 2.5 mg nebulizer, up to 3 times, 20–30 min apart"),
    bul("<b>OCS — Adults:</b> Prednisolone 40–50 mg/day × 5–7 days"),
    bul("<b>OCS — Children:</b> Prednisolone 1–2 mg/kg/day (max 40 mg) × 3–5 days"),
    bul("<b>Oxygen (2026 REVISED):</b> Supplemental O2 NOT recommended unless SpO2 <92%; target 93–95%"),
    bul("<b>Ipratropium bromide:</b> Add to SABA for moderate-severe exacerbations (reduces hospitalizations)"),
    bul("<b>IV Magnesium sulfate (MgSO4):</b> 2g IV over 20 min for severe/life-threatening attacks not responding to initial treatment"),
    bul("<b>Heliox:</b> May reduce work of breathing in near-fatal asthma"),
    bul("<b>Do NOT:</b> Routine CXR, blood gases, antibiotics (unless proven infection), sedatives"),
]
story.append(sp(6))
story.append(h2("12.3 Red Flags for Fatal/Near-Fatal Asthma (GINA 2026)"))
story.append(warn(
    "HIGH RISK FOR FATAL ASTHMA: Previous ICU admission or intubation for asthma | "
    "≥2 ED visits OR ≥1 hospitalization in past year | "
    "Currently using or recently stopped OCS | NOT currently on ICS | "
    "Poor adherence to medications | Psychosocial problems or denial | "
    "Comorbid COPD, cardiovascular disease, or obesity | "
    "Rapid deterioration or symptoms persisting despite current treatment"
))
story.append(sp(8))

story.append(h2("12.4 Discharge Planning (GINA 2026 — Updated)"))
story += [
    bul("Before discharge: check technique with written action plan"),
    bul("Prescribe or continue ICS-containing therapy — reduce risk of relapse"),
    bul("OCS course if needed (complete as prescribed)"),
    bul("Arrange follow-up within 2–7 days (high risk) or 4 weeks (lower risk)"),
    bul("Review and optimize maintenance therapy to prevent recurrence"),
    bul("Address adherence, inhaler technique, triggers, smoking cessation"),
]
story.append(sp(10))

# Non-pharmacological
story.append(h1("13. Non-Pharmacological Strategies (All Steps)"))
story.append(sp(4))
np_data = [
    ["Strategy", "Key Points"],
    ["Smoking cessation", "Essential — smoking worsens asthma, impairs ICS efficacy, accelerates decline in FEV1; offer pharmacotherapy + counselling"],
    ["Physical activity", "All patients encouraged to be physically active; warm-up before exercise; treat exercise-induced symptoms with pre-exercise ICS-formoterol or SABA"],
    ["Weight management", "Obesity worsens asthma severity, reduces ICS response, and increases exacerbation risk; weight reduction improves control"],
    ["Vaccinations", "Annual influenza vaccination; pneumococcal vaccination; COVID-19 vaccination for all asthma patients"],
    ["Allergen avoidance", "Identify sensitization (skin prick/specific IgE); reduce exposure to HDM, animal dander, cockroach, mold; HEPA filtration"],
    ["Occupational exposure", "Identify and eliminate sensitizer or irritant; early removal from exposure improves prognosis in sensitizer-induced occupational asthma"],
    ["HDM sublingual immunotherapy (SLIT)", "Consider for sensitized patients with allergic rhinitis and FEV1 >70% and not well-controlled (but stable) asthma; safety monitoring required"],
    ["Breathing exercises", "May complement pharmacotherapy; Buteyko technique may reduce hyperventilation symptoms; yoga/relaxation — limited RCT evidence"],
    ["Pulmonary rehabilitation", "Recommended for those with significant functional limitation; improves exercise capacity and quality of life"],
    ["Air pollution avoidance", "Reduce indoor pollutants (gas cooking, paint fumes); avoid outdoor exercise on high pollution days"],
]
story.append(make_table(np_data[0:1], np_data[1:], [5*cm, 12*cm]))
story.append(sp(10))

# Assessment tools
story.append(h1("14. Asthma Assessment Tools (GINA 2026)"))
story.append(sp(4))
story.append(body("Standard validated questionnaires for symptom control and risk assessment:"))
story.append(sp(4))
tools_data = [
    ["Tool", "Full Name", "Use"],
    ["ACQ", "Asthma Control Questionnaire (5 or 7 items)", "Measures symptom control (score 0–6; well-controlled <0.75)"],
    ["ACT", "Asthma Control Test (5 items)", "Self-administered; score 0–25; ≥20 = well-controlled"],
    ["CAAT *NEW 2026*", "Chronic Airways Assessment Test", "Assesses both asthma symptoms AND functional impact; 2026 addition"],
    ["Peds-AIRQ *NEW 2026*", "Pediatric Asthma Impairment and Risk Questionnaire", "Paediatric composite tool — impairment and risk domains"],
    ["PRAM *NEW 2026*", "Pediatric Respiratory Assessment Measure", "Acute severity scoring in children; ED setting"],
    ["PAQLQ", "Paediatric Asthma Quality of Life Questionnaire", "Paediatric QoL measure (7–17 years)"],
]
story.append(make_table(tools_data[0:1], tools_data[1:], [3.5*cm, 5.5*cm, 8*cm]))
story.append(sp(10))

# Monitoring
story.append(h1("15. Step-Up / Step-Down — Principles"))
story.append(sp(4))
story.append(body(
    "GINA recommends reviewing every 1–3 months initially, then 3–12 monthly once stable. "
    "Before stepping up, always check:"
))
story += [
    bul("<b>Inhaler technique</b> — demonstrate and check at every visit; poor technique causes 'treatment failure' in up to 50% of cases"),
    bul("<b>Adherence</b> — address barriers (cost, forgetting, side-effect concerns, beliefs about need for medication)"),
    bul("<b>Comorbidities</b> — rhinitis, GERD, obesity, obstructive sleep apnea, vocal cord dysfunction — treat these first"),
    bul("<b>Triggers</b> — ongoing allergen or irritant exposure; smoking"),
    bul("<b>Correct diagnosis</b> — confirm asthma, not alternative diagnosis"),
]
story.append(sp(6))
stepdown = [
    ["Action", "Criterion / Note"],
    ["Consider step DOWN", "Asthma well-controlled for ≥3 months on current treatment; low risk"],
    ["MAINTAIN current step", "Asthma well-controlled but high risk of exacerbation or side effects from stepping down"],
    ["Step UP (short-term)", "Temporary increase for 1–2 weeks: viral URTI, allergen season"],
    ["Step UP (sustained)", "Review at 2–3 months; if no response — check technique/adherence first"],
    ["Consider biologic referral", "Step 5: uncontrolled on high-dose ICS-LABA despite optimal management"],
]
story.append(make_table(stepdown[0:1], stepdown[1:], [5.5*cm, 11.5*cm]))
story.append(sp(10))

# Pregnancy
story.append(h1("16. Special Situations"))
story.append(sp(4))
story.append(h2("16.1 Asthma in Pregnancy"))
story += [
    bul("Asthma control may improve, worsen, or remain unchanged during pregnancy"),
    bul("Uncontrolled asthma is more harmful to the fetus than asthma medications"),
    bul("All standard asthma medications (ICS, SABA, LABA, LTRA) are considered safe in pregnancy"),
    bul("Avoid OCS in first trimester if possible; use if clinically needed"),
    bul("Biologics: insufficient safety data — use only if clearly needed"),
    bul("Continue ICS throughout pregnancy to prevent exacerbations"),
    bul("Influenza vaccination recommended in pregnancy"),
]
story.append(sp(6))
story.append(h2("16.2 Asthma and Surgery / Anaesthesia"))
story += [
    bul("Optimise asthma before elective surgery; FEV1 should be >80% predicted if possible"),
    bul("Continue ICS perioperatively — do not stop"),
    bul("Premedicate with SABA if FEV1 <80%"),
    bul("Inform anaesthetist — avoid airway irritants, use regional anaesthesia if feasible"),
    bul("OCS cover for moderate-severe asthma undergoing major surgery"),
]
story.append(sp(6))
story.append(h2("16.3 Asthma and COPD Overlap (ACO)"))
story += [
    bul("Features of both asthma (eosinophilia, reversibility, atopy) AND COPD (smoking, fixed obstruction, emphysema)"),
    bul("ICS mandatory — do not give LABA alone without ICS"),
    bul("Higher OCS requirements; consider biologics if T2-high features present"),
    bul("Smoking cessation is especially important"),
]
story.append(sp(10))

# Final reference
story.append(h1("17. Quick Drug Reference — Key Asthma Medications"))
story.append(sp(4))
drugs = [
    ["Drug Class", "Examples", "Dose Notes (Adults)", "Key Points"],
    ["Low-dose ICS", "Budesonide 200–400 mcg/day\nFluticasone propionate 100–250 mcg/day\nBeclometasone 200–500 mcg/day",
     "Twice daily dosing standard; once daily acceptable for well-controlled patients",
     "Cornerstone of asthma treatment; rinse mouth to prevent oral candidiasis"],
    ["ICS-Formoterol\n(MART / AIR)", "Budesonide/formoterol\n(Symbicort, Somirat, etc.)\n200/6 mcg per actuation",
     "MART: 1–2 puffs maintenance BD + 1–2 puffs relief prn (max 6–8/day total)\nAIR (steps 1–2): 1–2 puffs as-needed only",
     "PREFERRED reliever across all GINA steps. Shake before use (suspension)."],
    ["ICS-SABA (AIR)\nNEW Track 2 Step 1",
     "Budesonide-salbutamol\nBeclometasone-salbutamol",
     "Max 6 doses (2 puffs each) per 24h; NOT for MART",
     "2026 addition for Track 2 Step 1; shake before use"],
    ["LABA + ICS", "Fluticasone/salmeterol\nFluticasone furoate/vilanterol (once daily)",
     "Once or twice daily depending on formulation",
     "Never use LABA without ICS in asthma"],
    ["SABA", "Salbutamol (albuterol) 100 mcg/puff\nTerbutaline",
     "2–4 puffs as needed; max 4–6 hourly\nNebulizer: 2.5 mg",
     "Shake suspension pMDI before each actuation. ≥3 uses/week = consider step up"],
    ["LAMA", "Tiotropium 5 mcg/day (Respimat)\nUmeclidinium",
     "Once daily; add-on at Steps 4–5",
     "Approved for add-on in asthma ≥18y; step 5 triple therapy"],
    ["LTRA", "Montelukast 10 mg nocte",
     "Once daily; alternative or add-on",
     "Risk of neuropsychiatric effects (black box warning); advise patients"],
    ["OCS", "Prednisolone 40–50 mg/day",
     "Exacerbations: 5–7 days; reduce as quickly as possible long-term",
     "Long-term use only if all else fails — significant side effects"],
    ["Anti-IgE", "Omalizumab SC every 2–4 weeks (dose by weight + IgE level)",
     "SC injection; dose calculated from baseline IgE and body weight",
     "Allergic asthma; IgE 30–1500 IU/mL; monitor for anaphylaxis (observe 30 min)"],
    ["Anti-IL-5", "Mepolizumab 100 mg SC monthly\nBenralizumab 30 mg SC (monthly ×3 then Q8W)\nDepemokimab 100 mg SC Q6M *NEW*",
     "All subcutaneous; different dosing intervals",
     "For severe eosinophilic asthma; blood eos ≥300/µL preferred"],
    ["Anti-IL-4R", "Dupilumab 200 mg SC Q2W",
     "Subcutaneous; fortnightly",
     "For T2-high asthma; effective with or without elevated eosinophils if FeNO ≥20–25 ppb"],
    ["Anti-TSLP", "Tezepelumab 210 mg SC monthly",
     "Subcutaneous; monthly",
     "Broadest spectrum biologic; works even in non-T2 asthma"],
]
story.append(make_table(drugs[0:1], drugs[1:], [3*cm, 4.5*cm, 4*cm, 5.5*cm]))
story.append(sp(20))
story.append(hr())
story.append(sp(4))
story.append(src(
    "Sources: Fishman's Pulmonary Diseases and Disorders, 2-Volume Set, Ch. 43, 44, 45 (Barnes, Usmani et al.) | "
    "GINA 2026 Strategy Report — Global Strategy for Asthma Management and Prevention (May 5, 2026) | "
    "Guideline Central GINA 2026 Summary | Pulmonology Advisor GINA 2026 Review | "
    "Generated by Orris Medical AI — July 2026"
))

# Build
doc.build(story, onFirstPage=header_footer, onLaterPages=header_footer)
print("PDF created:", OUTPUT)
Running Command

cd /home/daytona/workspace/gina-asthma-pdf && python generate_full_pdf.py 2>&1

Editing File

~/gina-asthma-pdf/generate_full_pdf.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/gina-asthma-pdf/generate_full_pdf.py'
Running Command

cd /home/daytona/workspace/gina-asthma-pdf && python generate_full_pdf.py 2>&1

Model call limits exceeded: run limit (20/20)
This is a shared conversation. Sign in to Orris to start your own chat.