{"files":{"main.py":"from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n","core.py":"from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_dt, overlaps\n\n\ndef run(payload, policy):\n    tz = ZoneInfo(policy['timezone'])\n    utc = timezone.utc\n    now = parse_dt(payload['now']).astimezone(utc)\n    earliest = now + timedelta(minutes=policy['lead_minutes'])\n    rows = list(payload.get('appointments', []))\n\n    chosen = {}\n    order = []\n    for idx, a in enumerate(rows):\n        i = a['id']\n        if i not in chosen:\n            chosen[i] = (idx, a)\n            order.append(i)\n        elif policy['duplicate_policy'] == 'last':\n            chosen[i] = (idx, a)\n    items = [(chosen[i][0], chosen[i][1]) for i in order]\n\n    hi = policy['priority_high_first']\n    if hi:\n        items.sort(key=lambda t: (-t[1]['priority'], t[0]))\n    else:\n        items.sort(key=lambda t: (t[1]['priority'], t[0]))\n\n    selected, blocked, rejected = [], [], []\n    accepted = []\n    index_of = {}\n    adj = policy['adjacency_allowed']\n    for idx, a in items:\n        i = a['id']\n        index_of[i] = idx\n        dur = a['duration']if 'duration' in a else a.get('duration_minutes')\n        if isinstance(dur, bool) or not isinstance(dur, (int, float)) or dur <= 0 or dur > policy['duration_max']:\n            rejected.append(i)\n            continue\n        start = parse_dt(a['start']).astimezone(utc)\n        end = start + timedelta(minutes=dur)\n        if start < earliest:\n            rejected.append(i)\n            continue\n        local = start.astimezone(tz)\n        if local.date().isoformat() == policy['blackout_day']:\n            rejected.append(i)\n            continue\n        cutoff = datetime(local.year, local.month, local.day, policy['cutoff_hour'], 0, tzinfo=tz).astimezone(utc)\n        if policy['cutoff_inclusive']:\n            ok = end <= cutoff\n        else:\n            ok = end < cutoff\n        if not ok:\n            rejected.append(i)\n            continue\n        cancelled = bool(a.get('cancelled', False))\n        if cancelled and not policy['cancelled_blocks']:\n            rejected.append(i)\n            continue\n        count = sum(1 for (s, e) in accepted if overlaps(start, end, s, e, adj))\n        if count >= policy['capacity']:\n            rejected.append(i)\n            continue\n        accepted.append((start, end))\n        if cancelled:\n            blocked.append(i)\n        else:\n            selected.append(i)\n\n    def key(i):\n        return i if policy['report_order'] == 'id' else index_of[i]\n    return {\n        'selected': sorted(selected, key=key),\n        'blocked': sorted(blocked, key=key),\n        'rejected': sorted(rejected, key=key),\n    }\n","policy.py":"POLICY = {\"adjacency_allowed\": True, \"blackout_day\": \"2026-11-01\", \"cancelled_blocks\": True, \"capacity\": 1, \"cutoff_hour\": 17, \"cutoff_inclusive\": True, \"duplicate_policy\": \"first\", \"duration_max\": 120, \"lead_minutes\": 30, \"priority_high_first\": True, \"report_order\": \"id\", \"timezone\": \"America/New_York\"}\n","helpers.py":"from datetime import datetime\n\n\ndef parse_dt(s):\n    if isinstance(s, str) and s.endswith('Z'):\n        s = s[:-1] + '+00:00'\n    return datetime.fromisoformat(s)\n\n\ndef overlaps(s1, e1, s2, e2, adjacency_allowed):\n    if adjacency_allowed:\n        return s1 < e2 and s2 < e1\n    return s1 <= e2 and s2 <= e1\n"}}