{ "schema_version": 1, "channel": "homelab-runtime", "command_id": "GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z", "status": "OK", "rc": 0, "host": "pve01", "mode": "verify", "component": "gram1-charts-v38r1-conflict", "started_at_utc": "2026-08-01T12:43:26Z", "finished_at_utc": "2026-08-01T12:43:27Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", "command_sha256": "7a893a91638a4f1e9b7bc56a5953f15a92f5e83f98db532793a6a4c70ab87132", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, "change_declared": false, "result_contract_valid": true, "result_contract_status": null, "result_contract_error": null, "command_rc": 0, "changes_made": false, "rollback_started": false, "rollback_restored": null, "mutation_outcome": "NO_MUTATION", "sanitized": true, "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, "raw_evidence_sha256": "7909460d0d093dc7b3fd4fc26760c31b746c2726817e367c4f54af19d08b1973", "sanitized_output_sha256": "1d40dade1f3b2a33564b123ae1f5845ed486fd142c4ffe88f92143c9d8e2a4e9", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"mutation_outcome\":\"NO_MUTATION\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"NO_MUTATION\",\"pinned_host_key_aliases\":[\"[PRIVATE_IP]\"],\"production_site_changed\":false,\"rc\":0,\"remote_result\":{\"app_analysis\":{\"app_bytes\":32843,\"app_sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"chart_matches\":[{\"line\":466,\"snippet\":\"00461: x=left+step*(i+.5);color=\\\"#63e6be\\\" if c>=o else \\\"#ff6b81\\\";yo=y(o);yc=y(c);yh=y(h);yl=y(l);rh=max(1.2,abs(yc-yo));ry=min(yo,yc)\\n00462: parts.append(f'');parts.append(f'')\\n00463: parts.append(f'{_gram1_html.escape(symbol)} / USDT · 1M · {len(rows)} свечей')\\n00464: return ''.join(parts)\\n00465: \\n00466: @app.get(\\\"/api/chart-svg/{symbol}\\\", include_in_schema=False)\\n00467: async def _gram1_chart_svg_endpoint_v4(symbol: str, request: _Gram1Request):\\n00468: if not request.session.get(\\\"auth\\\"):\\n00469: return _Gram1Response(content=\\\"Требуется вход\\\", status_code=401, media_type=\\\"text/plain; charset=utf-8\\\")\\n00470: symbol=symbol.upper()\\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:\",\"token\":\"/api/chart-svg\"},{\"line\":397,\"snippet\":\"00392: require_login(request)\\n00393: with db() as c:\\n00394: c.execute(\\\"DELETE FROM alerts WHERE id=?\\\",(alert_id,)); c.commit()\\n00395: return {\\\"ok\\\":True}\\n00396: \\n00397: # GRAM1_SERVER_CHART_FALLBACK_V4\\n00398: import asyncio as _gram1_asyncio\\n00399: import base64 as _gram1_base64\\n00400: import html as _gram1_html\\n00401: import inspect as _gram1_inspect\\n00402: import json as _gram1_json\",\"token\":\"GRAM1_SERVER_CHART_FALLBACK_V4\"},{\"line\":452,\"snippet\":\"00447: except Exception:\\n00448: continue\\n00449: if not rows: raise RuntimeError(\\\"no valid OHLC rows\\\")\\n00450: return rows[-180:]\\n00451: \\n00452: def _gram1_chart_svg_v4(symbol: str, rows):\\n00453: width,height,left,right,top,bottom=1200,430,72,28,24,42\\n00454: lo=min(r[3] for r in rows);hi=max(r[2] for r in rows);span=max(hi-lo,abs(hi)*1e-9,1e-12)\\n00455: plot_w=width-left-right;plot_h=height-top-bottom;step=plot_w/max(len(rows),1);body=max(2.0,min(10.0,step*0.58))\\n00456: def y(v): return top+(hi-v)/span*plot_h\\n00457: parts=[f'', '']\",\"token\":\"_gram1_chart_svg_v4\"},{\"line\":475,\"snippet\":\"00470: symbol=symbol.upper()\\n00471: if symbol not in _GRAM1_CHART_SYMBOLS:\\n00472: return _Gram1Response(content=\\\"Неизвестная монета\\\", status_code=404, media_type=\\\"text/plain; charset=utf-8\\\")\\n00473: try:\\n00474: rows=await _gram1_chart_data_v4(symbol,request)\\n00475: svg=_gram1_chart_svg_v4(symbol,rows)\\n00476: return _Gram1Response(content=svg,media_type=\\\"image/svg+xml\\\",headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\\n00477: except Exception as exc:\\n00478: msg=_gram1_html.escape(str(exc))\\n00479: svg=f'Ошибка серверного графика {symbol}: {msg}'\\n00480: return _Gram1Response(content=svg,status_code=503,media_type=\\\"image/svg+xml\\\",headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\",\"token\":\"_gram1_chart_svg_v4\"},{\"line\":409,\"snippet\":\"00404: from fastapi.responses import Response as _Gram1Response\\n00405: \\n00406: _GRAM1_CHART_JS_B64 = \\\"KCgpPT57CiAgInVzZSBzdHJpY3QiOwogIGNvbnN0IFZFUlNJT049IkdSQU0xX0NIQVJUU19FWFRFUk5BTF9WNCI7CiAgY29uc3Qgc3ltYm9scz1bIkhCQVIiLCJQT0wiLCJBVkFYIiwiTElOSyJdOwogIGNvbnN0IGNoYXJ0cz1uZXcgTWFwKCk7CiAgY29uc3QgY2FuZGxlQ2FjaGU9bmV3IE1hcCgpOwogIGNvbnN0IHNsZWVwPW1zPT5uZXcgUHJvbWlzZShyZXNvbHZlPT5zZXRUaW1lb3V0KHJlc29sdmUsbXMpKTsKICBjb25zdCBhZnRlckxheW91dD0oKT0+bmV3IFByb21pc2UocmVzb2x2ZT0+cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpKTsKICBjb25zdCB0aW1lS2V5PXZhbHVlPT57CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIil7CiAgICAgIGNvbnN0IG51bWVyaWM9TnVtYmVyKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpcmV0dXJuIG51bWVyaWM7CiAgICAgIGNvbnN0IHBhcnNlZD1EYXRlLnBhcnNlKHZhbHVlKTtpZihOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSlyZXR1cm4gTWF0aC5mbG9vcihwYXJzZWQvMTAwMCk7CiAgICB9CiAgICBpZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09Im9iamVjdCImJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUueWVhcikpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLm1vbnRoKSkmJk51bWJlci5pc0Zpbml0ZShOdW1iZXIodmFsdWUuZGF5KSkpcmV0dXJuIERhdGUuVVRDKE51bWJlcih2YWx1ZS55ZWFyKSxOdW1iZXIodmFsdWUubW9udGgpLTEsTnVtYmVyKHZhbHVlLmRheSkpLzEwMDA7CiAgICByZXR1cm4gTmFOOwogIH07CiAgY29uc3Qgbm9ybWFsaXplVGltZT12YWx1ZT0+ewogICAgaWYodHlwZW9mIHZhbHVlPT09InN0cmluZyImJi9eXGQrJC8udGVzdCh2YWx1ZSkpdmFsdWU9TnVtYmVyKHZhbHVlKTsKICAgIGlmKHR5cGVvZiB2YWx1ZT09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUodmFsdWUpKXJldHVybiBNYXRoLmZsb29yKHZhbHVlPjFlMTE/dmFsdWUvMTAwMDp2YWx1ZSk7CiAgICBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIiYmL15cZHs0fS1cZHsyfS1cZHsyfS8udGVzdCh2YWx1ZSkpcmV0dXJuIHZhbHVlLnNsaWNlKDAsMTApOwogICAgaWYodmFsdWUmJnR5cGVvZiB2YWx1ZT09PSJvYmplY3QiJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLnllYXIpKSYmTnVtYmVyLmlzRmluaXRlKE51bWJlcih2YWx1ZS5tb250aCkpJiZOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHZhbHVlLmRheSkpKXJldHVybiB7eWVhcjpOdW1iZXIodmFsdWUueWVhciksbW9udGg6TnVtYmVyKHZhbHVlLm1vbnRoKSxkYXk6TnVtYmVyKHZhbHVlLmRheSl9OwogICAgcmV0dXJuIG51bGw7CiAgfTsKICBjb25zdCBub3JtYWxpemVDYW5kbGVzPXJhdz0+ewogICAgY29uc3Qgcm93cz1bXTsKICAgIGZvcihjb25zdCBpdGVtIG9mIEFycmF5LmlzQXJyYXkocmF3KT9yYXc6W10pewogICAgICBjb25zdCBpc0FycmF5PUFycmF5LmlzQXJyYXkoaXRlbSk7CiAgICAgIGNvbnN0IHRpbWU9bm9ybWFsaXplVGltZShpc0FycmF5P2l0ZW1bMF06KGl0ZW0mJihpdGVtLnRpbWU/P2l0ZW0ub3Blbl90aW1lPz9pdGVtLm9wZW5UaW1lKSkpOwogICAgICBjb25zdCBvcGVuPU51bWJlcihpc0FycmF5P2l0ZW1bMV06aXRlbSYmaXRlbS5vcGVuKSxoaWdoPU51bWJlcihpc0FycmF5P2l0ZW1bMl06aXRlbSYmaXRlbS5oaWdoKSxsb3c9TnVtYmVyKGlzQXJyYXk/aXRlbVszXTppdGVtJiZpdGVtLmxvdyksY2xvc2U9TnVtYmVyKGlzQXJyYXk/aXRlbVs0XTppdGVtJiZpdGVtLmNsb3NlKTsKICAgICAgaWYodGltZT09PW51bGx8fCFbb3BlbixoaWdoLGxvdyxjbG9zZV0uZXZlcnkoTnVtYmVyLmlzRmluaXRlKSljb250aW51ZTsKICAgICAgcm93cy5wdXNoKHt0aW1lLG9wZW4saGlnaCxsb3csY2xvc2V9KTsKICAgIH0KICAgIHJvd3Muc29ydCgoYSxiKT0+dGltZUtleShhLnRpbWUpLXRpbWVLZXkoYi50aW1lKSk7CiAgICBjb25zdCBkZWR1cD1bXTsKICAgIGZvcihjb25zdCByb3cgb2Ygcm93cyl7Y29uc3Qga2V5PVN0cmluZyh0aW1lS2V5KHJvdy50aW1lKSk7aWYoZGVkdXAubGVuZ3RoJiZTdHJpbmcodGltZUtleShkZWR1cFtkZWR1cC5sZW5ndGgtMV0udGltZSkpPT09a2V5KWRlZHVwW2RlZHVwLmxlbmd0aC0xXT1yb3c7ZWxzZSBkZWR1cC5wdXNoKHJvdyl9CiAgICBpZighZGVkdXAubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQVBJINCy0LXRgNC90YPQuyDQtNCw0L3QvdGL0LUg0LHQtdC3INC60L7RgNGA0LXQutGC0L3Ri9GFIE9ITEMt0YHQstC10YfQtdC5Iik7CiAgICByZXR1cm4gZGVkdXA7CiAgfTsKICBjb25zdCBsb2FkQ2FuZGxlcz1hc3luYyBzeW1ib2w9PnsKICAgIGlmKGNhbmRsZUNhY2hlLmhhcyhzeW1ib2wpKXJldHVybiBjYW5kbGVDYWNoZS5nZXQoc3ltYm9sKTsKICAgIGNvbnN0IHRhc2s9KGFzeW5jKCk9PnsKICAgICAgY29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goIi9hcGkva2xpbmVzLyIrZW5jb2RlVVJJQ29tcG9uZW50KHN5bWJvbCkrIj9saW1pdD0xMDAwJmludGVydmFsPTFNIix7Y2FjaGU6Im5vLXN0b3JlIixjcmVkZW50aWFsczoic2FtZS1vcmlnaW4iLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiJ9fSk7CiAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PTQwMXx8cmVzcG9uc2Uuc3RhdHVzPT09NDAzKXtsb2NhdGlvbj0iL2xvZ2luIjt0aHJvdyBuZXcgRXJyb3IoItCi0YDQtdCx0YPQtdGC0YHRjyDQv9C+0LLRgtC+0YDQvdGL0Lkg0LLRhdC+0LQiKX0KICAgICAgaWYoIXJlc3BvbnNlLm9rKXRocm93IG5ldyBFcnJvcigiSFRUUCAiK3Jlc3BvbnNlLnN0YXR1cyk7CiAgICAgIGNvbnN0IGRhdGE9YXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICBpZihkYXRhJiZkYXRhLnN0YXR1cyYmZGF0YS5zdGF0dXMhPT0iT0siKXRocm93IG5ldyBFcnJvcihTdHJpbmcoZGF0YS5lcnJvcnx8ZGF0YS5tZXNzYWdlfHxkYXRhLnN0YXR1cykpOwogICAgICBjb25zdCByYXc9QXJyYXkuaXNBcnJheShkYXRhJiZkYXRhLmNhbmRsZXMpP2RhdGEuY2FuZGxlczooZGF0YSYmZGF0YS5yZXN1bHQmJkFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQuY2FuZGxlcyk/ZGF0YS5yZXN1bHQuY2FuZGxlczpbXSk7CiAgICAgIHJldHVybiBub3JtYWxpemVDYW5kbGVzKHJhdyk7CiAgICB9KSgpOwogICAgY2FuZGxlQ2FjaGUuc2V0KHN5bWJvbCx0YXNrKTt0cnl7cmV0dXJuIGF3YWl0IHRhc2t9Y2F0Y2goZXJyb3Ipe2NhbmRsZUNhY2hlLmRlbGV0ZShzeW1ib2wpO3Rocm93IGVycm9yfQogIH07CiAgY29uc3Qgd2lkdGhPZj1ib3g9Pk1hdGgubWF4KDMyMCxNYXRoLmZsb29yKGJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aHx8Ym94LmNsaWVudFdpZHRofHw5MDApKTsKICBjb25zdCB3YWl0TGlicmFyeT1hc3luYygpPT57Zm9yKGxldCBuPTA7bjwxMDA7bisrKXtpZih3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMmJnR5cGVvZiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHMuY3JlYXRlQ2hhcnQ9PT0iZnVuY3Rpb24iKXJldHVybiB3aW5kb3cuTGlnaHR3ZWlnaHRDaGFydHM7YXdhaXQgc2xlZXAoMTAwKX10aHJvdyBuZXcgRXJyb3IoItCb0L7QutCw0LvRjNC90LDRjyDQsdC40LHQu9C40L7RgtC10LrQsCDQs9GA0LDRhNC40LrQvtCyINC90LUg0LfQsNCz0YDRg9C30LjQu9Cw0YHRjCIpfTsKICBjb25zdCBtYWtlU2VyaWVzPShhcGksb3B0aW9ucyk9PntpZihhcGkmJnR5cGVvZiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXM9PT0iZnVuY3Rpb24iKXJldHVybiBhcGkuYWRkQ2FuZGxlc3RpY2tTZXJpZXMob3B0aW9ucyk7aWYoYXBpJiZ0eXBlb2YgYXBpLmFkZFNlcmllcz09PSJmdW5jdGlvbiImJndpbmRvdy5MaWdodHdlaWdodENoYXJ0cyYmd2luZG93LkxpZ2h0d2VpZ2h0Q2hhcnRzLkNhbmRsZXN0aWNrU2VyaWVzKXJldHVybiBhcGkuYWRkU2VyaWVzKHdpbmRvdy5MaWdodHdlaWdodENoYXJ0cy5DYW5kbGVzdGlja1NlcmllcyxvcHRpb25zKTt0aHJvdyBuZXcgRXJyb3IoItCS0LXRgNGB0LjRjyBMaWdodHdlaWdodCBDaGFydHMg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPIil9OwogIGNvbnN0IGVuc3VyZUNoYXJ0PWNhcmQ9PnsKICAgIGlmKGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPT09InJlYWR5IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNoYXJ0cy5nZXQoY2FyZC5kYXRhc2V0LnN5bWJvbCkpOwogICAgaWYoY2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9PT0ibG9hZGluZyImJmNhcmQuX2NoYXJ0UHJvbWlzZSlyZXR1cm4gY2FyZC5fY2hhcnRQcm9taXNlOwogICAgY29uc3Qgc3ltYm9sPWNhcmQuZGF0YXNldC5zeW1ib2wsYm94PWNhcmQucXVlcnlTZWxlY3RvcigiLnR2LXdpZGdldC1zbG90IiksZXJyb3JCb3g9Y2FyZC5xdWVyeVNlbGVjdG9yKCIudHYtY2hhcnQtZXJyb3IiKTsKICAgIGNhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJsb2FkaW5nIjtpZihlcnJvckJveCllcnJvckJveC50ZXh0Q29udGVudD0i0JfQsNCz0YDRg9C30LrQsCDQuNC90YLQtdGA0LDQutGC0LjQstC90L7Qs9C+INCz0YDQsNGE0LjQutCwLi4uIjsKICAgIGNhcmQuX2NoYXJ0UHJvbWlzZT0oYXN5bmMoKT0+e3RyeXsKICAgICAgY29uc3QgW2NhbmRsZXMsbGlicmFyeV09YXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDYW5kbGVzKHN5bWJvbCksd2FpdExpYnJhcnkoKV0pO2F3YWl0IGFmdGVyTGF5b3V0KCk7aWYoIWNhcmQub3Blbil7Y2FyZC5kYXRhc2V0LmNoYXJ0U3RhdGU9ImlkbGUiO3JldHVybiBudWxsfQogICAgICBib3gucmVwbGFjZUNoaWxkcmVuKCk7CiAgICAgIGNvbnN0IGJhY2tncm91bmQ9bGlicmFyeS5Db2xvclR5cGUmJmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkP3t0eXBlOmxpYnJhcnkuQ29sb3JUeXBlLlNvbGlkLGNvbG9yOiIjMDgxODIzIn06e2NvbG9yOiIjMDgxODIzIn07CiAgICAgIGNvbnN0IGFwaT1saWJyYXJ5LmNyZWF0ZUNoYXJ0KGJveCx7d2lkdGg6d2lkdGhPZihib3gpLGhlaWdodDo0MzAsbGF5b3V0OntiYWNrZ3JvdW5kLHRleHRDb2xvcjoiIzhmYTViNiJ9LGdyaWQ6e3ZlcnRMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9LGhvcnpMaW5lczp7Y29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjA4KSJ9fSxyaWdodFByaWNlU2NhbGU6e2JvcmRlckNvbG9yOiJyZ2JhKDE0MywxNjUsMTgyLC4yKSJ9LHRpbWVTY2FsZTp7Ym9yZGVyQ29sb3I6InJnYmEoMTQzLDE2NSwxODIsLjIpIix0aW1lVmlzaWJsZTpmYWxzZSxzZWNvbmRzVmlzaWJsZTpmYWxzZX19KTsKICAgICAgY29uc3Qgc2VyaWVzPW1ha2VTZXJpZXMoYXBpLHt1cENvbG9yOiIjNjNlNmJlIixkb3duQ29sb3I6IiNmZjZiODEiLHdpY2tVcENvbG9yOiIjNjNlNmJlIix3aWNrRG93bkNvbG9yOiIjZmY2YjgxIixib3JkZXJWaXNpYmxlOmZhbHNlLHByaWNlRm9ybWF0Ont0eXBlOiJwcmljZSIscHJlY2lzaW9uOjgsbWluTW92ZTowLjAwMDAwMDAxfX0pOwogICAgICBzZXJpZXMuc2V0RGF0YShjYW5kbGVzKTthcGkudGltZVNjYWxlKCkuZml0Q29udGVudCgpOwogICAgICBjb25zdCByZXNpemU9KCk9Pntjb25zdCB3aWR0aD13aWR0aE9mKGJveCk7aWYod2lkdGg+MClhcGkuYXBwbHlPcHRpb25zKHt3aWR0aH0pfTtjb25zdCBvYnNlcnZlcj10eXBlb2YgUmVzaXplT2JzZXJ2ZXI9PT0iZnVuY3Rpb24iP25ldyBSZXNpemVPYnNlcnZlcihyZXNpemUpOm51bGw7aWYob2JzZXJ2ZXIpb2JzZXJ2ZXIub2JzZXJ2ZShib3gpO2Vsc2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIscmVzaXplKTsKICAgICAgY29uc3QgaW5zdGFuY2U9e3N5bWJvbCxhcGksc2VyaWVzLG9ic2VydmVyLHJlc2l6ZX07Y2hhcnRzLnNldChzeW1ib2wsaW5zdGFuY2UpO2NhcmQuZGF0YXNldC5jaGFydFN0YXRlPSJyZWFkeSI7aWYoZXJyb3JCb3gpZXJyb3JCb3gudGV4dENvbnRlbnQ9IiI7cmV0dXJuIGluc3RhbmNlOwogICAgfWNhdGNoKGVycm9yKXtjYXJkLmRhdGFzZXQuY2hhcnRTdGF0ZT0iZmFsbGJhY2siO2lmKGVycm9yQm94KWVycm9yQm94LnRleHRDb250ZW50PSLQn9C+0LrQsNC30LDQvSDRgdC10YDQstC10YDQvdGL0Lkg0LPRgNCw0YTQuNC6LiDQmNC90YLQtdGA0LDQutGC0LjQstC90YvQuSDRgNC10LbQuNC8OiAiK1N0cmluZyhlcnJvciYmZXJyb3IubWVzc2FnZXx8ZXJyb3IpO2NvbnNvbGUuZXJyb3IoIkdyYW0xIGNoYXJ0IGVycm9yIixzeW1ib2wsZXJyb3IpO3JldHVybiBudWxsfWZpbmFsbHl7Y2FyZC5fY2hhcnRQcm9taXNlPW51bGx9fSkoKTsKICAgIHJldHVybiBjYXJkLl9jaGFydFByb21pc2U7CiAgfTsKICBjb25zdCBzdGFydD1hc3luYygpPT57CiAgICBjb25zdCByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0dkNoYXJ0cyIpO2lmKCFyb290KXJldHVybjsKICAgIHJvb3QuZGF0YXNldC5jaGFydFVpPVZFUlNJT047CiAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGNhcmQ9PntjYXJkLmFkZEV2ZW50TGlzdGVuZXIoInRvZ2dsZSIsKCk9PntpZighY2FyZC5vcGVuKXJldHVybjtyb290LnF1ZXJ5U2VsZWN0b3JBbGwoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW0iKS5mb3JFYWNoKGl0ZW09PntpZihpdGVtIT09Y2FyZClpdGVtLm9wZW49ZmFsc2V9KTtlbnN1cmVDaGFydChjYXJkKX0pfSk7CiAgICBjb25zdCBmaXJzdD1yb290LnF1ZXJ5U2VsZWN0b3IoImRldGFpbHMudHYtYWNjb3JkaW9uLWl0ZW1bb3Blbl0iKXx8cm9vdC5xdWVyeVNlbGVjdG9yKCJkZXRhaWxzLnR2LWFjY29yZGlvbi1pdGVtIik7aWYoZmlyc3Qpe2ZpcnN0Lm9wZW49dHJ1ZTthd2FpdCBhZnRlckxheW91dCgpO2F3YWl0IGVuc3VyZUNoYXJ0KGZpcnN0KX0KICB9OwogIHdpbmRvdy5fX0dSQU0xX0NIQVJUX1VJX1ZFUlNJT05fXz1WRVJTSU9OOwogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0ibG9hZGluZyIpZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsc3RhcnQse29uY2U6dHJ1ZX0pO2Vsc2Ugc3RhcnQoKTsKfSkoKTsK\\\"\\n00407: _GRAM1_CHART_SYMBOLS = {\\\"HBAR\\\", \\\"POL\\\", \\\"AVAX\\\", \\\"LINK\\\"}\\n00408: \\n00409: @app.get(\\\"/vendor/gram1-charts-v4.js\\\", include_in_schema=False)\\n00410: def _gram1_chart_javascript_v4():\\n00411: return _Gram1Response(content=_gram1_base64.b64decode(_GRAM1_CHART_JS_B64), media_type=\\\"application/javascript\\\", headers={\\\"Cache-Control\\\":\\\"no-store\\\"})\\n00412: \\n00413: async def _gram1_chart_data_v4(symbol: str, request: _Gram1Request):\\n00414: fn = globals().get(\\\"klines\\\")\",\"token\":\"/vendor/gram1-charts-v4.js\"}]},\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V38R1-SUDO-PROBE-LINECOUNT-FIX-20260801T124200Z\",\"container_files\":{\"app.py\":[{\"bytes\":32843,\"path\":\"app.py\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},{\"bytes\":32843,\"path\":\"/app/app.py\",\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"}],\"templates/index.html\":[{\"bytes\":29232,\"path\":\"templates/index.html\",\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"},{\"bytes\":29232,\"path\":\"/app/templates/index.html\",\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"}]},\"control_plane_error\":null,\"diagnosis\":[\"ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED\",\"LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART\",\"SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET\",\"LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT\",\"TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER\",\"RUNNING_WEB_CONTAINER_USES_CURRENT_HOST_TEMPLATE\"],\"duration_seconds\":0.171,\"exact_state\":{\"app.py\":{\"bytes\":32843,\"sha256\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\"},\"compose\":{\"path\":\"/opt/stacks/crypto-portfolio/compose.yaml\",\"sha256\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\"},\"templates/index.html\":{\"bytes\":29232,\"sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"},\"worker.py\":{\"bytes\":10300,\"sha256\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"gitea_changed\":false,\"host_container_index_match\":true,\"mutation_outcome\":\"NO_MUTATION\",\"production_site_changed\":false,\"rc\":0,\"repair_plan_constraints\":[\"Do not put the new accordion inside the legacy #chart target.\",\"Choose one rendering pipeline for the visible coin-chart area.\",\"Remove or rewire the stale chart status badge instead of leaving «Нет данных».\",\"Initialize the accordion after DOM creation via external defer script or DOMContentLoaded.\",\"Enforce exactly one open section and verify it in a real DOM engine.\"],\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"status\":\"OK\",\"template_analysis\":{\"chart_elements\":[{\"body_bytes\":1946,\"body_end\":\"
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
\",\"body_sha256\":\"bbc7836d04ccc13777a3aba6fd0502d6f94dd4fd2c8bdbb93e3150c7c7209411\",\"body_start\":\"
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
\",\"contains_no_data\":false,\"details_count\":4,\"line\":6,\"open_details_count\":1,\"open_tag\":\"\",\"server_svg_count\":4}],\"diagnosis\":[\"ACCORDION_INIT_IS_INLINE_AND_NOT_DEFERRED\",\"LEGACY_CHART_RENDERER_STILL_TARGETS_SAME_ID_CHART\",\"SERVER_SVG_ACCORDION_IS_INSIDE_LEGACY_CHART_TARGET\",\"LEGACY_NO_DATA_STATE_TEXT_STILL_EXISTS_IN_JAVASCRIPT\",\"TWO_RENDERING_PIPELINES_CAN_STACK_IN_ONE_CONTAINER\"],\"legacy_chart_scripts\":[{\"body_sha256\":\"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7\",\"chart_refs\":[\"chart.innerHTML\",\"Нет данных\"],\"id\":null,\"index\":0,\"line\":9,\"snippet\":\"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00222: \\n---\\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"src\":null}],\"no_data_occurrences\":[{\"inside_chart\":false,\"inside_script\":true,\"line\":9,\"snippet\":\"00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00004:
https://gram1.ru/

Мой криптопортфель

\\n00005:
Стоимость портфеля
Вложено
Прибыль / убыток0%
Обновление рынкакаждые 5 минут
\\n00006:

График цены

7 дней
Загрузка
HBAR / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
POL / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
AVAX / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период
LINK / USDT
\\\"Свечной
Binance USDT · 1 месяц · весь доступный период

Резкие движения

\\n00007:

Позиции портфеля

Количество и средняя цена покупки
АктивЦенаКапитализацияКоличествоСредняя покупка (USD)ВложеноСейчасP/L
\\n00008:

Новое оповещение

Мои оповещения

\\n00009: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"tvCharts\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"GRAM1_DIRECT_SERVER_V5\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":219,\"snippet\":\"00214: document.querySelectorAll(\\\".currency-btn\\\").forEach(button=>button.addEventListener(\\\"click\\\",()=>setTimeout(redrawForCurrency,0)));\\n00215: })();\\n00216: \\n00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"getElementById(\\\"chart\\\")\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":222,\"snippet\":\"00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"appendChild(\"},{\"inside_chart\":false,\"inside_script\":true,\"line\":222,\"snippet\":\"00217: \\n00218: \\n00219: \\n00220: \\n00221: \\n00222: \",\"token\":\"getElementById(\\\"chart\\\")\"}],\"scripts\":[{\"async\":false,\"body_sha256\":\"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7\",\"chart_refs\":[\"chart.innerHTML\",\"Нет данных\"],\"defer\":false,\"id\":null,\"index\":0,\"line\":9,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"f30846a0a26517bd6e8303d552aeba19887576c54b4a70678e234a5e1f6e7582\",\"chart_refs\":[],\"defer\":false,\"id\":\"ALERT_CREATE_OVERRIDE_V3\",\"index\":1,\"line\":9,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"b6fedba59295891e784ab98cef7690efe81553715d35a9cf6a31c30d08efb5a9\",\"chart_refs\":[\"replaceChildren(\"],\"defer\":false,\"id\":\"ALERT_LIST_RENDERER_V5\",\"index\":2,\"line\":109,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"chart_refs\":[],\"defer\":false,\"id\":null,\"index\":3,\"line\":218,\"src\":\"/vendor/lightweight-charts.js\",\"type\":null},{\"async\":false,\"body_sha256\":\"6f74b154d9dce15511aff93e6f92a28c111d4160f3ed55f11ed33eb5016c8384\",\"chart_refs\":[\"getElementById(\\\"chart\\\")\",\"GRAM1_DIRECT_SERVER_V5\"],\"defer\":false,\"id\":\"GRAM1_CHARTS_DIRECT_VISIBLE_SCRIPT_V5\",\"index\":4,\"line\":219,\"src\":null,\"type\":null},{\"async\":false,\"body_sha256\":\"90a765a83fb8a5a0542dee1abf8c32af0f248aa411aa203848f73758bc3f9b40\",\"chart_refs\":[\"getElementById(\\\"chart\\\")\",\"appendChild(\"],\"defer\":false,\"id\":\"MOVE_CHARTS_TO_BOTTOM_ALLTIME_V1\",\"index\":5,\"line\":222,\"src\":null,\"type\":null}],\"styles\":[{\"body_sha256\":\"3771004bd01fc75eefe9d744e1e53a584c70d396fdb6543c98df7e7626dd007e\",\"id\":\"GRAM1_CHARTS_DIRECT_VISIBLE_STYLE_V5\",\"index\":2,\"line\":217,\"snippet\":\"#chart{display:block!important;margin-top:12px;border:1px solid var(--l);border-radius:16px;overflow:hidden;background:#081823;min-height:56px}#tvCharts{display:none!important}.tv-accordion-item{display:block;border-bottom:1px solid var(--l);background:#081823}.tv-accordion-item:last-child{border-bottom:0}.tv-accordion-head{list-style:none;cursor:pointer;padding:14px 16px;font-weight:800;display:flex;align-items:center;justify-content:space-between;gap:12px;user-select:none}.tv-accordion-head::-webkit-details-marker{display:none}.tv-accordion-chevron{font-size:18px;transition:transform .2s ease}.tv-accordion-item[open] .tv-accordion-chevron{transform:rotate(180deg)}.tv-accordion-body{display:block;border-top:1px solid var(--l)}.tv-server-chart{display:block;width:100%;height:auto;min-height:320px;max-height:430px;object-fit:fill;border:0;background:#081823}.tv-chart-note{min-height:20px;padding:0 14px 12px}@media(max-width:750px){.tv-accordion-head{padding:12px 14px}.tv-server-chart{min-height:260px}}\"}],\"template_bytes\":29232,\"template_sha256\":\"541157608706ebb8d4a415a13ee1d1972947bc5b6cbe26c0eae36b6cabc9b7a5\"}},\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.123,\"identity_count\":null,\"identity_sudo_read_ok\":true,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.121,\"identity_count\":2,\"identity_sudo_read_ok\":true,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n" }